Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在SQL Server中处理动态查询中的空值?_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql server 如何在SQL Server中处理动态查询中的空值?

Sql server 如何在SQL Server中处理动态查询中的空值?,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我想在SQL Server过程中动态管理空值。我准备了以下演示,其中假定@userid是存储过程的输入参数 declare @userID int =null declare @suerid varchar(100)=@userid select cast(@userID as nvarchar(100)) declare @sql nvarchar(2000) set @sql ='select * from users where userid=isnull('+@suerid+',@s

我想在SQL Server过程中动态管理空值。我准备了以下演示,其中假定
@userid
是存储过程的输入参数

declare @userID  int =null
declare @suerid varchar(100)=@userid
select cast(@userID as nvarchar(100))

declare @sql nvarchar(2000)
set @sql ='select * from users where userid=isnull('+@suerid+',@suerid)'
print @sql 
EXECUTE sp_executesql @sql
当我在
@userid
中传递有效整数值时,它会给出所需的输出,但当我试图传递
@userid=NULL
时,它不会给出任何输出。我想要
传递
@userid=NULL

您真的需要动态sql查询吗?动态sql执行起来既慢又慢,我建议尽可能避免它,即使这意味着要编写更多的代码。
如果必须使用动态sql,请尝试以下操作:

set @sql ='select * 
           from users 
           where userid = isnull('+ COALESCE(@suerid, 'null') +',@suerid)'

将空值连接到字符串时,整个字符串将变为空。

也许这就是您想要的:

DECLARE @userID int
DECLARE @sql nvarchar(2000)
SET @sql = N'SELECT * FROM users WHERE ' + CASE WHEN @userID IS NULL THEN 'userid IS NULL' ELSE 'userid = @userId' END
EXEC sp_executesql @sql, '@userId int', @userID
编辑:

如果您获得
NULL
作为输入,并希望返回所有用户:

DECLARE @userID int
DECLARE @sql nvarchar(2000)
SET @sql = N'SELECT * FROM users WHERE (userid = @userId or @userId is null)'
EXEC sp_executesql @sql, '@userId int', @userID
编辑:

或者更简单一些:

DECLARE @userID int
SELECT * FROM users WHERE (userid = @userId or @userId is null)

首先在这一行:

SET @sql = 'SELECT * FROM users WHERE userid = ISNULL(' + @suerid + ', @suerid)'
您将出现语法错误,因为您的
@suerid
未在
@sql
中声明,因此您应该有以下内容:

SET @sql = 'SELECT * FROM users WHERE userid = ' + ISNULL(@suerid, 0)
如果您想在输入参数为NULL时返回一行
NULL
s,我建议您使用以下语法:

SET @sql = 'SELECT u.* ' +
           'FROM users u ' +
             'RIGHT JOIN ' +
                '(SELECT ' + ISNULL(@suerid, 'NULL') + ' AS ID) N ' +
             'ON u.userid = N.ID ' +
           'WHERE ISNULL(u.userid, -1) = ' + ISNULL(@suerid, '-1')

这根本无效,SQL字符串中的
@suerid
超出了
sp_executesql
语句的范围,将出错
@userID
根本不在SQL字符串中,
isnull(“+@suerid+”,@suerid)
没有意义……如果将null与任何内容进行比较,则结果总是false。“亚历克斯”有权利。给定的示例无效。这是一个很好的观点,但我认为当我认为它是PK;)时,
userId
字段中没有任何空值。