2011-05-21 120 views
0
CREATE PROCEDURE [dbo].[SCD1] AS 
-- SLOWLY CHANGING DIMENSION'S 1 (SCD1) 
-- DROP PROCEDURE SCD1 
-- EXEC SCD1 
SET NOCOUNT ON 
BEGIN 
    --INSERT OF NEW SOURCE VALUES INTO TEMP TABLE 

    SELECT SRC.* INTO #TEMP 
    FROM SRC_CUST SRC 
    LEFT OUTER JOIN DIM_CUST TGT ON SRC.CUSTOMERID = TGT.CUSTOMERID 
    WHERE TGT.CUSTOMERID IS NULL 

    --INSERT RECORDS THAT NEEDS TO BE UPDATED INTO #TEMP1 TABLE 
    SELECT SRC.* INTO #TEMP1 
    FROM SRC_CUST SRC 
    INNER JOIN DIM_CUST TGT ON SRC.CUSTOMERID = TGT.CUSTOMERID 
    WHERE (TGT.COMPANYNAME <> SRC.COMPANYNAME 
     OR TGT.CONTACTNAME <> SRC.CONTACTNAME 
     OR TGT.CONTACTTITLE <> SRC.CONTACTTITLE 
     OR TGT.ADDRESS <> SRC.ADDRESS 
     OR ISNULL(TGT.CITY,'UNK') <> SRC.CITY 
     OR TGT.REGION <> SRC.REGION 
     OR TGT.POSTALCODE <> SRC.POSTALCODE 
     OR TGT.COUNTRY <> SRC.COUNTRY 
     OR TGT.PHONE <> SRC.PHONE 
     OR TGT.FAX <> SRC.FAX) 

    --CHECK FOR THE EXISTENCE OF VALUES IN THE #TEMP TABLE 
    IF EXISTS(SELECT COUNT(1) FROM #TEMP) 
    BEGIN 
     --INSERT NEW RECORDS INTO THE TARGET TABLE 
     INSERT INTO DIM_CUST 
      SELECT SRC.* FROM #TEMP SRC 

     DROP TABLE #TEMP 
     PRINT 'NEW RECORDS INSERTED' 
    END 
    ELSE 
     DROP TABLE #TEMP 

    PRINT 'NO NEW RECORDS TO INSERT'; 

    IF EXISTS(SELECT COUNT(1) FROM #TEMP1) 
    BEGIN 
     --CHECK FOR THE EXISTENCE OF VALUES IN THE #TEMP1 TABLE 
     -- UPDATES THE RECORDS INTO THE TARGET TABLE 
     UPDATE TGT 
     SET TGT.COMPANYNAME = SRC.COMPANYNAME 
      ,TGT.CONTACTNAME = SRC.CONTACTNAME 
      ,TGT.CONTACTTITLE = SRC.CONTACTTITLE 
      ,TGT.ADDRESS = SRC.ADDRESS 
      ,TGT.CITY = SRC.CITY 
      ,TGT.REGION = SRC.REGION 
      ,TGT.POSTALCODE = SRC.POSTALCODE 
      ,TGT.COUNTRY = SRC.COUNTRY 
      ,TGT.PHONE = SRC.PHONE 
      ,TGT.FAX = SRC.FAX 
     FROM DIM_CUST TGT 
     INNER JOIN #TEMP1 SRC ON TGT.CUSTOMERID = SRC.CUSTOMERID 

     DROP TABLE #TEMP1 
     PRINT 'UPDATED RECORDS' 
    END 
    ELSE 
     DROP TABLE #TEMP1 

    PRINT 'NO RECORDS THERE TO UPDATE' 
END 

當我執行這個存儲過程時,我得到的問題是它也進入了else部分,即使if條件滿足。任何人都可以幫助我調試這個存儲過程。這個SQL Server存儲過程有什麼問題。請幫忙

我採取的源表是Northwind數據庫中的Customer表。

謝謝。

+0

源和目標表被創建。 – user338292 2011-05-21 08:17:06

回答

2

有2個問題

你需要開始/結束else子句了。只有DROP被excecuted在ELSE:打印*總是」是這使得它運行就像你報道

... 
ELSE 
BEGIN 
    DROP TABLE #TEMP 
    PRINT 'NO NEW RECORDS TO INSERT'; 
END 

... 
ELSE 
BEGIN 
    DROP TABLE #TEMP1 
    PRINT 'NO RECORDS THERE TO UPDATE' 
END 

其次,這些總是爲真

IF EXISTS(SELECT COUNT(1) FROM #TEMP) 
... 
IF EXISTS(SELECT COUNT(1) FROM #TEMP1) 

所有你需要的是。

IF EXISTS(SELECT * FROM #TEMP) 

看到我這些問題的答案來解釋爲什麼:

+0

非常感謝gbn。 – user338292 2011-05-21 17:53:08