[SQL] SQL 서버 - 저장 프로 시저에서 SELECT
SQLSQL 서버 - 저장 프로 시저에서 SELECT
나는 반환 행이 저장 프로 시저를 가지고 :
CREATE PROCEDURE MyProc
AS
BEGIN
SELECT * FROM MyTable
END
내 실제 절차는 sproc에이 필요한 이유입니다, 좀 더 복잡하다.
그것은이 프로 시저를 호출하여 출력을 선택 할 수 있습니까?
뭔가 같은 :
SELECT * FROM (EXEC MyProc) AS TEMP
나는 SELECT TOP X, ROW_NUMBER를 사용해야하고, 추가는 WHERE 페이지에 절 내 데이터, 그리고 정말 매개 변수로이 값을 전달하고 싶지 않아요.
해결법
-
==============================
1.당신은 사용자 정의 함수를 사용하거나 대신 절차로 볼 수 있습니다.
당신은 사용자 정의 함수를 사용하거나 대신 절차로 볼 수 있습니다.
프로시 저는 그 자신의 스키마와 각을 여러 결과 집합을 반환 할 수 있습니다. 그것은 SELECT 문에 사용하기에 적합하지 않습니다.
-
==============================
2.당신은 할 수 있습니다
당신은 할 수 있습니다
... SQL ....
Declare @T Table ([column definitions here]) Insert @T Exec storedProcname params Select * from @T Where ...
-
==============================
3.당신은 ERLAND Sommarskog하여이 우수한 기사를 보라 :
당신은 ERLAND Sommarskog하여이 우수한 기사를 보라 :
그것은 기본적으로 시나리오에 사용할 수있는 모든 옵션을 나열합니다.
-
==============================
4.당신도 테이블 반환 함수를 원하거나 임시 테이블로 EXEC를 삽입 :
당신도 테이블 반환 함수를 원하거나 임시 테이블로 EXEC를 삽입 :
INSERT INTO #tab EXEC MyProc
-
==============================
5.당신은 당신의 저장 프로 시저가 반환 동일한 수의 열을 포함하는 테이블 유형을 선언해야합니다. 절차에 의해 반환 된 테이블 형식의 열 및 열 데이터 유형이 동일해야합니다
당신은 당신의 저장 프로 시저가 반환 동일한 수의 열을 포함하는 테이블 유형을 선언해야합니다. 절차에 의해 반환 된 테이블 형식의 열 및 열 데이터 유형이 동일해야합니다
declare @MyTableType as table ( FIRSTCOLUMN int ,..... )
그럼 당신은 테이블 형태로 저장 프로 시저의 방금 정의한 결과를 삽입해야
Insert into @MyTableType EXEC [dbo].[MyStoredProcedure]
결국 당신의 테이블 유형 선택
Select * from @MyTableType
-
==============================
6.당신은 OPENROWSET 및 OPENQUERY에 대해 읽을 수 있어야합니다
당신은 OPENROWSET 및 OPENQUERY에 대해 읽을 수 있어야합니다
SELECT * INTO #tmp FROM OPENQUERY(YOURSERVERNAME, 'EXEC MyProc @parameters')
-
==============================
7.그것은 임시 테이블이 필요 사용하지 않습니다.
그것은 임시 테이블이 필요 사용하지 않습니다.
이것은 내 솔루션입니다
SELECT * FROM OPENQUERY(YOURSERVERNAME, 'EXEC MyProc @parameters') WHERE somefield = anyvalue
-
==============================
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.사용 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.다음과 같이 테이블을 반환하는 인라인 함수에서 프로 시저를 변환하십시오 :
다음과 같이 테이블을 반환하는 인라인 함수에서 프로 시저를 변환하십시오 :
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.'데이터 액세스'false의 경우,
'데이터 액세스'false의 경우,
EXEC sp_serveroption 'SQLSERVERNAME', 'DATA ACCESS', TRUE
후,
SELECT * FROM OPENQUERY(SQLSERVERNAME, 'EXEC DBNAME..MyProc @parameters')
효과가있다.
-
==============================
12.당신은 OPENROWSET과 약간의 속임수 수 있습니다 :
당신은 OPENROWSET과 약간의 속임수 수 있습니다 :
SELECT ...fieldlist... FROM OPENROWSET('SQLNCLI', 'connection string', 'name of sp') WHERE ...
이것은 여전히 물론, 전체 SP 때마다 실행됩니다.
-
==============================
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.당신은 단지보기를 사용해야 할 수도 있습니다 것 같은데. 뷰는 뷰가 조회 할 수 있도록 쿼리 테이블로 표시 할 수 있습니다.
당신은 단지보기를 사용해야 할 수도 있습니다 것 같은데. 뷰는 뷰가 조회 할 수 있도록 쿼리 테이블로 표시 할 수 있습니다.
-
==============================
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로 교체! 그것은 확실히 모든 단일 인용 부호의 정확한 수는 올바른 위치에 있었다 만드는 것이 었습니다. :-)
난 그 사람을 도움이되기를 바랍니다.
from https://stackoverflow.com/questions/1492411/sql-server-select-from-stored-procedure by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 MySQL은 여러 테이블에서 삭제하려면? (0) | 2020.03.13 |
---|---|
[SQL] 어떻게 두 숫자 사이의 숫자의 범위를 생성하는? (0) | 2020.03.13 |
[SQL] SQL - 그룹에 의해 별칭을 사용 (0) | 2020.03.13 |
[SQL] 어떻게 엔티티 프레임 워크를 사용하여 하나 개의 필드를 업데이트하는? (0) | 2020.03.13 |
[SQL] 클라이언트 - 서버 데이터베이스를 동기화 (0) | 2020.03.13 |