TSQL 变量中包含的列标题



请参阅下面的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 的输出是"名称"。 我希望输出是:"伊恩"。 如何?

不能使用变量来告知 SQL Server 要使用哪个列、表、数据库等。您需要将这种类型的代码包含在动态 SQL 中。

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

这就是为什么我更喜欢sp_executesql而不是EXEC()作为标准的最佳实践,这就是为什么您应该始终使用模式前缀(例如 dbo. ) 引用对象时。 在这种情况下,QUOTENAME()可以帮助保护您免受SQL注入的影响,因为我不知道@Test的价值最终来自哪里。

您可以使用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')

动态生成字符串并使用exec

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

最新更新