복붙노트

[SQL] 저장 프로 시저 거래-SQL SQL 서버 내에서 결과 세트에 대한 액세스

SQL

저장 프로 시저 거래-SQL SQL 서버 내에서 결과 세트에 대한 액세스

나는 SQL 서버 2005을 사용하고, 나는 TRANSACT-SQL 내에서 다른 결과 세트에 액세스하는 방법을 알고 싶습니다. 저장 프로 시저 반환 다음 두 개의 결과 집합은, 어떻게, 예를 들어,에서 다른 저장 프로 시저에 액세스합니까?

CREATE PROCEDURE getOrder (@orderId as numeric) AS
BEGIN   
    select order_address, order_number from order_table where order_id = @orderId
    select item, number_of_items, cost from order_line where order_id = @orderId
END

나는 개별적으로 모두 결과 집합을 반복 할 수 있어야합니다.

편집 : 그냥 내가 저장 프로 시저를 테스트 할 질문을 명확히합니다. 나는 여러 결과 집합을 돌려 VB.NET 클라이언트에서 사용되는 저장 프로 시저, 세트를 가지고있다. 이 내가 사실은 전혀 절차를 변경할 수 없습니다, 테이블 반환 함수로 변경 될 수 없습니다. 절차를 변경하는 옵션을 선택하지 않습니다.

절차에 의해 리턴 된 결과 세트는 동일한 데이터 유형 또는 열 수 없다.

