【问题标题】:Using IF statement to check if temporary table has rows in a stored procedure使用 IF 语句检查存储过程中临时表是否有行
【发布时间】:2014-08-06 03:11:34
【问题描述】:

如何在我的存储过程中使用 IF 语句来检查我的临时表是否有行?

我想检查#TempDataTable 是否有行,然后我会根据输出执行两个语句中的任何一个,插入或更新。

我做了以下事情:

BEGIN
    SELECT * 
    INTO #TempDataTable 
    FROM
        (SELECT * 
         FROM BranchNameTable BT 
         LEFT JOIN BranchLocationActivate BLA ON BT.loc_id = BLA.loc_id 
         WHERE BT.Branchloc = 1;) as Q

    if(//TempDataTable has 0 rows)

       INSERT INTO BranchLocationActivate 
       VALUES(//my values)

    ELSE

       UPDATE BranchLocationActivate 
       SET //My values where //my values
END

如何在我的过程中将它放在我的 select 语句之后??

【问题讨论】:

  • 你正在尝试的东西没有意义。临时表可能为空的唯一方法是 BranchNameTable 为空。然而,你然后说如果是这种情况,请将记录添加到 BranchLocationActivate。
  • 您是否将临时表用于该 IF 语句之外的任何内容?

标签: sql sql-server stored-procedures


【解决方案1】:

你可以使用not exists:

if (not exists (select 1 from #tempdataatable))

【讨论】:

  • +1 这将比使用COUNT(*) > 0 在大型临时表上变得非常慢....
  • 当使用这种存在选择时最好SELECT TOP 1 1 FROM 这样执行在第一行之后停止,SELECT 1 FROM 会从每一行给你一个 1,差别不大,但更快更好。
  • @Andrew 。 . .你知道not existsexists 做什么吗?它被称为半连接,这就是半连接的实现方式。
  • 我知道 Gordon,就像我知道 NOT EXISTS (SELECT TOP 1 1 FROM #temptable)NOT EXISTS (SELECT 1 FROM #temptable) 更有效,同时给出相同的最终结果。我已经看到了两者的时间安排。
  • @Andrew 。 . .可以参考一下时间吗?我所看到的一切都表明他们有相同的执行计划。
【解决方案2】:

假设SELECT * INTO #TempDataTableif(//TempDataTable has 0 rows) 之间没有任何SQL 语句,那么你甚至不需要临时表。相反,您应该将测试简化为:

IF (NOT EXISTS(
                SELECT *
                FROM BranchNameTable BT
                LEFT JOIN BranchLocationActivate BLA
                       ON BT.loc_id = BLA.loc_id
                WHERE BT.Branchloc = 1
              )
   )
BEGIN
   INSERT INTO BranchLocationActivate VALUES(//my values)
END;
ELSE
BEGIN
   UPDATE BranchLocationActivate SET //My values where //my values
END;

如果这些部分之间存在使用临时表的语句,那么您可以使用 SQL Server 在 DML 语句之后通过 @@ROWCOUNT 变量为您提供的信息来简化:

DECLARE @RowsInserted INT;

SELECT *
INTO #TempDataTable
FROM BranchNameTable BT
LEFT JOIN BranchLocationActivate BLA
       ON BT.loc_id = BLA.loc_id
WHERE BT.Branchloc = 1;

SET @RowsInserted = @@ROWCOUNT;

-- other statements

IF (@RowsInserted = 0)
BEGIN
   INSERT INTO BranchLocationActivate VALUES(//my values)
END;
ELSE
BEGIN
   UPDATE BranchLocationActivate SET //My values where //my values
END;

【讨论】:

    【解决方案3】:

    您可以继续使用上面 Gordon Linoff 提到的解决方案,或者如果行数可能有帮助/下面是更简单的方法;

    DECLARE @Count AS INT
    Select @Count = count (*) from #tempdataatable
    
    If @Count = 0 
    BEGIN
        ...
    ELSE
        ...
    END
    

    【讨论】:

      猜你喜欢
      • 2013-01-27
      • 1970-01-01
      • 2015-12-11
      • 2013-04-15
      • 2019-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多