복붙노트

[SQL] 저장 프로 시저 파라미터리스트의 발현 (예를 들면 함수 호출)의 결과를 이용?

SQL

저장 프로 시저 파라미터리스트의 발현 (예를 들면 함수 호출)의 결과를 이용?

나는 우리의 데이터베이스의 개발을 지원하기 위해 저장 프로 시저를 작성하는 노력하고 있어요,하지만 난 그것을 사용하여 몇 가지 문제가 발생하고있다. 예를 들면 :

DECLARE @pID int;
SET @pID = 1;
EXEC WriteLog 'Component', 'Source', 'Could not find given id: ' + CAST(@pID AS varchar);

이것은 (SQL 2005 Server에서) 오류를 얻을 :

내 구문이 올바르지이며,이 문제를 해결하는 올바른 방법 왜 누군가가 나에게 설명 할 수 있습니까?

해결법

  1. ==============================

    1.당신은 중간 변수를 사용해야합니다. 그것은 몇 년 동안 TODO리스트에있다하지만 SQL Server는 매개 변수 목록에서 자체 운영의이 종류를 지원하지 않습니다! (참조 연결 항목 : 저장 프로 시저 매개 변수로 사용 라 함수)

    당신은 중간 변수를 사용해야합니다. 그것은 몇 년 동안 TODO리스트에있다하지만 SQL Server는 매개 변수 목록에서 자체 운영의이 종류를 지원하지 않습니다! (참조 연결 항목 : 저장 프로 시저 매개 변수로 사용 라 함수)

    EXEC에 대한 문법은

    [ { EXEC | EXECUTE } ]
        { 
          [ @return_status = ]
          { module_name [ ;number ] | @module_name_var } 
            [ [ @parameter = ] { value 
                               | @variable [ OUTPUT ] 
                               | [ DEFAULT ] 
                               }
            ]
          [ ,...n ]
          [ WITH <execute_option> [ ,...n ] ]
        }
    [;]
    

    문서는 현재 값에 대한 허용 형식에 분명 아니지만 같은 리터럴 값이나 (예 : @@ IDENTITY 등) @@ 앞에 둔 시스템 기능으로 전용 "간단한"표현 될 것으로 보인다. 같은 SCOPE_IDENTITY 같은 다른 시스템 기능 ()가 허용되지 않습니다 (심지어 CURRENT_TIMESTAMP와 같은 괄호를 필요로하지 않는 사람들은 허용되지 않습니다).

    그래서 시간 동안 당신은 아래를 같이 사용하는 구문에 필요한 것

    DECLARE @pID INT;
    
    SET @pID = 1;
    
    /*If 2008+ for previous versions this needs to be two separate statements*/
    DECLARE @string VARCHAR(50) = 'Could not find given id: ' + CAST(@pID AS VARCHAR(11))
    
    EXEC WriteLog
      'Component',
      'Source',
      @string 
    
  2. ==============================

    2.

    DECLARE @pID int;
    declare @IdAsString varchar(100)
    
    SET @pID = 1;
    
    Select @IdAsString ='Could not find given id: ' + Cast(@pId as varchar(10))
    
    EXEC WriteLog 'Component', 'Source', @IdAsString
    
  3. ==============================

    3.당신은 저장 프로 시저의 매개 변수에 대한 작업을 할 수 없습니다. 당신은 다른 변수에 그 값을 할당 한 다음 SP에 전달한다.

    당신은 저장 프로 시저의 매개 변수에 대한 작업을 할 수 없습니다. 당신은 다른 변수에 그 값을 할당 한 다음 SP에 전달한다.

    DECLARE @pID int, @nameId VARCHAR(100);
    SET @pID = 1;
    SET @nameId = 'Could not find given id: ' + CAST(@pID AS varchar);
    
    EXEC WriteLog 'Component', 'Source', @nameId
    
  4. ==============================

    4.아마 이런 식으로 뭔가?

    아마 이런 식으로 뭔가?

    DECLARE @pID int;
    SET @pID = 1;
    
    DECLARE @Message NVARCHAR(50);
    
    SET @Message = 'Could not find given id: ' + CAST(@pID AS varchar)
    EXEC WriteLog 'Component', 'Source', @Message;
    
  5. ==============================

    5.대신이 시도 ...

    대신이 시도 ...

    DECLARE @pID int;
    SET @pID = 1;
    
    DECLARE @message varchar(255);
    SET @message = 'Could not find given id: ' + CAST(@pID AS varchar)
    
    EXEC WriteLog 'Component', 'Source', @message;
    
  6. ==============================

    6.DECLARE의 @id의 INT

    DECLARE의 @id의 INT

    SET는 = 10 @id

    SELECT LTRIM (RTRIM (STR (@id))) AS stringValue

  7. ==============================

    7.기본적으로 SQL Server 오류 메시지를 인쇄하려면이 코드를 사용 :

    기본적으로 SQL Server 오류 메시지를 인쇄하려면이 코드를 사용 :

    BEGIN TRY  
        -- Generate a divide-by-zero error.  
        SELECT 1/0;  
    END TRY  
    BEGIN CATCH  
        SELECT  
            ERROR_NUMBER() AS ErrorNumber  
            ,ERROR_SEVERITY() AS ErrorSeverity  
            ,ERROR_STATE() AS ErrorState  
            ,ERROR_PROCEDURE() AS ErrorProcedure  
            ,ERROR_LINE() AS ErrorLine  
            ,ERROR_MESSAGE() AS ErrorMessage;  
    END CATCH;  
    GO  
    

    결과 집합이다.

    Copy
    -----------
    
    (0 row(s) affected)
    
    ErrorNumber ErrorSeverity ErrorState  ErrorProcedure  ErrorLine  ErrorMessage
    ----------- ------------- ----------- --------------- ---------- ----------------------------------
    8134        16            1           NULL            4          Divide by zero error encountered.
    
    (1 row(s) affected)
    
  8. from https://stackoverflow.com/questions/4936180/using-the-result-of-an-expression-e-g-function-call-in-a-stored-procedure-par by cc-by-sa and MIT license