복붙노트

[SQL] 저장 프로 시저의 열 이름과 유형의 검색? [복제]

SQL

저장 프로 시저의 열 이름과 유형의 검색? [복제]

나는 테이블이나 뷰의 열 이름과 유형을 얻기 위해 다음과 같은 SQL을 사용 :

DECLARE @viewname varchar (250);

select a.name as colname,b.name as typename 
from syscolumns a, systypes b -- GAH!
where a.id = object_id(@viewname) 
and a.xtype=b.xtype 
and b.name <> 'sysname'

어떻게 저장 프로 시저의 출력 열에 대한 비슷한해야합니까?

해결법

  1. ==============================

    1.[난 그냥 내가 전에이 질문에 대답했습니다 실현]

    [난 그냥 내가 전에이 질문에 대답했습니다 실현]

    저장 프로 시저에 대해 이렇게하면 훨씬 더가 뷰 또는 테이블에 대한보다 복잡하다. 문제 중 하나는 저장 프로 시저가 당신의 출력으로보고 무엇을 기대 예를 들어, 입력 매개 변수 및 서버 상태처럼 통제 할 수없는, 심지어 일, 시간 등 그럼에 따라 여러 다른 코드 경로가있을 수 있다는 것입니다 이 저장 프로 시저? 여러 결과 집합에 관계없이 조건문이 어떤 경우에?

    CREATE PROCEDURE dbo.foo
      @bar INT
    AS
    BEGIN
      SET NOCOUNT ON;
    
      IF @bar = 1
        SELECT a, b, c FROM dbo.blat;
      ELSE
        SELECT d, e, f, g, h FROM dbo.splunge;
    END
    GO
    

    저장 프로 시저가 코드 경로를 가지고 있지 않으며, 당신은 당신이 항상 같은 결과 집합을 볼 것이다 (그리고 값이 저장 프로 시저가 아닌 선택적 매개 변수가있는 경우 공급해야하는지 사전에 확인할 수 있습니다) 확신이 있다면, 간단한 예제를 보자 :

    CREATE PROCEDURE dbo.bar
    AS
    BEGIN
      SET NOCOUNT ON;
    
      SELECT a = 'a', b = 1, c = GETDATE();
    END
    GO
    

    한 가지 방법은 같은 것을 할 것입니다 :

    SET FMTONLY ON;
    GO
    EXEC dbo.bar;
    

    이렇게하면 빈 결과 집합을 제공하고 클라이언트 응용 프로그램은 열 이름과 데이터 유형을 결정하는 결과 집합의 특성을 살펴 수 있습니다.

    이제 SET FMTONLY ON 많은 문제가있다; 여기에 가지 않을거야,하지만 적어도이 명령이 지원되지 않습니다 있음을 주목해야한다 - 좋은 이유. 또한 SET FMTONLY OFF에주의; 당신은 완료, 또는 당신이 그것을 실행할 수 없습니다 성공적 저장 프로 시저를 만들 수 있지만, 당신은 왜 궁금 있습니다 때. 그냥 나 한테 일어난 때문에 아니, 나는 그것에 대해 당신을 경고하고 있지 않다. 정직한. :-)

    OPENQUERY는 합성 가능한 결과 집합을 저장 프로 시저를 실행하지만 반환 같은 루프백 연결된 서버를 작성하면 다음 도구를 사용할 수 있습니다 당신이 검사 할 수있는 (물론, 매우 느슨한 정의로 받아 들일하시기 바랍니다). 먼저 루프백 서버 (이 로컬 명명 된 인스턴스 FOO를 가정)을 작성 :

    USE master;
    GO
    EXEC sp_addlinkedserver @server = N'.\FOO', @srvproduct=N'SQL Server'
    GO
    EXEC sp_serveroption @server=N'.\FOO', @optname=N'data access', 
      @optvalue=N'true';
    

    이 같은 쿼리로 공급 위에 이제 우리는 절차를 수행 할 수 있습니다

    SELECT * INTO #t 
    FROM OPENQUERY([.\FOO], 'EXEC dbname.dbo.bar;')
    WHERE 1 = 0;
    
    SELECT c.name, t.name
    FROM tempdb.sys.columns AS c
    INNER JOIN sys.types AS t
    ON c.system_type_id = t.system_type_id
    WHERE c.[object_id] = OBJECT_ID('tempdb..#t');
    

    이 무시 별명 유형 인 sysname 예 정의 컬럼 개의 행을 표시 할 수도 (이전 사용자 정의 데이터 형이라고도 함)과. 그러나 위의은 생산에서 :

    name   name
    ----   --------
    b      int
    c      datetime
    a      varchar
    

    분명히이 여기에서 더 많은 작품 - VARCHAR을 길이를 표시하지 않습니다, 그리고 당신은 DATETIME2, 시간, 소수점 등 다른 유형의 정밀도 / 스케일을 얻을해야합니다. 하지만 그 시작이다.

    메타 데이터 검색을 훨씬 쉽게 만들 SQL 서버 2012의 몇 가지 새로운 기능이 있습니다. 위의 절차를 위해 우리는 다음과 같은 작업을 수행 할 수 있습니다 :

    SELECT name, system_type_name
    FROM sys.dm_exec_describe_first_result_set_for_object
    (
      OBJECT_ID('dbo.bar'), 
      NULL
    );
    

    무엇보다도이 사실은 우리를 위해 정밀도와 스케일과 결의 별칭 유형을 제공합니다. 이 수익률은 위의 절차를 들면 :

    name   system_type_name
    ----   ----------------
    a      varchar(1)
    b      int
    c      datetime
    

    별로 차이가 시각적으로하지만 당신은 다양한 정밀 모두에 다른 데이터 유형을 받기 시작이 기능은 당신을 위해 수행하는 추가 작업을 주셔서 감사합니다 당신을 확장 할 때.

    단점 :에서 SQL 서버 2012 (함수의 이름에서 알 수 있듯이)이 함수는 첫 번째 결과 집합을 위해 일 적어도.

  2. ==============================

    2.당신은 모든 저장 프로 시저 및 자신의 모든 매개 변수를 반환하려고합니까? 이런 식으로 뭔가 그것에 대해 작동합니다.

    당신은 모든 저장 프로 시저 및 자신의 모든 매개 변수를 반환하려고합니까? 이런 식으로 뭔가 그것에 대해 작동합니다.

    select * from information_schema.parameters
    

    저장 프로 시저에서 반환 된 열을 취득해야하는 경우를 살펴 여기에 걸릴 :

    열 이름 / 유형은 스토어드 프로 시저에서 리턴하기

  3. from https://stackoverflow.com/questions/14574773/retrieve-column-names-and-types-of-a-stored-procedure by cc-by-sa and MIT license