Programing

SQL Server-SELECT FROM 저장 프로 시저

lottogame 2020. 3. 13. 08:15
반응형

SQL Server-SELECT FROM 저장 프로 시저


행을 반환하는 저장 프로 시저가 있습니다.

CREATE PROCEDURE MyProc
AS
BEGIN
    SELECT * FROM MyTable
END

내 실제 절차는 조금 더 복잡하므로 sproc이 필요합니다.

이 절차를 호출하여 출력을 선택할 수 있습니까?

다음과 같은 것 :

SELECT * FROM (EXEC MyProc) AS TEMP

데이터를 페이징 하기 위해 SELECT TOP X, ROW_NUMBER및 추가 WHERE을 사용해야 하며 이러한 값을 매개 변수로 전달하고 싶지 않습니다.


프로 시저 대신 사용자 정의 함수 또는 보기사용할 수 있습니다 .

프로시 저는 각각 고유 한 스키마가있는 여러 결과 세트를 리턴 할 수 있습니다. SELECT명세서 에 사용하기에 적합하지 않습니다 .


당신은 할 수 있습니다

  1. 저장된 proc에서 결과 세트를 보유 할 테이블 변수를 작성한 후
  2. 저장된 proc의 출력을 테이블 변수에 삽입 한 다음
  3. 다른 테이블과 똑같이 테이블 변수를 사용하십시오 ...

... sql ....

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

Erland Sommarskog의이 훌륭한 기사를보아야합니다.

기본적으로 시나리오에 사용 가능한 모든 옵션이 나열됩니다.


당신도 찾는 테이블 반환 함수를 또는 임시 테이블로 EXEC를 삽입 :

INSERT INTO #tab EXEC MyProc

OPENROWSETOPENQUERY 에 대해 읽어야합니다.

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

스토어드 프로 시저가 리턴하는 동일한 수의 컬럼을 포함하는 테이블 유형을 선언해야합니다. 테이블 유형의 컬럼 데이터 유형과 프로 시저가 리턴 한 컬럼은 동일해야합니다.

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

그런 다음 방금 정의한 테이블 유형에 스토어드 프로 시저 결과를 삽입해야합니다.

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

결국 테이블 유형에서 선택하십시오.

Select * from @MyTableType

임시 테이블을 사용할 필요는 없습니다.

이것은 나의 해결책이다

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

sp에서 temporaty 테이블로 출력을 복사 할 수 있습니다.

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

OPENQUERY를 사용하고 set 'SET FMTONLY OFF'를 실행하십시오. NOCOUNT ON; '설정

이 샘플 코드를 사용해보십시오 :

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

'DATA ACCESS'가 거짓이면

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

후,

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

효과가있다.


OPENROWSET으로 약간의 부정 행위를 할 수 있습니다 :

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

물론 이것은 항상 전체 SP를 실행합니다.


프로 시저를 다음과 같이 테이블을 리턴하는 인라인 함수로 변환하십시오.

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 )

간단하게하기 위해 다시 실행할 수 있도록하기 위해 시스템 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

보기 를 사용해야 할 수도 있습니다 . 뷰를 사용하면 쿼리를 테이블로 표시하여 뷰를 쿼리 할 수 ​​있습니다.


예를 들어 서버의 이름이 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을 실행하기 전에 명령 줄을 대체 했습니다! 그것은 올바른 수의 모든 작은 따옴표가 올바른 위치에 있는지 확인하는 것이 었습니다. :-)

누군가에게 도움이되기를 바랍니다.

참고 URL : https://stackoverflow.com/questions/1492411/sql-server-select-from-stored-procedure

반응형