2014-12-03 37 views
0

我正在使用如果else语句,并且我想删除创建在内部if语句旁边的临时表,但是当我执行语句时,我得到答案as,数据库中已经有一个名为'#table'的对象。 ---------------------我的代码就像这里输入代码如果其他循环,不能删除相同的临时表

DECLARE @RowCount INT; 

SET @RowCount = 1; 

IF @RowCount = 1 
BEGIN 
    IF OBJECT_ID('tempdb..#Guarantor_Details') IS NOT NULL 
     DROP TABLE #Guarantor_Details 

    SELECT DISTINCT TOP 1 GUARANTORS.GUARANTOR_CODE 
    INTO #Guarantor_Details 
    FROM GUARANTORS 
    WHERE ISNULL(GUARANTORS.deleted, 0) <> 1; 

    DECLARE @GuarantorCount INT; 

    SELECT @GuarantorCount = count(*) 
    FROM #Guarantor_Details; 

    IF (@GuarantorCount = 0) 
     DROP TABLE #Guarantor_Details 

    BEGIN 
     IF OBJECT_ID('tempdb..#Guarantor_Details') IS NOT NULL 
      SELECT TOP 1 CLIENT.Last_Name 
      INTO #Guarantor_Details 
      FROM CLIENT 
      LEFT JOIN GUARANTORS ON GUARANTORS.GUARANTOR_CODE = CLIENT.Financial_Guarantor 
    END 
END 
------------------------------------------------------------------------ 

回答

0

你不需要做这种类型的CREATE/DROP。您可以(也可能应该)在循环之前创建表格,并在必要时重置临时表格TRUNCATE TABLEDELETE FROM以“重置”它。只需选择一个适合GUARANTOR_CODELast_Name的数据类型。

如果您的INSERT操作中的@@ROWCOUNT已具有该值,那么您也不需要在表上执行SELECT COUNT(*)操作。

本质:

CREATE TABLE #Guarantor_Details (Value NVARCHAR(50)); 

WHILE (something) 
BEGIN 

    IF (@RowCount = 1) 
    BEGIN 
    TRUNCATE TABLE #Guarantor_Details; 

    INSERT INTO #Guarantor_Details (Value) 
     SELECT DISTINCT TOP 1 GUARANTORS.GUARANTOR_CODE 
     FROM GUARANTORS 
     WHERE ISNULL(GUARANTORS.deleted, 0) <> 1; 

    IF (@@ROWCOUNT = 0) 
    BEGIN 
     INSERT INTO #Guarantor_Details (Value) 
     SELECT TOP 1 CLIENT.Last_Name 
     FROM CLIENT 
     LEFT JOIN GUARANTORS 
       ON GUARANTORS.GUARANTOR_CODE = CLIENT.Financial_Guarantor; 
    END; 
END; 

FYI,有出现是在原始代码中的一些逻辑问题:在IF @RowCount = 1块的底部

  • 有BEGIN/END标记,不与任何IF或WHILE关联。这在技术上没问题,但通常意味着缺少某些东西。

  • 如果这段代码是所有的代码,那么IF @RowCount = 1在循环中不起作用,除非有什么设置@RowCount超过此外部IF块的末尾,这里没有在问题中显示。