저장 프로시저에서 선택하는 방법
행을 반환하는 저장 프로시저가 있습니다.
CREATE PROCEDURE MyProc
AS
BEGIN
SELECT * FROM MyTable
END
실제 시술은 좀 더 복잡하기 때문에 저장 절차가 필요합니다.
이 절차를 호출하여 출력을 선택할 수 있습니까?
예를 들어 다음과 같습니다.
SELECT * FROM (EXEC MyProc) AS TEMP
사용할 필요가 있다SELECT TOP X
,ROW_NUMBER
, 및 기타WHERE
이 값을 매개 변수로 전달하고 싶지 않습니다.
넌 할 수 있다.
- 저장된 proc에서 결과 세트를 유지하는 테이블 변수를 만든 다음
- 저장된 proc의 출력을 테이블 변수에 삽입한 다음
- 테이블 변수를 다른 테이블과 동일하게 사용합니다.
... sql ..
Declare @T Table ([column definitions here])
Insert @T Exec storedProcname params
Select * from @T Where ...
절차 대신 사용자 정의 함수 또는 보기를 사용할 수 있습니다.
프로시저는 각각 자체 스키마를 가진 여러 결과 세트를 반환할 수 있습니다.사용하기에 적합하지 않습니다.SELECT
진술.
Table-Valued 함수를 사용하거나 EXEC을 임시 테이블에 삽입할 수 있습니다.
INSERT INTO #tab EXEC MyProc
저장 프로시저가 반환하는 열 수와 동일한 개수의 테이블 유형을 선언해야 합니다.테이블 유형의 열과 프로시저에서 반환하는 열의 데이터 유형은 같아야 합니다.
declare @MyTableType as table
(
FIRSTCOLUMN int
,.....
)
그런 다음 방금 정의한 테이블 유형에 저장 프로시저의 결과를 삽입해야 합니다.
Insert into @MyTableType
EXEC [dbo].[MyStoredProcedure]
마지막으로 테이블 유형에서 선택하십시오.
Select * from @MyTableType
SELECT *
INTO #tmp FROM
OPENQUERY(YOURSERVERNAME, 'EXEC MyProc @parameters')
임시 테이블을 사용할 필요는 없습니다.
이것이 나의 해결책이다.
SELECT * FROM
OPENQUERY(YOURSERVERNAME, 'EXEC MyProc @parameters')
WHERE somefield = anyvalue
출력을 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
다음과 같이 인라인 함수로 프로시저를 변환해 보겠습니다.인라인 함수는 다음과 같습니다.
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 )
OPENROWSET으로 약간의 속임수를 쓸 수 있습니다.
SELECT ...fieldlist...
FROM OPENROWSET('SQLNCLI', 'connection string', 'name of sp')
WHERE ...
물론 SP 전체를 매번 실행할 수 있습니다.
'DATA ACCESS'가 거짓이면
EXEC sp_serveroption 'SQLSERVERNAME', 'DATA ACCESS', TRUE
끝나고,
SELECT * FROM OPENQUERY(SQLSERVERNAME, 'EXEC DBNAME..MyProc @parameters')
그건 효과가 있다.
OPENQUERY 사용 및 실행 세트 이전SET FMTONLY OFF; SET NOCOUNT ON;
다음 샘플 코드를 사용해 보십시오.
SELECT top(1)*
FROM
OPENQUERY( [Server], 'SET FMTONLY OFF; SET NOCOUNT ON; EXECUTE [database].[dbo].[storedprocedure] value,value ')
'Server is not configured for DATA ACCESS'라는 오류가 표시되면 다음을 사용하십시오.
EXEC sp_serveroption 'YourServer', 'DATA ACCESS', TRUE
단순화와 재실행을 위해 시스템 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
명명을실실행실!는 모든 단일 에 있는지 것입니다 :- ) 。 :- ) 。
그게 도움이 됐으면 좋겠어요.
이게 쓸모 있는 것 같아요.실제 예.
declare @tempv1 table (Number int, AccountType varchar(255), DisplayName varchar(255), Kind int, UsagePageBreak int, PrimoPrev money, PrevPeriod money, UltimoPrev money, Primo money, Debit money, Credit money, Period money, Ultimo money, ToCurrentDate money, IndexUltimoPct money, IndexPeriodPct money, UltimoPrevOK int, UltimoOK int)
declare @tempv2 table (Number int, AccountType varchar(255), DisplayName varchar(255), Kind int, UsagePageBreak int, PrimoPrev money, PrevPeriod money, UltimoPrev money, Primo money, Debit money, Credit money, Period money, Ultimo money, ToCurrentDate money, IndexUltimoPct money, IndexPeriodPct money, UltimoPrevOK int, UltimoOK int)
insert into @tempv1
exec sp_reports_Accounting_BalanceV2
@fromaccount=1010,
@toaccount=1010,
@fromfinancialdate = '2021-01-01 00:00:00 +01:00',
@tofinancialdate = '2021-12-31 00:00:00+01:00',
@includezero=0,@ouids=NULL,@currentOrganizationalUnitId=1,@currentuserid=1,@includenotbooked=0
insert into @tempv2
exec sp_reports_Accounting_BalanceV3
@fromaccount=1010,
@toaccount=1010,
@fromfinancialdate = '2021-01-01 00:00:00 +01:00',
@tofinancialdate = '2021-12-31 00:00:00+01:00',
@includezero=0,@ouids=NULL,@currentOrganizationalUnitId=1,@currentuserid=1,@includenotbooked=0
select * from @tempv1 except select * from @tempv2
union all
select * from @tempv2 except select * from @tempv1
언급URL : https://stackoverflow.com/questions/1492411/how-to-select-from-stored-procedure
'programing' 카테고리의 다른 글
WCF 클라이언트의 블록 사용 문제에 대한 최선의 회피책은 무엇입니까? (0) | 2023.04.07 |
---|---|
현재 트랜잭션 수준을 찾는 방법 (0) | 2023.04.07 |
임시 테이블이 있는지 확인하고 임시 테이블을 만들기 전에 해당 테이블이 있으면 삭제하십시오. (0) | 2023.04.07 |
LIKE 절에서 대괄호를 이스케이프하려면 어떻게 해야 합니까? (0) | 2023.04.07 |
SQL Server에서의 INSERT 또는 업데이트 솔루션 (0) | 2023.04.07 |