【问题标题】:Returning NULL data values while using an SP_ExecuteSQL使用 SP_ExecuteSQL 时返回 NULL 数据值
【发布时间】:2013-03-16 10:55:20
【问题描述】:

我正在使用 sp_executesql,因此我可以灵活选择返回的内容。尝试返回没有数据的地方时遇到问题。

例如,我正在尝试查找没有分配所有者的所有行。目前,我的查询编写如下。

 if @owner <> ''
    Begin
        SELECT @sql = @sql + 'and owner LIKE ''%'+@owner+'%'''
    END

这使我不必选择所有者。如果我这样做了,它当然会包含在我的查询中。

因为我现在正在尝试添加一条基本上允许我带回未分配所有者的行:

 if @owner = 'Unassigned'
BEGIN
    SELECT @sql = @sql + 'and owner IS NULL' 
END

但是,当我这样做时,它会带回整个列表。想法/建议?

【问题讨论】:

  • 发布整个 sql 比能弄明白
  • 你能打印出@sql(而不是执行它)并发布结果吗?即使您必须更改表名和字段名?
  • 我去掉了很多其他不必要的脚本,但是除了我发布的两个之外,还有更多的IF。我这样做是出于审美目的。
  • 您是否在搜索 if owner = 'Unassigned' .... ELSE if owner '' ....(我不得不删除 @ 因为评论只允许一个)
  • 可能是它在两种情况下都输入...所有者 = 未分配,所有者是 '' ????并且您选择了 owner = 'unassigned' 并且如果 owner = 'Unassigned' ....它们是大写的和非大写的

标签: sql sql-server null dynamic-sql sp-executesql


【解决方案1】:

您也可以使用带有CASE 表达式的选项

SELECT @sql = @sql + CASE ISNULL(@owner, '') 
                       WHEN '' THEN ''
                       WHEN 'Unassigned' THEN ' and owner IS NULL'
                       ELSE ' and owner LIKE ''%' + @owner + '%''' END

【讨论】:

    【解决方案2】:

    如果您将最后一行更改为PRINT @sql,您会注意到这两个条件都存在。尝试将您的代码更改为此。

    if @owner <> ''
    Begin
        if @owner = 'Unassigned'
            SELECT @sql = @sql + 'and owner IS NULL'
        else
            SELECT @sql = @sql + 'and owner LIKE ''%'+@owner+'%'''
    END
    

    【讨论】:

    • 你完全正确。我把它们写成两个不同的 IF 语句,而我应该做上面的。非常感谢!
    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多