2015-01-10 10 views
1

Как это правильно записать?SQL Server: создание и вызов хранимой процедуры

Я пишу хранимую процедуру, которая примет (StockName, NewOpenPrice, NewClosePrice), и добавит новую запись в таблицу (показано на рисунке), если имя запаса не EXIST. Если имя файла EXIST, то OpenPrice и ClosePrice будут обновлены новыми ценами. Наконец, я хочу вызвать хранимую процедуру

Это то, что она выглядит сейчас

CREATE PROCEDURE p_updatestock 
    (
    @StockName VARCHAR(50), 
    @OpenPrice MONEY, 
    @ClosePrice MONEY) 
AS 
    Declare @NewOpenPrice MONEY 
    Declare @NewClosePrice MONEY 

    UPDATE Stocks 
    SET StockName = @StockName 
    SET @StockName = @rowcount 

    UPDATE Stocks 
    SET NewOpenPrice = @NewOpenPrice 
    WHERE OpenPrice = @NewOpenPrice 
    SET @NewOpenPrice = @rowcount 

    IF (@StockName EXIST THEN OpenPrice) 
     UPDATE Stocks 
     SET NewClosePrice = @NewClosePrice 
     WHERE ClosePrice = @NewClosePrice 
     SET @NewClosePrice = @rowcount 

     IF (@StockName EXIST THEN ClosePrice) 

enter image description here

ответ

2

Я думаю, что это то, что вам нужно

CREATE PROCEDURE P_updatestock (@StockName VARCHAR(50), 
           @OpenPrice MONEY, 
           @ClosePrice MONEY) 
AS 
    BEGIN 
     IF EXISTS (SELECT 1 
       FROM Stocks 
       WHERE StockName = @StockName) 
     UPDATE Stocks 
     SET ClosePrice = @ClosePrice, 
       Openprice = @Openprice 
     WHERE StockName = @StockName 
     ELSE 
     INSERT INTO stocks 
        (StockName, 
        Openprice, 
        ClosePrice) 
     VALUES  (@StockName, 
        @Openprice, 
        @ClosePrice) 
    END 

Или использовать Merge вместо If-Else

MERGE Stocks AS target 
USING (SELECT @StockName, 
       @OpenPrice, 
       @ClosePrice) AS source (StockName, OpenPrice, ClosePrice) 
ON (target.StockName = source.StockName) 
WHEN MATCHED THEN 
    UPDATE SET ClosePrice = source.ClosePrice, 
      Openprice = source.Openprice 
WHEN NOT MATCHED THEN 
    INSERT (StockName, 
      Openprice, 
      ClosePrice) 
    VALUES (source.StockName, 
      source.Openprice, 
      source.closeprice) 

Для выполнения

exec P_updatestock 'PFE',22.34,32.45 
+0

WOW! СПАСИБО NoDisplayName. Позвольте мне запустить его и посмотреть. Как мне это назвать? – Exceli

+0

@Exceli - обновлено –

+0

Получено сообщение об ошибкеMsg 137, уровень 15, состояние 2, процедура P_updatespock, строка 10 Должен объявить скалярную переменную «@NewClosePrice». Msg 137, уровень 15, состояние 2, процедура P_updatespock, строка 19 Должен объявить скалярную переменную «@NewOpenprice». – Exceli

Смежные вопросы