2015-08-19 142 views
0

我有兩個表中車輛和車輛返回(它在代碼拼寫錯誤)搜索,我試圖創建一個存儲過程,我可以輸入發動機號,它會通過搜索車輛及車輛的回報,看它是否對發動機號,它是在任的作品是如果發動機號碼不在這裏任何表的表,但每一次唯一的條件匹配的是我的代碼通過多個表,並存儲過程

create procedure outbound 
(
    @eng varchar(25) 
) 
AS 
BEGIN 
    BEGIN TRAN 
    DECLARE @eng_num VARCHAR(25) 
    DECLARE @eng_num2 VARCHAR(25) 


/* SELECT @eng_num= Engine_num from Vehicle where [email protected] and Status=1 
    SELECT @eng_num2= Engine_num from Vehicle_retuns where [email protected] 

    IF(@[email protected]_num) 
    begin 
     UPDATE Vehicle SET Description_of_Vehicle='Vehicle has ben sent to Manufactory',Status=0 where [email protected]_num 
    end 
    ELSE IF(@[email protected]_num2) 
    begin 
     UPDATE Vehicle_retuns SET purpose='Vehicle has ben sent to Manufactory',Status=0 where [email protected]_num2 
    end*/ the lines of code that is the error is occuring 
    ELSE 
    SELECT 'No such Engine number was found' 

    IF(@@ERROR<>0) 
    BEGIN 
    SELECT 'An unexpected error has occur' 
    ROLLBACK TRANSACTION  
    RETURN -1 
    END 
    COMMIT TRANSACTION 
END 
+2

你嘗試過什麼? SO不是免費的調試服務。你的帖子基本上是「這是我的代碼,爲什麼它不工作?」。您可能想看看這篇文章。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+0

但是我說,只有其他工作兩個if語句的上方沒有關係't works – Deezy

+0

「不起作用」是一個可怕的描述。你是否告訴機械師你的車壞了,或者你的醫生說你身體的某個部位不舒服? –

回答

0

這裏是什麼,我想可能是這裏需要一個粗略的草圖。沒有必要爲單個更新使用顯式事務。另外,我強烈建議你看看規範化你的消息,而不是在任何地方對這些長字符串進行硬編碼。不確定你是否真的想要根據狀態的值設置描述或用途列。我寧願看到這些是查找值的外鍵,但也許這在這裏不起作用。我還建議你不要使用像「狀態」這樣的列名。使用保留字是有問題的,原因有很多。最後但並非最不重要的是,您應該使用try/catch塊而不是檢查@@ ERROR。

- 編輯 - 下面是一些新的代碼來處理的事實,你真的需要兩個更新。我最初錯過了這個。

create procedure outbound 
(
    @eng varchar(25) 
) 
AS 
BEGIN 
    IF EXISTS 
    (
     SELECT Engine_num 
     from Vehicle 
     where Engine_num = @eng 

     UNION ALL 

     SELECT Engine_num 
     from Vehicle_retuns 
     where Engine_num = @eng 
    ) 
    BEGIN 
     BEGIN TRY 
      BEGIN TRANSACTION 

      UPDATE Vehicle 
       SET Description_of_Vehicle = 'Vehicle has ben sent to Manufactory' 
        , Status = 0 
       where Engine_num = @eng 
        AND Status = 1 


      UPDATE Vehicle_retuns 
       SET purpose = 'Vehicle has ben sent to Manufactory' 
        , Status = 0 
       where Engine_num = @eng 

      COMMIT TRANSACTION 
     END TRY 
     BEGIN CATCH 
      SELECT 'An unexpected error has occurred.' 
      --I would prefer a message here including the error message and error number instead of just "It failed". 
     END CATCH 
    END  

    ELSE 
     SELECT 'No such Engine number was found' 
END 
+0

您錯過了有兩個表的事實:'Vehicle'和'Vehicle_retuns'。不過,我認爲你的解決方案可以適應工作,但是你需要第二個'UPDATE'語句,當第一個語句具有'@@ ROWCOUNT = 0'時執行。 – jmc

+0

啊,錯過了。謝謝@jmc。在這種情況下,您可能想要放回事務並將其作爲兩個更新語句來執行。大概會注意到,如果我們有一些工作,而不是盲目的。 –

+0

感謝這項工程 – Deezy