[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.[난 그냥 내가 전에이 질문에 대답했습니다 실현]
[난 그냥 내가 전에이 질문에 대답했습니다 실현]
저장 프로 시저에 대해 이렇게하면 훨씬 더가 뷰 또는 테이블에 대한보다 복잡하다. 문제 중 하나는 저장 프로 시저가 당신의 출력으로보고 무엇을 기대 예를 들어, 입력 매개 변수 및 서버 상태처럼 통제 할 수없는, 심지어 일, 시간 등 그럼에 따라 여러 다른 코드 경로가있을 수 있다는 것입니다 이 저장 프로 시저? 여러 결과 집합에 관계없이 조건문이 어떤 경우에?
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.당신은 모든 저장 프로 시저 및 자신의 모든 매개 변수를 반환하려고합니까? 이런 식으로 뭔가 그것에 대해 작동합니다.
당신은 모든 저장 프로 시저 및 자신의 모든 매개 변수를 반환하려고합니까? 이런 식으로 뭔가 그것에 대해 작동합니다.
select * from information_schema.parameters
저장 프로 시저에서 반환 된 열을 취득해야하는 경우를 살펴 여기에 걸릴 :
열 이름 / 유형은 스토어드 프로 시저에서 리턴하기
from https://stackoverflow.com/questions/14574773/retrieve-column-names-and-types-of-a-stored-procedure by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL의 모든 열 값 CONCAT (0) | 2020.05.19 |
---|---|
[SQL] SQL : 기본값 대 NULL 값을 사용하여 (0) | 2020.05.19 |
[SQL] SQLCMD를 사용하여 PostDeployment.sql 스크립트에 조건부 논리 (0) | 2020.05.19 |
[SQL] 어떻게 그룹에 월별 날짜 필드에서 SQL을 사용하여 (0) | 2020.05.19 |
[SQL] 백엔드 버전은 디자인 데이터베이스 다이어그램 또는 테이블에 지원되지 않습니다 (0) | 2020.05.19 |