해결법

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

    1.짧은 대답은 : 당신이 그것을 할 수 없습니다.

    짧은 대답은 : 당신이 그것을 할 수 없습니다.

    T-SQL에서 다른 제안으로 저장 프로 시저를 변경하지 않고, 중첩 된 저장 프로 시저 호출의 액세스 여러 결과에 방법이 없습니다.

    프로 시저가 하나의 결과를 반환 한 경우 완료하려면, 당신은 임시 테이블 또는 다음과 같은 구문을 사용하여 테이블 변수에 삽입 할 수 있습니다 :

    INSERT INTO #Table (...columns...)
    EXEC MySproc ...parameters...
    

    여러 결과를 반환하는 절차를 동일한 구문을 사용할 수 있지만, 그것은 단지 첫 번째 결과를 처리합니다, 나머지는 삭제됩니다.

  2. ==============================

    2.나는 쉽게 내부 데이터 세트가 포함 된 SQL2005 CLR 저장 프로 시저를 작성하여이 작업을 수행 할 수 있었다.

    나는 쉽게 내부 데이터 세트가 포함 된 SQL2005 CLR 저장 프로 시저를 작성하여이 작업을 수행 할 수 있었다.

    새 SqlDataAdapter를 기본적으로 여러 테이블의 데이터 세트에 다중 결과 세트의 SPROC를 .Fill 것이다 참조하십시오. 이 테이블의 데이터는 차례로 당신이 쓰기하고자하는 전화 SPROC에서 #Temp 테이블에 삽입 할 수 있습니다. dataset.ReadXmlSchema는 각 결과 세트의 스키마를 표시합니다.

    1 단계 : 다중 결과 집합 SPROC로부터 데이터를 판독 할 SPROC를 쓰기 시작

    ㅏ. 스키마에 따라 설정 각 결과에 대해 별도의 테이블을 만듭니다.

    CREATE PROCEDURE [dbo].[usp_SF_Read] AS
    SET NOCOUNT ON;
    CREATE TABLE #Table01 (Document_ID VARCHAR(100)
      , Document_status_definition_uid INT
      , Document_status_Code VARCHAR(100) 
      , Attachment_count INT
      , PRIMARY KEY (Document_ID));
    

    비. 이 시점에서 반복적으로 여기에서 생성됩니다 CLR의 sproc에 전화 커서를 선언해야 할 수도 있습니다 :

    2 단계 : CLR SPROC 확인

    Partial Public Class StoredProcedures
        <Microsoft.SqlServer.Server.SqlProcedure()> _
        Public Shared Sub usp_SF_ReadSFIntoTables()
    
        End Sub
    End Class
    

    ㅏ. 새로운도록 SqlConnection ( "문맥 연결 = 진정한")를 사용하여 연결합니다.

    비. 다중 결과 집합의 sproc를 포함하는 명령 개체 (cmd를) 설정합니다.

    씨. 다음을 사용하여 모든 데이터를 얻을 :

        Dim dataset As DataSet = New DataSet
        With New SqlDataAdapter(cmd)
            .Fill(dataset) ' get all the data.
        End With
    'you can use dataset.ReadXmlSchema at this point...
    

    디. 반복 처리 각 테이블이고 (위의 단계 하나에서 만든) 적절한 임시 테이블에 모든 행 삽입.

    최종 참고 사항 : 내 경험에 의하면, 당신은 당신이 각 레코드에서 온 어떤 배치 알 수 있도록 당신의 테이블 사이에 관계를 시행 할 수도 있습니다.

    즉, 모든 거기입니다!

    ~ 숀, 근처 시애틀

  3. ==============================

    3.당신은뿐만 아니라 할 수있는 kludge이있다. 당신의 sproc에 선택적 매개 변수 N의 INT를 추가합니다. N -1의 값을 기본. N의 값이 -1의 경우, 당신의 선택의 모든 하나를 수행합니다. 그렇지 않으면, N 번째 선택 않습니다 만 N 번째 선택.

    당신은뿐만 아니라 할 수있는 kludge이있다. 당신의 sproc에 선택적 매개 변수 N의 INT를 추가합니다. N -1의 값을 기본. N의 값이 -1의 경우, 당신의 선택의 모든 하나를 수행합니다. 그렇지 않으면, N 번째 선택 않습니다 만 N 번째 선택.

    예를 들어,

    if (N = -1 or N = 0)
        select ...
    
    if (N = -1 or N = 1)
        select ...
    

    N을 지정하지 않은 당신의 sproc의 발신자가 하나 개 이상의 테이블과 결과 세트를 얻을 것이다. 당신은 N. 당신은 추출 할 각 테이블의 sproc에 한 번 전화를해야합니다 위해 단순히 값을 지정하여 sproc에 전화, 다른 SPROC에서 더 많은 이들 테이블 중 하나를 추출하거나해야하는 경우. 비효율적 인 당신이 결과 집합에서 하나 개 이상의 테이블을 필요로하지만, 순수 TSQL에서 작업을 수행합니다.

  4. ==============================

    4.참고는 INSERT INTO ... EXEC 문을 추가, 문서화되지 않은 한계가 있다는 :이 중첩 될 수 없습니다. 즉, EXEC 전화 (또는 차례로 호출하는 어떤)는 INSERT INTO ... EXEC하지 자체 수있는 저장된 프로 시저. 이 결과를 축적 프로세스 당 하나의 스크래치 패드, 그리고 그들이 중첩하는 경우 발신자가이 열립니다 때 오류가 발생합니다 다음 수신자가 다시 열려고 것으로 보인다.

    참고는 INSERT INTO ... EXEC 문을 추가, 문서화되지 않은 한계가 있다는 :이 중첩 될 수 없습니다. 즉, EXEC 전화 (또는 차례로 호출하는 어떤)는 INSERT INTO ... EXEC하지 자체 수있는 저장된 프로 시저. 이 결과를 축적 프로세스 당 하나의 스크래치 패드, 그리고 그들이 중첩하는 경우 발신자가이 열립니다 때 오류가 발생합니다 다음 수신자가 다시 열려고 것으로 보인다.

    마티유, 당신은 결과의 각 "유형"에 대해 별도의 임시 테이블을 유지해야하는 것입니다. 같은 일을 여러 번 실행하는 경우 또한, 당신은으로 인한 부르는 나타 내기 위해 그 결과에 여분의 열을 추가해야 할 수도 있습니다.

  5. ==============================

    5.슬프게도이 작업을 수행하는 것은 불가능합니다. 문제는 그것을 허용 할 SQL 구문이 없음을 물론이다. 그것은 물론 '후드 아래에'발생하지만, 당신은 단지 ODBC 또는 무엇이든을 통해 응용 프로그램에서, TSQL에서 이러한 다른 결과를 얻을 수 없습니다.

    슬프게도이 작업을 수행하는 것은 불가능합니다. 문제는 그것을 허용 할 SQL 구문이 없음을 물론이다. 그것은 물론 '후드 아래에'발생하지만, 당신은 단지 ODBC 또는 무엇이든을 통해 응용 프로그램에서, TSQL에서 이러한 다른 결과를 얻을 수 없습니다.

    그 라운드 방법이 대부분의 것들과 마찬가지로,있다. 트릭은 차례로 각 결과 집합을 여는 ADODB 객체를 생성하고 지명 테이블에 결과를 쓰기 (또는 당신이 결과 집합에 원하는 무엇이든)에 TSQL에서 OLE 자동화를 사용하는 것입니다. 당신이 고통을 즐길 경우, 당신은 또한 DMO에 그것을 할 수 있습니다.

  6. ==============================

    6.쉽게이 작업을 수행하는 방법은 두 가지가 있습니다. 어느 임시 테이블에서 결과를 스틱 다음의 sproc에서 임시 테이블을 참조합니다. 다른 대안은 출력 변수로 사용되는 XML 변수에 결과를 배치하는 것입니다.

    쉽게이 작업을 수행하는 방법은 두 가지가 있습니다. 어느 임시 테이블에서 결과를 스틱 다음의 sproc에서 임시 테이블을 참조합니다. 다른 대안은 출력 변수로 사용되는 XML 변수에 결과를 배치하는 것입니다.

    이러한 옵션은 모두 장점과 단점은, 그러나,이 있습니다. 임시 테이블을 사용하면 절차를 수정하기 전에 임시 테이블을 만들 수있는 호출 프로 시저를 만듭니다 스크립트 코드를 추가해야합니다. 또한, 절차의 끝에서 임시 테이블을 정리해야합니다.

    는 XML, 그것은 메모리 집약적이고 속도가 느려질 수 있습니다.

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

    7.당신은 결과 집합을 반환하는 임시 테이블 또는 쓰기 테이블 반환 함수로를 선택할 수 있습니다. 결과 세트를 통해 방법을 반복 묻는?

    당신은 결과 집합을 반환하는 임시 테이블 또는 쓰기 테이블 반환 함수로를 선택할 수 있습니다. 결과 세트를 통해 방법을 반복 묻는?

  8. from https://stackoverflow.com/questions/58940/access-to-result-sets-from-within-stored-procedures-transact-sql-sql-server by cc-by-sa and MIT license