我试图在SQL Server 14中运行一个存储过程,我需要连接一个字符串并执行它。在这个字符串中,如果参数为空,我想对一列进行选择。但是由于某些原因,使用 ISNULL
的字符串,除了 "Commands completed successfully "之外,什么也不返回。
我创建了一个简单的场景,当我运行这个场景时,我想看到 "Is null "的结果,但我只看到了 "Commands completed successfully "的语句。
declare @startdate datetime = null;
declare @sql nvarchar(1000);
set @sql = '
select isnull('''+convert(varchar,@startdate,101)+''',''Is null'')'
exec(@sql)
当我运行时,我想看到 "Is null "的结果,但我只看到 "Command completed successfully"(命令成功完成)和当前时间(完成时间)。
谁能告诉我为什么这不是我期望的工作方式?
的值 @startdate
是 null
. 当你转换一个 null
将datetime值转换为varchar,你会得到(惊喜)。null
.
现在,我们采取 null
varchar,并将其与其余的字面varchar值连接起来,分配给 @sql
. 你猜怎么着:连接 null
与另一个字符串同样产生 null
.
价值的全部。@sql
为此 exec()
声明将 null
!
这里更好的做法是使用 sq_executesql
并将你的额外数据作为它自己的变量。
你没有正确传递参数。你应该使用 exec sp_executesql
来执行动态查询,并将参数和它的值作为参数传递,像这样。
Consider:
declare @sql nvarchar(1000);
set @sql = N'select isnull(convert(varchar,@startdate,101), ''Is null'')'
exec sp_executesql @sql, N'@startdate datetime', @startdate = null
注意,这可以简化为不使用中间变量来存储参数。
exec sp_executesql
N'select isnull(convert(varchar,@startdate,101), ''Is null'')',
N'@startdate datetime',
@startdate = null
DB Fiddle上的演示 - 两个代码块都产生 'Is null'
.