Как я могу сделать это оператор ORACLE в SQL Server? - PullRequest
1 голос
/ 25 апреля 2011
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
           )

И у меня проблемы с этим кодом.Пожалуйста, помогите мне.

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;

Пожалуйста, помогите мне.Я прочитал много книг и учебных пособий, но не могу этого понять.

Ответы [ 2 ]

2 голосов
/ 25 апреля 2011

Вашему первому нужен псевдоним таблицы

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 голосов
/ 25 апреля 2011

Команда Set предпочтительнее команды select.Таким образом, вместо этого вы должны отдать дань уважения команде выбора и кодировать ее как

set countedRows = (SELECT COUNT(*) FROM Profiles_ );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...