为什么ISNULL不能用于连接字符串?

问题描述 投票:0回答:2

我试图在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"(命令成功完成)和当前时间(完成时间)。

谁能告诉我为什么这不是我期望的工作方式?

sql sql-server tsql
2个回答
3
投票

的值 @startdatenull. 当你转换一个 null 将datetime值转换为varchar,你会得到(惊喜)。null.

现在,我们采取 null varchar,并将其与其余的字面varchar值连接起来,分配给 @sql. 你猜怎么着:连接 null 与另一个字符串同样产生 null.

价值的全部。@sql 为此 exec() 声明将 null!

这里更好的做法是使用 sq_executesql 并将你的额外数据作为它自己的变量。


3
投票

你没有正确传递参数。你应该使用 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'.

© www.soinside.com 2019 - 2024. All rights reserved.