我想使用变量名创建备份SQL表。
的内容
DECLARE @SQLTable Varchar(20)
SET @SQLTable = 'SomeTableName' + ' ' + '20100526'
SELECT * INTO quotename(@SQLTable)
FROM SomeTableName
但我正在
'@SQLTable'附近的语法不正确。
这只是维护小脚本的一部分所以我不必担心注射。
答案 0 :(得分:16)
DECLARE @MyTableName nvarchar(20);
DECLARE @DynamicSQL nvarchar(1000);
SET @MyTableName = "FooTable";
SET @DynamicSQL = N'SELECT * INTO ' + @MyTableName + ' FROM BarTable';
EXEC(@DynamicSQL);
答案 1 :(得分:6)
不幸的是,您不能对表名,列名等使用绑定变量。在这种情况下,您必须生成动态SQL并使用exec
。
答案 2 :(得分:4)
DECLARE @Script NVARCHAR(MAX);
SET @Script = N'SELECT * INTO SomeTableName_' + N'20100526' + N' FROM SomeTableName';
EXEC sp_executesql @Script
我将日期分开,因为我假设您想为每次运行计算它。
答案 3 :(得分:4)
您应该考虑使用同义词:
- 在AdventureWorks2008R2中为Product表创建一个同义词。 创建SYNONYM MyProduct FOR AdventureWorks2008R2.Production.Product; GO
- 使用同义词查询Product表。 使用tempdb; 走 SELECT ProductID,Name 来自MyProduct WHERE ProductID< 5; GO
答案 4 :(得分:0)
DECLARE @MyTableName nvarchar(20);
DECLARE @DynamicSQL nvarchar(1000);
SET @MyTableName = "FooTable";
SET @DynamicSQL = N'SELECT * INTO ' + @MyTableName + ' FROM BarTable';
exec @DynamicSQL;
这个查询是正确的但只是在(“FooTable”)='FooTable'
上使用单引号