Ответ 1
DECLARE @MyTableName nvarchar(20);
DECLARE @DynamicSQL nvarchar(1000);
SET @MyTableName = "FooTable";
SET @DynamicSQL = N'SELECT * INTO ' + @MyTableName + ' FROM BarTable';
EXEC(@DynamicSQL);
Я хочу создать резервные таблицы SQL с именами переменных.
что-то вдоль линий
DECLARE @SQLTable Varchar(20)
SET @SQLTable = 'SomeTableName' + ' ' + '20100526'
SELECT * INTO quotename(@SQLTable)
FROM SomeTableName
но я получаю
Неверный синтаксис рядом с '@SQLTable'.
Это просто часть небольшого script для поддержания, поэтому мне не нужно беспокоиться об инъекциях.
DECLARE @MyTableName nvarchar(20);
DECLARE @DynamicSQL nvarchar(1000);
SET @MyTableName = "FooTable";
SET @DynamicSQL = N'SELECT * INTO ' + @MyTableName + ' FROM BarTable';
EXEC(@DynamicSQL);
К сожалению, вы не можете использовать переменные связывания для имен таблиц, имен столбцов и т.д. В этом случае вы должны создать динамический SQL и использовать exec
.
DECLARE @Script NVARCHAR(MAX);
SET @Script = N'SELECT * INTO SomeTableName_' + N'20100526' + N' FROM SomeTableName';
EXEC sp_executesql @Script
Я оставил дату отдельной, поскольку я предполагаю, что вы хотите вычислить ее для каждого прогона.
Вы должны изучить синонимы:
- Создайте синоним таблицы Product в AdventureWorks2008R2. CREATE SYNONYM MyProduct FOR AdventureWorks2008R2.Production.Product; GO
- Запросить таблицу продуктов, используя синоним. USE tempdb; ИДТИ SELECT ProductID, Name FROM MyProduct WHERE ProductID < 5; GO
DECLARE @MyTableName nvarchar(20);
DECLARE @DynamicSQL nvarchar(1000);
SET @MyTableName = "FooTable";
SET @DynamicSQL = N'SELECT * INTO ' + @MyTableName + ' FROM BarTable';
exec @DynamicSQL;
этот запрос правильный, но просто используйте одиночную кавычку в ( "FooTable" ) = "FooTable"