2012-07-26 3 views
-1

난 I은 SQLSERVERcoalesce 함수를 사용 업데이트 만 변경된 값

을 변경 한 테이블의 행을 업데이트하는 프로 시저를 만들었다.

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

    Ricardo,이 업데이트는 항상 실행시 행을 업데이트하겠습니까? @LName이 LastName의 현재 값과 다른 경우에만 수행되도록 업데이트하려면 생성 된 쿼리에 조건을 추가해야합니다. –

    +0

    @Kuba Wyrostek 함수에 'coalesce'라는 변수가 있습니다. 조건을 만들지 않습니다. –

    +0

    아니요, 그렇지 않습니다. LastName 열을 @LName 값 또는 LastName 열의 현재 값으로 업데이트하지만 항상 업데이트 **합니다. –

    답변

    0

    간부의 맥락에서 어떤 변수 @Lname이 없기 때문에 첫 번째가 작동하지 않습니다 작동 기억 - 프로 시저의 범위에만 존재합니다. 당신은 내가 전혀 이런 일을하고 권하고 싶지 않다

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

    하지만

    sp_executesql를 사용하는 대신 간부하여 쿼리의 범위에 전달할 필요가있다.

    +0

    어떻게 할 수 있습니까? 예를들 수 있습니까? –

    +0

    작동하지만 왜 권장하지 않습니까? –

    관련 문제