programing

선택 쿼리 내에서 저장 프로시저를 실행하는 방법

javamemo 2023. 7. 9. 09:31
반응형

선택 쿼리 내에서 저장 프로시저를 실행하는 방법

SELECT col1,
       col2,
       col3,

EXEC GetAIntFromStoredProc(T.col1) AS col4
     FROM Tbl AS T
     WHERE (col2 = @parm) 

SQL Server 2008에서 이 SQL 쿼리를 작성하는 방법은 무엇입니까?

감사합니다 @ 두 발 달린 말.

여기 해결책이 있습니다.

  1. 처음에 우리는 함수를 만들었습니다.

    CREATE FUNCTION GetAIntFromStoredProc(@parm Nvarchar(50)) RETURNS INTEGER
    
    AS
    BEGIN
       DECLARE @id INTEGER
    
       set @id= (select TOP(1) id From tbl where col=@parm)
    
       RETURN @id
    END
    
  2. 그런 다음 선택 쿼리를 수행합니다.

    Select col1, col2, col3,
    GetAIntFromStoredProc(T.col1) As col4
    From Tbl as T
    Where col2=@parm
    

기능은 선택 루프 내에서 호출하기 쉽지만 삽입, 업데이트, 삭제 등을 실행할 수 없습니다.쿼리는 쿼리 작업에만 유용합니다.데이터를 조작하려면 저장 프로시저가 필요합니다.

따라서 이 질문에 대한 진정한 대답은 "커서"를 통해 선택한 문의 결과를 반복하고 해당 루프 내에서 절차를 호출해야 한다는 것입니다.다음은 예입니다.

DECLARE @myId int;
DECLARE @myName nvarchar(60);
DECLARE myCursor CURSOR FORWARD_ONLY FOR
    SELECT Id, Name FROM SomeTable;
OPEN myCursor;
FETCH NEXT FROM myCursor INTO @myId, @myName;
WHILE @@FETCH_STATUS = 0 BEGIN
    EXECUTE dbo.myCustomProcedure @myId, @myName;
    FETCH NEXT FROM myCursor INTO @myId, @myName;
END;
CLOSE myCursor;
DEALLOCATE myCursor;

참고:@@FETCH_STATUS는 업데이트되는 표준 변수입니다.여기에 있는 나머지 개체 이름은 사용자 지정입니다.

proc 출력과 일치하는 temp table을 생성하고 이 테이블에 삽입할 수 있습니다.

CREATE TABLE #Temp (
    Col1 INT
)

INSERT INTO #Temp
    EXEC MyProc

"가능하지 않습니다.저장 프로시저 대신 함수를 사용할 수 있습니다.

저장 프로시저에서 INSERT 또는 UPDATE 문을 수행하지 않는 한 이 문을 함수로 만들기를 원할 수 있습니다.

저장 프로시저는 외부 프로그램에 의해 실행되거나 시간 간격에 따라 실행됩니다.

여기서의 답변은 제가 할 수 있는 것보다 더 잘 설명해 줄 것입니다.

기능 대.SQL Server의 저장 프로시저

"가능하지 않습니다.이 쿼리를 사용하여 이 작업을 수행할 수 있습니다.여기서 초기화

declare @sql nvarchar(4000)=''

매개 변수를 사용하여 SP의 Value & exec 명령 설정

SET @sql += ' Exec spName @param'
EXECUTE sp_executesql @sql,  N'@param type', @param = @param

SP를 일회성 쿼리로 사용하여 무언가를 빠르게 확인하려면 SP의 내부를 꺼내어 새 쿼리 창에 붙여넣고 더 이상 SP가 아니기 때문에 원하는 작업을 수행하기만 하면 됩니다.

동적 뷰를 생성하여 결과를 얻습니다.

CREATE PROCEDURE dbo.usp_userwise_columns_value
(
    @userid BIGINT
)
AS 
BEGIN
        DECLARE @maincmd NVARCHAR(max);
        DECLARE @columnlist NVARCHAR(max);
        DECLARE @columnname VARCHAR(150);
        DECLARE @nickname VARCHAR(50);

        SET @maincmd = '';
        SET @columnname = '';
        SET @columnlist = '';
        SET @nickname = '';

        DECLARE CUR_COLUMNLIST CURSOR FAST_FORWARD
        FOR
            SELECT columnname , nickname
            FROM dbo.v_userwise_columns 
            WHERE userid = @userid

        OPEN CUR_COLUMNLIST
        IF @@ERROR <> 0
            BEGIN
                ROLLBACK
                RETURN
            END   

        FETCH NEXT FROM CUR_COLUMNLIST
        INTO @columnname, @nickname

        WHILE @@FETCH_STATUS = 0
            BEGIN
                SET @columnlist = @columnlist + @columnname + ','

                FETCH NEXT FROM CUR_COLUMNLIST
                INTO @columnname, @nickname
            END
        CLOSE CUR_COLUMNLIST
        DEALLOCATE CUR_COLUMNLIST  

        IF NOT EXISTS (SELECT * FROM sys.views WHERE name = 'v_userwise_columns_value')
            BEGIN
                SET @maincmd = 'CREATE VIEW dbo.v_userwise_columns_value AS SELECT sjoid, CONVERT(BIGINT, ' + CONVERT(VARCHAR(10), @userid) + ') as userid , ' 
                            + CHAR(39) + @nickname + CHAR(39) + ' as nickname, ' 
                            + @columnlist + ' compcode FROM dbo.SJOTran '
            END
        ELSE
            BEGIN
                SET @maincmd = 'ALTER VIEW dbo.v_userwise_columns_value AS SELECT sjoid, CONVERT(BIGINT, ' + CONVERT(VARCHAR(10), @userid) + ') as userid , ' 
                            + CHAR(39) + @nickname + CHAR(39) + ' as nickname, ' 
                            + @columnlist + ' compcode FROM dbo.SJOTran '
            END

        EXECUTE sp_executesql @maincmd
END

-----------------------------------------------
SELECT * FROM dbo.v_userwise_columns_value

언급URL : https://stackoverflow.com/questions/14506871/how-to-execute-a-stored-procedure-inside-a-select-query

반응형