0

我尝试了以下方法:

declare @var2 nvarchar(30)
declare @qsql nvarchar(100)

set @var2 = N'iddelegat'

exec ('select max('+ @var2 + ') as IDexec from delegat');

set @qsql = 'select max(@varsp) as IDspexec from delegat';

exec sp_executesql @qsql, N'@varsp nvarchar(30)', @var2;

结果:

IDexec        IDspexec
-----------------------    
500038       iddelegat

我不明白为什么sp_executesql不返回与EXECUTE. 正确的返回值仅在EXECUTE语句中。似乎sp_executesql没有评估字符串 'iddelegat' 以返回该列。

4

2 回答 2

2

使用时不能参数化列名或表名sp_executesql。因此,当您在 中插入值iddelegatexec(),您将获得该列。当您将它作为 的参数时sp_executesql,您将获得'iddelegat'-- 一个带有列名的字符串。

SQL 文档中没有很好地解释您可以参数化的问题。如果你挖得够远,你会得到这个:

可以在哪里使用参数

您可以使用参数作为文字值的占位符——文本或数值。最常见的是,参数用作单个行或组的搜索条件中的占位符(即,在 SQL 语句的 WHERE 或 HAVING 子句中)。

这是文档的一个不起眼的部分,但它具有正确的总体思路。

为了帮助进一步理解这一点,SQL 引擎可以编译带有参数的查询以获取执行计划。为此,它需要知道查询中的实际列和表。额外的值——参数——可以在编译步骤之后插入。

于 2014-11-08T21:13:35.817 回答
1

您不能参数化列名。

MAX(N'iddelegat')你的尝试和不做 基本一样MAX(iddelegat)

在动态 SQL 中使用它们的唯一方法是将它们直接连接到字符串中。

如果这样做,您应该使用该quotename函数来减轻 SQL 注入的可能性。

请参阅动态 SQL 的诅咒和祝福

于 2014-11-08T21:08:35.043 回答