使用IF语句检查临时表是否在存储过程中有行

时间:2014-08-06 03:11:35

标签: sql sql-server stored-procedures

如何在存储过程中使用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语句之后?

3 个答案:

答案 0 :(得分:29)

您可以使用not exists

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

答案 1 :(得分:3)

假设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已经通过@@ROWCOUNT变量在DML语句之后提供的信息来简化:

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;

答案 2 :(得分:1)

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

DECLARE @Count AS INT
Select @Count = count (*) from #tempdataatable

If @Count = 0 
BEGIN
    ...
ELSE
    ...
END