Sql server 如何在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
@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
字段中没有任何空值。