2011-05-21 116 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