【问题标题】:Convert Stored procedure result from NULL to 0将存储过程结果从 NULL 转换为 0
【发布时间】:2014-02-27 11:03:13
【问题描述】:

我有一个临时表接受执行存储过程的结果集。我无法更改存储过程。 sp 在某些行中返回空列,但我想在将它们插入临时表时将它们转换为 0。怎么轻松搞定?

我的 SQL 是这样的:

Insert into #temp (co1, co2, co3)
exec sp_xxx

来自 sp_xxx 的 co3 可能为 NULL,但我想将其转换为 0 并存储在 #temp.col3 中

【问题讨论】:

  • 没有什么好的方法可以做到这一点。对于非临时表,您可以使用INSTEAD OF 触发器,但不能在#temp 表上使用。如果您不能更改存储过程,那么最简单的方法可能是添加一个计算列来进行所需的转换并引用它?好吧I suppose you could always use this technique 但似乎完全没有必要。

标签: sql sql-server


【解决方案1】:

试一试,

ISNULL(COLUMN_NAME, 0)

【讨论】:

  • 我这样做了:插入 #temp (co1, co2, ISNULL(co3,0)) exec sp_xxx 得到了不正确的语法错误。
  • 您可以做一件事,在插入#temp 后,从#temp 获取结果作为 SELECT co1,co2,ISNULL(co3,0) AS co3 FROM #temp。让我在这方面进行更多锻炼,如果我得到您的任何要求,我会尽快回复您。
【解决方案2】:
 Insert into #temp (co1, co2, co3);
    exec sp_xxx;

-- 更新列具有空值的值:

  update #temp set col1=isnull(col1,0), col2=isnull(col2,0), col3=isnull(col3,0)
     where (col1 is null) or (col2 is null) or (col3 is null) 

【讨论】:

    【解决方案3】:

    您可以创建具有另外 3 个计算列值的临时表,其值基于您当前的列..

    下面的例子..

    CREATE TABLE #Products 
    (
        ProductID int IDENTITY (1,1) NOT NULL
      , QtyAvailable smallint
      , UnitPrice money
      , InventoryValue AS isnull(QtyAvailable,0)
    )
    
    insert into #Products(QtyAvailable,UnitPrice)
    values (null,10),(20,10)
    
    select * from #Products
    

    在上面的示例中,InventoryValue 是计算列,值是根据 QtyAvailable 值填充的..

    希望对你有帮助!

    【讨论】:

    • 这是一个合理的选择。
    【解决方案4】:

    正如 Vikram 所说,将数据检索到临时表后,您可以相应地更新值。如果只是 column3 可能为空,那么

    UPDATE #temp
    SET col3 = 0 
    WHERE col3 IS NULL
    

    这样就好了。

    否则,当您从临时表中选择回来并稍后使用该信息时,您可以只进行 ISNULL 检查

    SELECT ISNULL(col3, 0)
    FROM #temp
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-08
      • 2023-04-11
      • 1970-01-01
      • 2018-03-07
      相关资源
      最近更新 更多