【问题标题】:SQL- Null results not returning for select statement when executed with variable = null, but does when hardcodedSQL-当使用variable = null执行时,选择语句不会返回空结果,但在硬编码时会返回
【发布时间】:2015-07-02 21:58:00
【问题描述】:

我有一个返回列表的存储过程。变量 IS2000PolicyNo 可以从 tblQuote 获得 Null 结果。 这是一个简化的 sn-p,仅显示导致问题的变量。

@IS2000PolicyNo	int,

   IF @IS2000PolicyNo = -1 
SET @IS2000PolicyNo = NULL	
	
   BEGIN TRY
SELECT
	List= replace(	(  SELECT top 500 
                        cast(ISNULL(T.IS2000PolicyNo,'') as varchar)  + ';'
  FROM
	(SELECT DISTINCT
      Q.IS2000PolicyNo
  	FROM
	dbo.tblQuote	Q
  WHERE
  cast(isnull(Q.IS2000PolicyNo,'')as varchar)  LIKE '%'+ CAST(ISNULL(@IS2000PolicyNo,'')as varchar) + '%'	)

我执行传递-1的过程,IF语句将其转换为null,这应该返回所有记录,但它跳过了IS2000PolicyNo为null值的记录。 当我在 Where 语句中硬编码以使 @IS2000PolicyNo 等于 null 时,它会返回包括 null 在内的所有记录。

WHERE
  cast(isnull(Q.IS2000PolicyNo,'')as varchar)  LIKE '%'+ CAST(ISNULL(null,'')as varchar + '%')

我也试过只设置@IS2000PolicyNo = null 而不是 If 语句,它不返回空值。

我已经单步执行了代码,它正确地将 If 语句中的字段转换为空白。

谢谢!

【问题讨论】:

  • 看起来像 SQL Server?请标记使用的产品(这样您就可以得到最大的关注!)
  • 你能把你的问题缩小到唯一的问题区域吗?对于 NULL,我们使用 IS NULL,我不确定您是否正在使用它。顺便提一下。
  • "我在 where 语句中硬编码了 'null'" 等等,你的意思是你使用了'%'+ CAST(ISNULL(NULL,'')as varchar) + '%' 还是你使用了'%'+ CAST(ISNULL('NULL','')as varchar) + '%'?

标签: sql sql-server select null


【解决方案1】:

在 SQL Server 中,ISNULL 将输出转换为与输入相同的数据类型。由于您的参数是 INT,因此返回类型是 INT。在它返回 0 时查看它的实际效果:

declare @foo as int;
set @foo = null;
select ISNULL(@foo,'');

要解决此问题,您应该将该参数强制转换为 ISNULL 检查内部的 VARCHAR,而不是外部。

或者,使用 ANSI 标准 COALESCE 而不是 ISNULL,您将不会遇到此问题。 A good explanation is here,具体来说:

COALESCE 和 ISNULL 在确定数据类型的方式上有所不同 结果表达式。

COALESCE 表达式的数据类型是输入的数据类型 具有最高数据类型优先级的参数。如果所有输入都是 无类型的 NULL 文字,你会得到一个错误。

ISNULL 表达式的数据类型是第一个的数据类型 输入。如果第一个输入是无类型的 NULL 文字,则数据类型 结果是第二个输入的类型。如果两个输入都是 无类型文字,输出的类型是 INT。

我最后的想法是,如果在整个查询过程中将参数重新转换为 VARCHAR,为什么参数是 INT?您可以通过将参数的数据类型更改为 VARCHAR 来解决问题并可能获得更快的速度。

【讨论】:

  • 感谢大家的帮助!我已经改变了它,所以它在整个过程中都使用了 varchar。这是问题的一部分,然后我还必须使用 Nz(policyno,"") 以便它显示在前端。
【解决方案2】:

我猜问题出在这一行:

cast(isnull(Q.IS2000PolicyNo,'')as varchar) LIKE '%' + CAST(ISNULL(@IS2000PolicyNo,'')as varchar) + '%'

这是高度可疑的:

  • 为什么将值存储为整数但比较为字符串?
  • 为什么varchar() 没有长度? (非常危险的做法,但不是这里的问题。)
  • 当你传入-1,而不是NULL时,你期望会发生什么?

一种可能性是作为ints 进行比较。遵循逻辑有点困难,但这可能就足够了:

((Q.IS2000PolicyNo = @IS2000PolicyNo) or coalesce(@IS2000PolicyNo, -1) = -1))

或许:

((Q.IS2000PolicyNo = '%' + cast(@IS2000PolicyNo as varchar(255)) + '%') or
 (coalesce(@IS2000PolicyNo, -1) = -1))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 2014-01-15
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多