2011-04-24 45 views
1
SELECT COUNT(Field1_) 
      FROM 
      (
       SELECT Field1_ 
       FROM Table1_ 
       WHERE Field1_= @Field1 
      UNION ALL 
       SELECT Field1_ 
       FROM Table2_ 
       WHERE DeliveryPoint_ = @Field1 
      UNION ALL 
       SELECT Table3_ 
       FROM GasSupplied_ 
       WHERE DeliveryPoint_ = @Field1 
      UNION ALL 
       SELECT Table4_ 
       FROM Gnsnominations_ 
       WHERE DeliveryPoint_ = @Field1 
      UNION ALL 
       SELECT Table5_ 
       FROM HourlyProfileReports_ 
       WHERE DeliveryPoint_ = @Field1 
      ) 

而我有這個代碼的問題。請幫幫我。如何在SQL Server中執行此ORACLE語句?

DECLARE 
       CountedRows NUMBER; 
      BEGIN 
       SELECT COUNT(*) INTO CountedRows 
       FROM Profiles_ 
       WHERE Field1_ = @Param1 AND RowNum < 2; 
       IF(CountedRows > 0) 
       THEN 
        UPDATE Profiles_ 
        SET 
         Field2_ = @Param2, 
         Field3_ = @Param3, 
      Field4_ = @Param4 
         WHERE Field1_ = @Param1; 
       ELSE 
       INSERT INTO Profiles_ 
       (
        Field1_, 
        Field2_, 
        Field3_, 
        Field4_ 
       ) 
       VALUES 
       (
        @Param1, 
        @Param2, 
        @Param3, 
        @Param4     ); 
       END IF; 
       END; 

請幫幫我。我讀了很多書和教程,但我無法理解這一點。

+0

'Field1_'是PK嗎? – 2011-04-24 23:25:26

回答

2

你的第一個需要一個表的別名

SELECT COUNT(Field1_) 
      FROM 
      (
       SELECT Field1_ 
       <snip> 
       WHERE DeliveryPoint_ = @Field1 
      ) AS foo 

你的第二個應該開始

  DECLARE CountedRows int; 


       SELECT CountedRows = COUNT(*) 
       FROM Profiles_ 
       WHERE Field1_ = @Param1 AND RowNum < 2; 

要語法正確。也可以使用END;而不是END IF;但是它會給你一個潛在的競爭條件。因爲你在SQL Server 2008上,你應該查看MERGE做這種UPSERT

據我可以看到整個第二個可以被替換。

MERGE INTO Profiles_ 
USING (VALUES(@Param1_))T(P1) 
ON Field1_ = P1 
WHEN MATCHED THEN 
    UPDATE SET Field2_ = @Param2_, 
      Field3_ = @Param3_, 
      Field4_ = @Param4_ 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT 
    VALUES (P1, @Param2_, @Param3_, @Param4_); 
0

設置命令優於select命令。所以,相反,你應該致敬選擇命令,並將其編碼爲

set countedRows = (SELECT COUNT(*) FROM Profiles_); 
+0

如果您發佈代碼,XML或數據樣本,**請**在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼樣本」按鈕(「{}」)以精確地設置格式並對其進行語法突出顯示! – 2011-04-25 07:44:12