본문 바로가기

DataBase/Ms Sql

SQL 쿼리 내부에서 저장 프로 시저를 사용하는 방법

출처 : 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 ..."를 선택하십시오.
  • 대화 상자가 나타나면 다음을 설정하십시오.
    1. "LinkedServer"- "LOCALSERVER". 주 : 모두 대문자, 공백 없음
    2. "기타 데이터 소스"를 선택하십시오.
    3. "공급자"- "SQL Server 용 Microsoft OLE DB 공급자"
    4. "제품 이름"- "SQLSERVER", 모두 대문자, 공백 없음
    5. "데이터 소스"- SQL Server 인스턴스 이름을 입력하십시오. 내 개발 컴퓨터의 경우 " GRIFF-DESKTOP \ SQLEXPRESS "이지만 SSMS의 개체 탐색기 창의 맨 위에 표시됩니다.
    6. "공급자 문자열"- 비어 있음
    7. "위치"- 회색으로 회색으로 표시됩니다.
    8. "카탈로그"- 비어 있음
  • 이제 대화 상자의 왼쪽에있는 "보안"페이지를 클릭하십시오.
  • "로그인의 현재 보안 컨텍스트로 만들기"를 선택하십시오.
  • "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일요일월요일화요일수요일목요일금요일토요일
1Lorem Ipsum334739 세37 세403327
2Dolor Sit9113212912112310380
Amet Consectetur1611512914015913314
4Adipiscing Elit816842849110158
5Sed Do39 세20219920418617061
6Eiusmod Tempor496851856840863782552
7Incididunt Ut128 자273245277259251192
8Labore Et273449404428376288206

당신이 궁금해하는 경우 데이터가 자동으로-거의 같은-가능한 06:00 수집되기 때문에, 쿼리에서 오프셋 날짜는하지만, 타임 스탬프 오늘이지만, 전날의 데이터 인 것으로 간주됩니다. (즉, 특정 시간에 작업을 실행하는 데 시스템의 정확성을 모니터링 할 수도 있습니다. "그다지"대답이 아닙니다.)