Как я могу использовать объявленную переменную в качестве цели INTO?

#sql #sql-server

#sql #sql-сервер

Вопрос:

Переменная @BACKUP_TABLE_NAME может использоваться при запросе INFORMATION_SCHEMA .ТАБЛИЦЫ.

Но я хочу использовать полную переменную @FQP_BACKUP_TABLE в качестве цели предложения INTO .

Как я могу использовать переменную в предложении INTO?

 USE THE_DATABASE;

-- Real table = 'THE_TABLE'
-- Backup table = 'BACKUP_TABLE'

DECLARE @BACKUP_TABLE_NAME VARCHAR(64) = 'BACKUP_TABLE';
DECLARE @FQP_BACKUP_TABLE VARCHAR(128) = 'THE_BACKUP_DATABASE.dbo.'   @BACKUP_TABLE_NAME

IF EXISTS (SELECT 1
FROM THE_BACKUP_DATABASE.INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = @BACKUP_TABLE_NAME)
BEGIN
    -- Backup table already exists. Do not overwrite it.
    PRINT 'ERROR: Backup table '   @BACKUP_TABLE_NAME   ' already exists.'
    RAISERROR('ERROR: Cannot overwrite existing backup table.', 18, -1)
END
ELSE
BEGIN
    -- Backup table does not exist. Create it.
    SELECT *
    INTO THE_BACKUP_DATABASE.dbo.BACKUP_TABLE
    --INTO @FQP_BACKUP_TABLE    -- NEVER WORKS
    FROM THE_DATABASE.dbo.THE_TABLE;
END;
  

Комментарии:

1. SQL Server не поддерживает подстановку макросов. Для этого вам придется использовать динамический SQL.

2. @JohnCappelletti, @BACKUP_TABLE_NAME похоже, работает в тесте INFORMATION_SCHEMA. ТАБЛИЦЫ. Это считается «динамическим SQL?»

3. Чтобы ответить на ваш вопрос… Нет. Это будет переменная. Смотрите Ответ ниже для примера динамического SQL.

Ответ №1:

Вы можете обернуть окончательную вставку в динамический оператор SQL.

Пример

 ...
BEGIN
    Declare @SQL varchar(max) = '
    SELECT *
    INTO '  @FQP_BACKUP_TABLE  '
    FROM THE_DATABASE.dbo.THE_TABLE;'

    Exec(@SQL)        
    
END;
  

Комментарии:

1. Или используйте sp_executesql.