列标题包含在SQL变量中

时间:2013-09-25 13:26:55

标签: sql sql-server

请参阅下面的DDL:

CREATE TABLE TestTable (id int identity, name varchar(30))
INSERT INTO TestTable (Name) VALUES ('Ian')

declare @Test As varchar(100)
set @Test = 'Name'
SELECT @Test FROM TestTable

SELECT的输出是'Name'。我希望输出为:'Ian'。怎么样?

3 个答案:

答案 0 :(得分:3)

您无法使用变量告诉SQL Server您要使用的列,表,数据库等。您需要在动态SQL中包含此类代码。

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'SELECT ' + QUOTENAME(@Test) + ' FROM dbo.TestTable;';
EXEC sp_executesql @sql;

这就是I prefer sp_executesql instead of EXEC()作为标准最佳做法的原因,这就是you should always use the schema prefix (e.g. dbo.) when referencing objects的原因。在这种情况下,QUOTENAME()有助于保护您免受SQL injection的影响,因为我不知道@Test的价值最终来自何处。

答案 1 :(得分:0)

您可以使用EXEC执行伪造的SQL字符串:

declare @Test As varchar(100)
set @Test = 'Name'
EXEC ('SELECT ' + @Test + ' FROM TestTable')

这些答案的标准警告是确定您可以控制放入SQL语句的内容或使用限制性权限(例如只读)来执行它们,否则您可能会得到类似的内容:

declare @Test As varchar(100)
set @Test = '1 ; DROP TABLE TestTable; --'
EXEC ('SELECT ' + @Test + ' FROM TestTable')

答案 2 :(得分:0)

动态生成字符串并使用exec

EXEC ('SELECT ' + @Test + ' FROM TestTable')