2011-04-24 106 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