[sql-server] 저장 프로 시저의 결과 세트에서 열을 선택하십시오.

80 열과 300 행을 반환하는 저장 프로 시저가 있습니다. 해당 열 중 2 개를 가져 오는 선택을 작성하고 싶습니다. 같은 것

SELECT col1, col2 FROM EXEC MyStoredProc 'param1', 'param2'

위의 구문을 사용하면 오류가 발생합니다.

“잘못된 열 이름”.

가장 쉬운 해결책은 저장 프로 시저를 변경하는 것이지만 작성하지 않았으며 변경할 수 없습니다.

내가 원하는 것을 할 수있는 방법이 있습니까?

  • 결과를 넣을 임시 테이블을 만들 수는 있지만 80 개의 열이 있으므로 2 열을 얻으려면 80 열 임시 테이블을 만들어야합니다. 반환 된 모든 열을 추적하지 않으려 고했습니다.

  • WITH SprocResults AS ....Mark가 제안한대로 사용하려고했지만 2 오류가 발생했습니다.

    키워드 ‘EXEC’근처의 구문이 잘못되었습니다.
    ‘)’근처의 구문이 잘못되었습니다.

  • 테이블 변수를 선언하려고했는데 다음 오류가 발생했습니다.

    삽입 오류 : 열 이름 또는 제공된 값 수가 테이블 정의와 일치하지 않습니다

  • 시도
    SELECT * FROM EXEC MyStoredProc 'param1', 'param2'
    하면 오류가 발생합니다.

    키워드 ‘exec’근처의 구문이 잘못되었습니다.



답변

쿼리를 분할 할 수 있습니까? 저장된 proc 결과를 테이블 변수 또는 임시 테이블에 삽입하십시오. 그런 다음 테이블 변수에서 2 개의 열을 선택하십시오.

Declare @tablevar table(col1 col1Type,..
insert into @tablevar(col1,..) exec MyStoredProc 'param1', 'param2'

SELECT col1, col2 FROM @tablevar


답변

다음은 문제를 해결하는 다양한 방법을 모두 설명하는 아주 좋은 문서에 대한 링크입니다 (기존 저장 프로 시저를 수정할 수 없으므로 많은 방법을 사용할 수는 없지만).

저장 프로 시저간에 데이터를 공유하는 방법

Gulzar의 대답은 효과가 있지만 (위의 링크에 문서화되어 있음) 작성하기가 번거로울 것입니다 (@tablevar (col1, …) 문에 80 개의 열 이름을 모두 지정해야합니다. 열이 스키마에 추가되거나 출력이 변경되면 코드에서 업데이트해야합니다. 그렇지 않으면 오류가 발생합니다.


답변

CREATE TABLE #Result
(
  ID int,  Name varchar(500), Revenue money
)
INSERT #Result EXEC RevenueByAdvertiser '1/1/10', '2/1/10'
SELECT * FROM #Result ORDER BY Name
DROP TABLE #Result

출처 :
http://stevesmithblog.com/blog/select-from-a-stored-procedure/


답변

이것은 나를 위해 작동합니다 : (예 :에서 반환 된 30+ 중 2 열 만 필요합니다 sp_help_job)

SELECT name, current_execution_status
FROM OPENQUERY (MYSERVER,
  'EXEC msdb.dbo.sp_help_job @job_name = ''My Job'', @job_aspect = ''JOB''');  

이것이 작동하기 전에 이것을 실행해야했습니다.

sp_serveroption 'MYSERVER', 'DATA ACCESS', TRUE;

…. sys.servers테이블 을 업데이트 합니다. (즉, OPENQUERY 내에서 자체 참조 사용은 기본적으로 비활성화되어있는 것 같습니다.)

간단한 요구 사항에 대해서는 Lance의 우수한 링크의 OPENQUERY 섹션 에 설명 된 문제가 발생하지 않았습니다 .

Rossini, 이러한 입력 매개 변수를 동적으로 설정해야하는 경우 OPENQUERY 사용이 조금 더 어려워집니다.

DECLARE @innerSql varchar(1000);
DECLARE @outerSql varchar(1000);

-- Set up the original stored proc definition.
SET @innerSql =
'EXEC msdb.dbo.sp_help_job @job_name = '''+@param1+''', @job_aspect = N'''+@param2+'''' ;

-- Handle quotes.
SET @innerSql = REPLACE(@innerSql, '''', '''''');

-- Set up the OPENQUERY definition.
SET @outerSql =
'SELECT name, current_execution_status
FROM OPENQUERY (MYSERVER, ''' + @innerSql + ''');';

-- Execute.
EXEC (@outerSql);

sp_serveroption기존 sys.servers자체 참조를 직접 업데이트하는 데 사용 하는 sp_addlinkedserver것과 Lance의 링크에 설명 된대로 사용하여 중복 / 별칭을 만드는 것의 차이점 (있는 경우)을 확신하지 못합니다 .

참고 1 : OPENQUERY가 proc 내에서 연결 문자열 정의를 요구하지 않는다는 점에서 OPENROWSET보다 OPENQUERY를 선호합니다.

주 2 : 🙂 네, 10 분 추가 입력,하지만 그것을 도울 수 있다면, 나는 주변에 소형 어선 안함 보통 그냥 INSERT … EXEC을 사용 :이 모든 것을 말해 두 겠는데
따옴표 내에서의 (a) 따옴표 내 따옴표 및
(b) sys 테이블 및 / 또는 부적절한 자체 참조 링크 된 서버 설정 (즉,이 경우 모든 강력한 DBA에게 사례를 요구해야합니다.)

그러나이 인스턴스에서는 sp_help_job이미 INSERT … EXEC 구문을 사용할 수 없었습니다 . ( “INSERT EXEC 문은 중첩 될 수 없습니다.”


답변

이를 달성하려면 먼저 다음 #test_table과 같이 작성하십시오 .

create table #test_table(
    col1 int,
    col2 int,
   .
   .
   .
    col80 int
)

이제 프로 시저를 실행하고 값을 입력하십시오 #test_table.

insert into #test_table
EXEC MyStoredProc 'param1', 'param2'

이제 다음에서 값을 가져옵니다 #test_table.

select col1,col2....,col80 from #test_table


답변

저장 프로 시저를 수정할 수 있으면 필요한 열 정의를 매개 변수로 쉽게 넣고 자동 생성 된 임시 테이블을 사용할 수 있습니다.

CREATE PROCEDURE sp_GetDiffDataExample
      @columnsStatement NVARCHAR(MAX) -- required columns statement (e.g. "field1, field2")
AS
BEGIN
    DECLARE @query NVARCHAR(MAX)
    SET @query = N'SELECT ' + @columnsStatement + N' INTO ##TempTable FROM dbo.TestTable'
    EXEC sp_executeSql @query
    SELECT * FROM ##TempTable
    DROP TABLE ##TempTable
END

이 경우 임시 테이블을 수동으로 만들 필요가 없습니다. 자동으로 생성됩니다. 도움이 되었기를 바랍니다.


답변

이것이 왜 어려운지 아는 것이 도움이 될 수 있습니다. 저장 프로시 저는 텍스트 (인쇄 ‘text’) 만 반환하거나 여러 테이블을 반환하거나 테이블을 전혀 반환하지 않을 수 있습니다.

그래서 SELECT * FROM (exec sp_tables) Table1 작동하지 않을 것입니다