출처 : https://www.codeproject.com/Tips/1212704/How-to-use-a-Stored-Procedure-inside-an-SQL-query
소개
필자는 일일 총계, 델타 정보가없는 데이터 집합에서 사용자 당 평일 평균 델타를 얻으려고 시도했으며, 델타를 생성하기 위해 작성한 SP를 기억했습니다. 하지만 내 쿼리에서 어떻게 호출 할 수 있습니까? 밝혀 지, 너무 어렵지 않다.
나가해야하는 모두는 EXEC이다, 그렇지?
을 텐데. EXEC
작동하지만 SP SELECT
쿼리의 결과 집합을 사용할 수는 없습니다 . 즉,이 작업을 수행 할 수 없습니다.
SELECT * FROM EXEC MyDatabase.dbo.MyStoredProcedure;
시도 할 수는 있지만 구문 오류가 발생합니다. 프로 시저가 자체 스키마가있는 여러 결과 집합을 반환 할 수 있기 때문에 SQL에서 처리 할 수 없기 때문입니다. 그래서 그것은 a EXEC
이후에 사용할 수 없으므로 일반적인 구문 오류를 던집니다 FROM
.
하지만 ... 함수가 OPENQUERY 우리가 원하는 것을 할 것입니다.
제외 ... 그것은 현재 서버가 아닌 연결된 서버에만 작동합니다.
그럼, 속여 보자 ...
첫 번째 꺼짐 - 서버 연결
우리는 우리 자신의 서버에서 쿼리를 발행하고 결과 세트를 사용할 것입니다.
이제는 쿼리를 실행할 때마다이를 수행 할 필요가없는 방식으로 링크를 영구적으로 설정합시다 (이제부터 모든 서버에서이 작업을 수행 할 것입니다)
- SSMS에서 "서버 개체"분기를 확장하고 "링크 된 서버"나뭇 가지를 마우스 오른쪽 단추로 클릭하십시오.
- 메뉴에서 "New Linked Server ..."를 선택하십시오.
- 대화 상자가 나타나면 다음을 설정하십시오.
- "LinkedServer"- "LOCALSERVER". 주 : 모두 대문자, 공백 없음
- "기타 데이터 소스"를 선택하십시오.
- "공급자"- "SQL Server 용 Microsoft OLE DB 공급자"
- "제품 이름"- "SQLSERVER", 모두 대문자, 공백 없음
- "데이터 소스"- SQL Server 인스턴스 이름을 입력하십시오. 내 개발 컴퓨터의 경우 " GRIFF-DESKTOP \ SQLEXPRESS "이지만 SSMS의 개체 탐색기 창의 맨 위에 표시됩니다.
- "공급자 문자열"- 비어 있음
- "위치"- 회색으로 회색으로 표시됩니다.
- "카탈로그"- 비어 있음
- 이제 대화 상자의 왼쪽에있는 "보안"페이지를 클릭하십시오.
- "로그인의 현재 보안 컨텍스트로 만들기"를 선택하십시오.
- "OK"를 누릅니다.
이제 SP를 사용할 수 있습니다!
시도 해봐:
SELECT * FROM OPENQUERY([LOCALSERVER], 'EXEC MyDatabase.dbo.MyStoredProcedure');
그냥 알다시피, 내가 결국 끝난 전체 쿼리는 다음과 같습니다.
SELECT LongName, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
FROM (SELECT mu.LongName, DATENAME(dw, DATEADD(dd, -1, a.EnterDate)) as dow, a.Delta as Delta
FROM OPENQUERY([LOCALSERVER], 'EXEC MyDatabaseName.dbo.spGetDatWithDelta') a
JOIN MonitoredUsers mu ON a.UserID=mu.ID
) x
PIVOT (AVG(Delta)
FOR dow IN (Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday)
) p
ORDER BY LongName ASC
그리고 그것은 다음을 생성합니다 :
LongName | 일요일 | 월요일 | 화요일 | 수요일 | 목요일 | 금요일 | 토요일 | |
---|---|---|---|---|---|---|---|---|
1 | Lorem Ipsum | 33 | 47 | 39 세 | 37 세 | 40 | 33 | 27 |
2 | Dolor Sit | 91 | 132 | 129 | 121 | 123 | 103 | 80 |
삼 | Amet Consectetur | 16 | 115 | 129 | 140 | 159 | 133 | 14 |
4 | Adipiscing Elit | 81 | 68 | 42 | 84 | 91 | 101 | 58 |
5 | Sed Do | 39 세 | 202 | 199 | 204 | 186 | 170 | 61 |
6 | Eiusmod Tempor | 496 | 851 | 856 | 840 | 863 | 782 | 552 |
7 | Incididunt Ut | 128 자 | 273 | 245 | 277 | 259 | 251 | 192 |
8 | Labore Et | 273 | 449 | 404 | 428 | 376 | 288 | 206 |
당신이 궁금해하는 경우 데이터가 자동으로-거의 같은-가능한 06:00 수집되기 때문에, 쿼리에서 오프셋 날짜는하지만, 타임 스탬프 오늘이지만, 전날의 데이터 인 것으로 간주됩니다. (즉, 특정 시간에 작업을 실행하는 데 시스템의 정확성을 모니터링 할 수도 있습니다. "그다지"대답이 아닙니다.)