#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.