请参阅下面的 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 的输出是“名称”。我希望输出为:'Ian'。如何?
请参阅下面的 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 的输出是“名称”。我希望输出为:'Ian'。如何?
您不能使用变量来告诉 SQL Server 您要使用什么列、表、数据库等。您需要将这种类型的代码包含在动态 SQL 中。
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'SELECT ' + QUOTENAME(@Test) + ' FROM dbo.TestTable;';
EXEC sp_executesql @sql;
这就是为什么我更喜欢sp_executesql
而不是EXEC()
作为标准的最佳实践的原因,这就是为什么在引用 objects 时应该始终使用模式前缀(例如dbo.
) 。QUOTENAME()
在这种情况下可以帮助保护您免受SQL 注入,因为我不知道 for 的值@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')