복붙노트

[SQL] SQL 서버 - 저장 프로 시저에서 SELECT

SQL

SQL 서버 - 저장 프로 시저에서 SELECT

나는 반환 행이 저장 프로 시저를 가지고 :

CREATE PROCEDURE MyProc
AS
BEGIN
    SELECT * FROM MyTable
END

내 실제 절차는 sproc에이 필요한 이유입니다, 좀 더 복잡하다.

그것은이 프로 시저를 호출하여 출력을 선택 할 수 있습니까?

뭔가 같은 :

SELECT * FROM (EXEC MyProc) AS TEMP

나는 SELECT TOP X, ROW_NUMBER를 사용해야하고, 추가는 WHERE 페이지에 절 내 데이터, 그리고 정말 매개 변수로이 값을 전달하고 싶지 않아요.

해결법

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

    1.당신은 사용자 정의 함수를 사용하거나 대신 절차로 볼 수 있습니다.

    당신은 사용자 정의 함수를 사용하거나 대신 절차로 볼 수 있습니다.

    프로시 저는 그 자신의 스키마와 각을 여러 결과 집합을 반환 할 수 있습니다. 그것은 SELECT 문에 사용하기에 적합하지 않습니다.

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

    2.당신은 할 수 있습니다

    당신은 할 수 있습니다

    ... SQL ....

    Declare @T Table ([column definitions here])
    Insert @T Exec storedProcname params 
    Select * from @T Where ...
    
  3. ==============================

    3.당신은 ERLAND Sommarskog하여이 우수한 기사를 보라 :

    당신은 ERLAND Sommarskog하여이 우수한 기사를 보라 :

    그것은 기본적으로 시나리오에 사용할 수있는 모든 옵션을 나열합니다.

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

    4.당신도 테이블 반환 함수를 원하거나 임시 테이블로 EXEC를 삽입 :

    당신도 테이블 반환 함수를 원하거나 임시 테이블로 EXEC를 삽입 :

    INSERT INTO #tab EXEC MyProc
    
  5. ==============================

    5.당신은 당신의 저장 프로 시저가 반환 동일한 수의 열을 포함하는 테이블 유형을 선언해야합니다. 절차에 의해 반환 된 테이블 형식의 열 및 열 데이터 유형이 동일해야합니다

    당신은 당신의 저장 프로 시저가 반환 동일한 수의 열을 포함하는 테이블 유형을 선언해야합니다. 절차에 의해 반환 된 테이블 형식의 열 및 열 데이터 유형이 동일해야합니다

    declare @MyTableType as table
    (
    FIRSTCOLUMN int
    ,.....
    )  
    

    그럼 당신은 테이블 형태로 저장 프로 시저의 방금 정의한 결과를 삽입해야

    Insert into @MyTableType 
    EXEC [dbo].[MyStoredProcedure]
    

    결국 당신의 테이블 유형 선택

    Select * from @MyTableType
    
  6. ==============================

    6.당신은 OPENROWSET 및 OPENQUERY에 대해 읽을 수 있어야합니다

    당신은 OPENROWSET 및 OPENQUERY에 대해 읽을 수 있어야합니다

    SELECT  * 
    INTO    #tmp FROM    
    OPENQUERY(YOURSERVERNAME, 'EXEC MyProc @parameters')
    
  7. ==============================

    7.그것은 임시 테이블이 필요 사용하지 않습니다.

    그것은 임시 테이블이 필요 사용하지 않습니다.

    이것은 내 솔루션입니다

    SELECT  *  FROM    
    OPENQUERY(YOURSERVERNAME, 'EXEC MyProc @parameters')
    WHERE somefield = anyvalue
    
  8. ==============================

    8.당신은 임시 테이블에 SP의 출력을 복사 할 수 있습니다.

    당신은 임시 테이블에 SP의 출력을 복사 할 수 있습니다.

    CREATE TABLE #GetVersionValues
    (
        [Index] int,
        [Name]  sysname,
        Internal_value  int,
        Character_Value sysname
    )
    INSERT #GetVersionValues EXEC master.dbo.xp_msver 'WindowsVersion'
    SELECT * FROM #GetVersionValues
    drop TABLE #GetVersionValues
    
  9. ==============================

    9.사용 OPENQUERY 및 befor를 실행 세트 'SET FMTONLY OFF; SET NOCOUNT ON; '

    사용 OPENQUERY 및 befor를 실행 세트 'SET FMTONLY OFF; SET NOCOUNT ON; '

    이 샘플 코드를보십시오 :

    SELECT top(1)*
    FROM
    OPENQUERY( [Server], 'SET FMTONLY OFF; SET NOCOUNT ON; EXECUTE  [database].[dbo].[storedprocedure]  value,value ')
    
  10. ==============================

    10.다음과 같이 테이블을 반환하는 인라인 함수에서 프로 시저를 변환하십시오 :

    다음과 같이 테이블을 반환하는 인라인 함수에서 프로 시저를 변환하십시오 :

    CREATE FUNCTION MyProc()
    RETURNS TABLE AS
    RETURN (SELECT * FROM MyTable)
    

    그리고 당신은 그것을 호출 할 수 있습니다

    SELECT * FROM MyProc()
    

    당신은 또한 다음과 같이 함수에 매개 변수를 전달하는 옵션이 있습니다 :

    CREATE FUNCTION FuncName (@para1 para1_type, @para2 para2_type , ... ) 
    

    그리고 전화

    SELECT * FROM FuncName ( @para1 , @para2 )
    
  11. ==============================

    11.'데이터 액세스'false의 경우,

    '데이터 액세스'false의 경우,

    EXEC sp_serveroption 'SQLSERVERNAME', 'DATA ACCESS', TRUE
    

    후,

    SELECT  *  FROM OPENQUERY(SQLSERVERNAME, 'EXEC DBNAME..MyProc @parameters')
    

    효과가있다.

  12. ==============================

    12.당신은 OPENROWSET과 약간의 속임수 수 있습니다 :

    당신은 OPENROWSET과 약간의 속임수 수 있습니다 :

    SELECT ...fieldlist...
    FROM OPENROWSET('SQLNCLI', 'connection string', 'name of sp')
    WHERE ...
    

    이것은 여전히 ​​물론, 전체 SP 때마다 실행됩니다.

  13. ==============================

    13.술 단순하고 다시 실행 가능한 만드는, 나는 데이터를 얻을 수있는 시스템의 StoredProcedure "sp_readerrorlog"을 사용하고 있습니다 :

    술 단순하고 다시 실행 가능한 만드는, 나는 데이터를 얻을 수있는 시스템의 StoredProcedure "sp_readerrorlog"을 사용하고 있습니다 :

    -----USING Table Variable
    DECLARE @tblVar TABLE (
       LogDate DATETIME,
       ProcessInfo NVARCHAR(MAX),
       [Text] NVARCHAR(MAX)
    )
    INSERT INTO @tblVar Exec sp_readerrorlog
    SELECT LogDate as DateOccured, ProcessInfo as pInfo, [Text] as Message FROM @tblVar
    
    
    
    -----(OR): Using Temp Table
    IF OBJECT_ID('tempdb..#temp') IS NOT NULL  DROP TABLE #temp;
    CREATE TABLE #temp (
       LogDate DATETIME,
       ProcessInfo NVARCHAR(55),
       Text NVARCHAR(MAX)
    )
    INSERT INTO #temp EXEC sp_readerrorlog
    SELECT * FROM #temp
    
  14. ==============================

    14.당신은 단지보기를 사용해야 할 수도 있습니다 것 같은데. 뷰는 뷰가 조회 할 수 있도록 쿼리 테이블로 표시 할 수 있습니다.

    당신은 단지보기를 사용해야 할 수도 있습니다 것 같은데. 뷰는 뷰가 조회 할 수 있도록 쿼리 테이블로 표시 할 수 있습니다.

  15. ==============================

    15.서버가 예를 들어 SERVERX를 호출하면, 이것은 내가 그것을 어떻게입니다 ...

    서버가 예를 들어 SERVERX를 호출하면, 이것은 내가 그것을 어떻게입니다 ...

    EXEC sp_serveroption 'SERVERX', 'DATA ACCESS', TRUE;
    DECLARE @CMD VARCHAR(1000);
    DECLARE @StudentID CHAR(10);
    SET @StudentID = 'STUDENT01';
    SET @CMD = 'SELECT * FROM OPENQUERY([SERVERX], ''SET FMTONLY OFF; SET NOCOUNT ON; EXECUTE MYDATABASE.dbo.MYSTOREDPROC ' + @StudentID + ''') WHERE SOMEFIELD = SOMEVALUE';
    EXEC (@CMD);
    

    이 일을 확인하려면, 나는 EXEC () 명령 줄을 주석 처리하고 실행하기 전에 명령을 검토 SELECT @CMD로 교체! 그것은 확실히 모든 단일 인용 부호의 정확한 수는 올바른 위치에 있었다 만드는 것이 었습니다. :-)

    난 그 사람을 도움이되기를 바랍니다.

  16. from https://stackoverflow.com/questions/1492411/sql-server-select-from-stored-procedure by cc-by-sa and MIT license