使用合并和动态SQL仅更新已更改的值

时间:2012-07-26 13:51:29

标签: sql-server coalesce

我创建了一个存储过程来仅更新已更改的表的行

我使用了 SQLSERVER coalesce函数。

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.
    

我怎么能把它用于工作?

请记住,如果运行带有update语句的过程静态,没有EXEC,则可以正常运行

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

1 个答案:

答案 0 :(得分:0)

第一个不起作用,因为在exec的上下文中没有变量@Lname - 它只存在于过程的作用域中。您需要使用sp_executesql而不是exec

将其传递到查询范围
exec sp_executesql @query, N'@LName varchar(50)', @Lname

<强> BUT

我不建议像这样做任何事情。