2012-07-26 12 views
-1

我創建了一個存儲過程來僅更新已改變更新僅使用聚結和動態SQL改變的值

我用SQLSERVER​​3210功能的表的行。

CREATE PROCEDURE update_only_changed 

      @FName varchar(50) = NULL, 

      @LName varchar(50) = NULL, 

      @CUST_DB VARCHAR(20) 

AS 

BEGIN 

      DECLARE @QUERY VARCHAR(255) 

      SET @QUERY = 'UPDATE ' + @CUST_DB + '..people SET LastName = COALESCE(@LName, LastName) WHERE id = 1' 

      EXEC (@QUERY) 

END 

GO 

一些考慮

  • 是數據庫的名稱作爲過程的參數傳遞

所以,當一個動態SQL

  • 我運行SQL我有兩種情況:

    • EXEC(@ QUERY)

      I get the error saying: Must declare the scalar variable "@ LName". 
      it does not interpret the variable that the command coalesce 
      
    • EXEC @QUERY (without parentheses)

      I get the error saying: The database 'UPDATE CUSTOMER' does not exist. Make sure the name is spelled correctly. 
      

    我怎樣才能把那個工作?

    記住,如果運行與更新語句靜態的過程,沒有EXEC,它的工作原理

    UPDATE CUSTOMER..people SET LastName = COALESCE(@LName, LastName) WHERE id = 1 
    
  • +1

    裏卡多,你考慮過,這個UPDATE將總是在執行時更新行嗎?如果只想在@LName與LastName的當前值不同時執行更新操作,則需要在構造的查詢中添加附加條件。 – 2012-07-26 14:03:48

    +0

    @Kuba Wyrostek函數'coalesce'對於變量,我不neet做一個條件。 – 2012-07-26 14:23:13

    +0

    不,它沒有。它要麼使用@LName值更新LastName列,要麼更新LastName列的當前值,但它總是**更新。 – 2012-07-26 14:24:51

    回答

    0

    第一個不起作用,因爲沒有在EXEC的情況下沒有變量@Lname - 它只存在於你的程序範圍內。您需要使用sp_executesql代替EXEC

    exec sp_executesql @query, N'@LName varchar(50)', @Lname 
    

    我不建議做任何事情都像這樣把它傳遞到查詢的範圍。

    +0

    我該怎麼做?你能舉個例子嗎? – 2012-07-26 13:54:30

    +0

    工程,但你爲什麼不建議? – 2012-07-26 14:21:54