sp_describe_first_result_set(Transact-SQL)

 

이 항목은 다음에 적용됩니다.예SQL Server(2012부터 시작)예Azure SQL 데이터베이스아니요Azure SQL 데이터 웨어하우스아니요병렬 데이터 웨어하우스

가능한 첫 번째 결과 집합에 대 한 메타 데이터를 반환 합니다.는 Transact-SQL 일괄 처리 합니다. 일괄 처리에서 아무 결과도 반환되지 않은 경우 빈 결과 집합을 반환합니다. 오류가 발생 된 데이터베이스 엔진 정적 분석을 수행 하 여 실행 되는 첫 번째 쿼리에 대 한 메타 데이터를 확인할 수 없습니다. 동적 관리 뷰 sys.dm_exec_describe_first_result_set ( TRANSACT-SQL ) 같은 정보를 반환 합니다.

Topic link icon Transact-SQL 구문 표기 규칙

적용 대상: SQL Server (SQL Server 2012 ~ 현재 버전), Azure SQL 데이터베이스.
  
sp_describe_first_result_set [ @tsql = ] N'Transact-SQL_batch'   
    [ , [ @params = ] N'parameters' ]   
    [ , [ @browse_information_mode = ] <tinyint> ] ]  

[ @tsql = ] 'Transact SQL_batch'
하나 이상의 Transact-SQL 문입니다. Transact SQL_batchnvarchar (n) 또는 nvarchar (max)합니다.

[ @params = ] N'parameters'
@params 에 대 한 매개 변수에 대 한 선언 문자열을 제공 된 Transact-SQL 일괄 처리는 sp_executesql과 비슷하게를 합니다. 매개 변수가 필요할 수 nvarchar (n) 또는 nvarchar (max)합니다.

에 포함 된 모든 매개 변수 정의 포함 하는 하나의 문자열의 Transact-SQL_batch합니다. 문자열은 유니코드 상수 또는 유니코드 변수여야 합니다. 각 매개 변수의 정의는 매개 변수 이름과 데이터 형식으로 구성됩니다. n 추가 매개 변수 정의 나타내는 자리 표시자입니다. 문에 지정 된 모든 매개 변수에서 정의 해야 @params. 경우는 Transact-SQL 문 또는 문의 일괄 처리, 매개 변수가 없는 @params 필요 하지 않습니다. NULL이 이 매개 변수의 기본값입니다.

[ @browse_information_mode = ] tinyint
추가 키 열과 원본 테이블 정보를 반환할지 여부를 지정합니다. 1로 설정되면 쿼리에 FOR BROWSE 옵션이 포함된 것처럼 각 쿼리가 분석됩니다. 추가 키 열과 원본 테이블 정보가 반환됩니다.

  • 0으로 설정되면 정보가 반환되지 않습니다.

  • 1로 설정되면 쿼리에 FOR BROWSE 옵션이 포함된 것처럼 각 쿼리가 분석됩니다. 그러면 원본 열 정보로 기본 테이블 이름을 반환합니다.

  • 2로 설정되면 쿼리에 커서 준비 또는 실행에 사용되는 것처럼 각 쿼리가 분석됩니다. 그러면 원본 열 정보로 보기 이름을 반환합니다.

sp_describe_first_result_set 항상 성공 시 0의 상태를 반환 합니다. 프로시저는 오류가 발생 하는 경우 프로시저가 RPC로 호출 될 sys.dm_exec_describe_first_result_set의 error_type 열에 설명 된 오류 형식으로 반환 상태가 채워집니다. Transact-SQL에서 프로시저를 호출한 경우 반환 값은 오류가 발생한 경우에도 항상 0입니다.

이 공통 메타데이터는 결과 메타데이터의 각 열에 대한 하나의 행이 포함된 결과 집합으로 반환됩니다. 각 행은 다음 섹션에 설명된 형식으로 열의 유형과 Null 허용 여부를 설명합니다. 모든 제어 경로에 대해 첫 번째 문이 없을 경우 행이 0개인 결과 집합이 반환됩니다.

열 이름데이터 형식Description
is_hidden비트 NOT NULL해당 열이 정보 검색을 목적으로 추가되어 실제로 결과 집합에 나타나지 않는 별도의 열임을 나타냅니다.
column_ordinalint NULL이 아님결과 집합에서 열의 서수 위치를 포함합니다. 첫째 열의 위치가 1로 지정됩니다.
namesysname NULL이름을 확인할 수 있으면 열 이름을 포함하고 그렇지 않으면 NULL을 포함합니다.
is_nullable비트 NOT NULL열이 NULL을 허용하는 경우 1, 열이 NULL을 허용하지 않는 경우 0, 열이 NULL을 허용하는지 확인할 수 없는 경우 1을 포함합니다.
system_type_idint NULL이 아님Sys.types에 지정 된 대로 열 데이터 형식의 system_type_id를 포함합니다. CLR 형식의 경우 system_type_name 열에서 NULL을 반환해도 이 열은 값 240을 반환합니다.
system_type_namenvarchar (256) NULL열의 데이터 형식에 지정한 이름 및 인수(length, precision, scale 등)를 포함합니다. 데이터 형식이 사용자 정의 별칭 형식인 경우 기본 시스템 형식이 여기에 지정됩니다. 데이터 형식이 CLR 사용자 정의 형식인 경우 이 열에 NULL이 반환됩니다.
max_lengthsmallint NULL이 아님열의 최대 길이(바이트)입니다.

-1 = 열 데이터 형식이 varchar (max), nvarchar (max), varbinary (max), 또는 xml합니다.

에 대 한 텍스트 열은 max_length 값 16 또는 값으로 설정 됩니다 sp_tableoption 'text in row'합니다.
전체 자릿수tinyint NULL이 아님숫자 기반일 경우 열의 전체 자릿수이고 그렇지 않으면 0을 반환합니다.
크기 조정tinyint NULL이 아님숫자 기반일 경우 열의 소수 자릿수이고 그렇지 않으면 0을 반환합니다.
데이터 정렬 이름sysname NULL문자 기반일 경우 열의 데이터 정렬 이름이고 그렇지 않으면 NULL을 반환합니다.
user_type_idint NULLCLR 및 별칭 형식의 경우 sys.types에 지정된 대로 열 데이터 형식의 user_type_id를 포함합니다. 그렇지 않으면 NULL입니다.
user_type_databasesysname NULLCLR 및 별칭 형식의 경우 해당 형식이 정의된 데이터베이스의 이름을 포함합니다. 그렇지 않으면 NULL입니다.
user_type_schemasysname NULLCLR 및 별칭 형식의 경우 해당 형식이 정의된 스키마의 이름을 포함합니다. 그렇지 않으면 NULL입니다.
user_type_namesysname NULLCLR 및 별칭 형식의 경우 형식 이름입니다. 그렇지 않으면 NULL입니다.
assembly_qualified_type_namenvarchar (4000)CLR 형식의 경우 형식을 정의하는 어셈블리 및 클래스 이름을 반환합니다. 그렇지 않으면 NULL입니다.
xml_collection_idint NULLsys.columns에 지정한 대로 열 데이터 형식의 xml_collection_id를 포함합니다. 반환된 형식이 XML 스키마 컬렉션과 연결되지 않은 경우 이 열은 NULL을 반환합니다.
xml_collection_databasesysname NULL이 형식과 연결된 XML 스키마 컬렉션이 정의된 데이터베이스를 포함합니다. 반환된 형식이 XML 스키마 컬렉션과 연결되지 않은 경우 이 열은 NULL을 반환합니다.
xml_collection_schemasysname NULL이 형식과 연결된 XML 스키마 컬렉션이 정의된 스키마를 포함합니다. 반환된 형식이 XML 스키마 컬렉션과 연결되지 않은 경우 이 열은 NULL을 반환합니다.
xml_collection_namesysname NULL이 형식과 연결된 XML 스키마 컬렉션 이름을 포함합니다. 반환된 형식이 XML 스키마 컬렉션과 연결되지 않은 경우 이 열은 NULL을 반환합니다.
is_xml_document비트 NOT NULL반환된 데이터 형식이 XML이고 해당 형식이 XML 조각이 아닌 완전한 XML 문서(루트 노드 포함)라고 보장될 경우 1을 반환합니다. 그렇지 않으면 0을 반환합니다.
is_case_sensitive비트 NOT NULL열이 대/소문자를 구분하는 문자열 형식인 경우 1을 반환하고 그렇지 않으면 0을 반환합니다.
is_fixed_length_clr_type비트 NOT NULL열이 고정 길이 CLR 형식인 경우 1을 반환하고 그렇지 않으면 0을 반환합니다.
source_serversysname이 결과에서 열이 반환한 원본 서버의 이름입니다(원본이 원격 서버인 경우). Sys.servers에 표시 된 대로 이름이 지정 됩니다. 열의 원본이 로컬 서버이거나 원본 서버를 확인할 수 없는 경우 NULL을 반환합니다. 정보 검색을 요청할 경우에만 채워집니다.
source_databasesysname이 결과에서 열이 반환한 원본 데이터베이스 이름입니다. 데이터베이스를 확인할 수 없는 경우 NULL을 반환합니다. 정보 검색을 요청할 경우에만 채워집니다.
source_schemasysname이 결과에서 열이 반환한 원본 스키마 이름입니다. 스키마를 확인할 수 없는 경우 NULL을 반환합니다. 정보 검색을 요청할 경우에만 채워집니다.
source_tablesysname이 결과에서 열이 반환한 원본 테이블 이름입니다. 테이블을 확인할 수 없는 경우 NULL을 반환합니다. 정보 검색을 요청할 경우에만 채워집니다.
source_columnsysname결과 열에서 반환한 원본 열의 이름입니다. 열을 확인할 수 없는 경우 NULL을 반환합니다. 정보 검색을 요청할 경우에만 채워집니다.
is_identity_columnNULL 비트열이 ID 열일 경우 1을 반환하고 그렇지 않으면 0을 반환합니다. 열이 ID 열인지 확인할 수 없으면 NULL을 반환합니다.
is_part_of_unique_keyNULL 비트열이 고유 인덱스의 일부일 경우(unique 및 primary 제약 조건 포함) 1을 반환하고 그렇지 않으면 0을 반환합니다. 열이 고유 인덱스의 일부인지 확인할 수 없으면 NULL을 반환합니다. 정보 검색을 요청할 경우에만 채워집니다.
is_updateableNULL 비트열이 업데이트 가능할 경우 1을 반환하고 그렇지 않으면 0을 반환합니다. 열이 업데이트 가능한지 확인할 수 없으면 NULL을 반환합니다.
is_computed_columnNULL 비트열이 계산 열일 경우 1을 반환하고 그렇지 않으면 0을 반환합니다. 열이 계산 열인지 확인할 수 없으면 NULL을 반환합니다.
is_sparse_column_setNULL 비트열이 스파스 열일 경우 1을 반환하고 그렇지 않으면 0을 반환합니다. 열이 스파스 열 집합의 일부인지 확인할 수 없으면 NULL을 반환합니다.
ordinal_in_order_by_listsmallint NULLORDER BY 목록에서 이 열의 위치입니다. 열이 ORDER BY 목록에 없거나 ORDER BY 목록을 고유하게 확인할 수 없을 경우 NULL을 반환합니다.
order_by_list_lengthsmallint NULLORDER BY 목록의 길이입니다. ORDER BY 목록이 없거나 ORDER BY 목록을 고유하게 확인할 수 없는 경우 NULL을 반환합니다. 이 값은 동일 하 게 하 여 반환 된 모든 행에 대 한 참고 sp_describe_first_result_set 합니다.
order_by_is_descendingsmallint NULLOrdinal_in_order_by_list가 NULL 인 경우는 order_by_is_descending 열이이 열에 대 한 ORDER BY 절의 방향을 보고 합니다. 그렇지 않으면 NULL을 보고합니다.
tds_type_idint NULL이 아님내부적으로만 사용할 수 있습니다.
tds_lengthint NULL이 아님내부적으로만 사용할 수 있습니다.
tds_collation_idint NULL내부적으로만 사용할 수 있습니다.
tds_collation_sort_idtinyint NULL내부적으로만 사용할 수 있습니다.

sp_describe_first_result_set 프로시저 (가상)에 대 한 첫 번째 결과 집합 메타 데이터를 반환 하는 경우 일괄 처리는 한 경우 해당 일괄 처리 (A) 후 실행 보장이 다음 일괄 처리는 (1) 최적화 시간 오류를 발생 시킵니다, (2) 런타임 오류를 발생 시킵니다, (3) 없는 결과 집합을 반환 하거나 (4)-첫 번째 결과 집합을 설명 하는 동일한 메타 데이터를 반환 하는 중 sp_describe_first_result_set합니다.

이름, Null 허용 여부 및 데이터 형식이 다를 수 있습니다. 경우 sp_describe_first_result_set 반환 보증은 빈 결과 집합은 일괄 처리 실행 없음 결과 집합을 반환 합니다.

이 보장은 서버의 관련 스키마 변경 사항이 없는 것으로 가정합니다. 관련 스키마 변경 내용을 서버에 임시 테이블을 만들고 포함 하지 않거나 테이블 변수는 일괄 처리 시간 사이에서는 sp_describe_first_result_set 라고 B. 일괄 처리에 의해 변경 하는 스키마를 포함 하 여 실행 하는 동안 결과 집합이 반환 되는 시간

sp_describe_first_result_set 다음과 같은 경우에 오류를 반환 합니다.

  • 하는 경우 입력 @tsql 유효 하지 않거나 Transact-SQL 일괄 처리 합니다. 유효성을 구문 분석 하 고 분석 하 여 결정 됩니다는 Transact-SQL 일괄 처리 합니다. 결정할 때 쿼리 최적화 중 또는 실행 하는 동안 일괄 처리에 의해 발생 한 오류는 아닙니다 여부는 Transact-SQL 일괄 처리가 유효 합니다.

  • 경우 @params NULL이 아닌 문자열을 포함 하는 문자열을 포함 하는 경우를 선언 하는 모든 매개 변수 한 번 이상 또는 매개 변수에 대해 구문상 유효한 선언 문자열이 아닙니다.

  • 하는 경우 입력 Transact-SQL 일괄 처리에서 선언 된 매개 변수 같은 이름의 지역 변수를 선언 @params.

  • 해당 문에서 임시 테이블을 사용하는 경우

  • 쿼리에 다음으로 쿼리되는 영구 테이블 생성이 포함되는 경우

다른 모든 확인이 성공한 경우에는 입력 일괄 처리 내에서 가능한 모든 제어 흐름 경로가 고려됩니다. 에이 이동 계정 모든 제어 흐름 문 (GOTO, IF/ELSE, WHILE 및 Transact-SQL TRY/CATCH 블록) 동적 모든 절차와 Transact-SQL 일괄 처리 또는 트리거 EXEC 문, DDL 트리거를 발생 시키는 DDL 문 또는 외래 키 제약 조건에 연계 동작으로 인해 수정 하는 테이블 또는 대상 테이블에서 발생 하는 트리거를 발생 시키는 DML 문에 의해 입력된 일괄 처리에서 호출 합니다. 가능한 대부분의 제어 경로에서 특정 시점에 알고리즘이 중지됩니다.

각 제어 흐름 경로 대 한 첫 번째 문 (있는 경우)를 반환 하는 결과 집합에 따른 sp_describe_first_result_set합니다.

일괄 처리에서 가능한 첫 번째 문이 여러 개 발견된 경우 해당 결과는 열 수, 열 이름, Null 허용 여부 및 데이터 형식이 다를 수 있습니다. 이러한 차이점이 처리되는 방식은 다음과 같습니다.

  • 열 수가 다른 경우 오류가 발생하고 아무 결과도 반환되지 않습니다.

  • 열 이름이 다른 경우 반환되는 열 이름이 NULL로 설정됩니다.

  • Null 허용 여부가 다른 경우 반환되는 Null 허용 여부가 NULL을 허용합니다.

  • 데이터 형식이 다른 경우 다음 조합 외에는 오류가 발생하고 아무 결과도 반환되지 않습니다.

    • varchar(a)varchar(a') 여기서는 ' >는 합니다.

    • varchar(a)varchar (max)

    • nvarchar(a)nvarchar(a') 여기서는 ' >는 합니다.

    • nvarchar(a)nvarchar (max)

    • varbinary(a)varbinary(a') 여기서는 ' >는 합니다.

    • varbinary(a)varbinary (max)

sp_describe_first_result_set 간접 재귀를 지원 하지 않습니다.

실행할 수 있는 권한이 필요는 @tsql 인수입니다.

일반적인 예

1. 간단한 예

다음 예에서는 단일 쿼리에서 반환되는 결과 집합을 설명합니다.

sp_describe_first_result_set @tsql = N'SELECT object_id, name, type_desc FROM sys.indexes'  

다음 예에서는 매개 변수가 포함된 단일 쿼리에서 반환되는 결과 집합을 보여 줍니다.

sp_describe_first_result_set @tsql =   
N'SELECT object_id, name, type_desc   
FROM sys.indexes   
WHERE object_id = @id1'  
, @params = N'@id1 int'  

2. 찾아보기 모드 예제

다음 세 가지 예제는 여러 가지 탐색 정보 모드 간의 주요 차이점을 보여줍니다. 쿼리 결과에는 관련된 열만 포함되었습니다.

정보가 없음을 나타내는 0을 반환하는 예제가 반환됩니다.

CREATE TABLE dbo.t (a int PRIMARY KEY, b1 int);  
GO  
CREATE VIEW dbo.v AS SELECT b1 AS b2 FROM dbo.t;  
GO  
EXEC sp_describe_first_result_set N'SELECT b2 AS b3 FROM dbo.v', null, 0;  

결과 집합은 다음과 같습니다.

is_hiddencolumn_ordinalnamesource_schemasource_tablesource_columnis_part_of_unique_key
01b3NULLNULLNULLNULL

1을 사용하는 예제는 쿼리에 FOR BROWSE 옵션이 포함된 것처럼 정보를 반환합니다.

EXEC sp_describe_first_result_set N'SELECT b2 AS b3 FROM v', null, 1  
  

결과 집합은 다음과 같습니다.

is_hiddencolumn_ordinalnamesource_schemasource_tablesource_columnis_part_of_unique_key
01b3dbotB10
12adbota1

마치 커서를 준비하는 것처럼 분석됨을 나타내는 2를 사용하는 예제.

EXEC sp_describe_first_result_set N'SELECT b2 AS b3 FROM v', null, 2  

결과 집합은 다음과 같습니다.

is_hiddencolumn_ordinalnamesource_schemasource_tablesource_columnis_part_of_unique_key
01B 3dbovB 20
12ROWSTATNULLNULLNULL0

문제 예

다음 예에서는 모두 두 개의 테이블을 사용합니다. 예제 테이블을 만들려면 다음 문을 실행합니다.

CREATE TABLE dbo.t1 (a int NULL, b varchar(10) NULL, c nvarchar(10) NULL);  
CREATE TABLE dbo.t2 (a smallint NOT NULL, d varchar(20) NOT NULL, e int NOT NULL);  

서로 다른 열 수로 인한 오류

이 예에서는 가능한 첫 번째 결과 집합의 열 수가 서로 다릅니다.

sp_describe_first_result_set @tsql =   
N'  
IF(1=1)  
    SELECT a FROM t1;  
ELSE  
    SELECT a, b FROM t1;  
SELECT * FROM t; -- Ignored, not a possible first result set.'  
  

서로 다른 데이터 형식으로 인한 오류

여러 개의 가능한 첫 번째 결과 집합에서 열 형식이 서로 다릅니다.

sp_describe_first_result_set @tsql =   
N'  
IF(1=1)  
    SELECT a FROM t1;  
ELSE  
    SELECT a FROM t2;  

결과: 오류, 일치 하지 않는 형식 (int 비교 smallint).

열 이름을 확인할 수 없는 경우

가능한 첫 번째 결과 집합의 열이 동일한 가변 길이 형식의 길이, Null 허용 여부 및 열 이름이 서로 다릅니다.

sp_describe_first_result_set @tsql =   
N'  
IF(1=1)  
    SELECT b FROM t1;  
ELSE  
    SELECT d FROM t2; '  

결과: < 알 수 없는 열 이름> varchar (20) NULL

별칭을 통해 동일해진 열 이름

이전 예와 동일하지만, 열 별칭을 통해 열 이름이 같아진 경우입니다.

sp_describe_first_result_set @tsql =   
N'  
IF(1=1)  
    SELECT b FROM t1;  
ELSE  
    SELECT d AS b FROM t2;'  

결과: b varchar (20) NULL

일치하지 않는 열 형식으로 인한 오류

여러 개의 가능한 첫 번째 결과 집합에서 열 형식이 서로 다릅니다.

sp_describe_first_result_set @tsql =   
N'  
IF(1=1)  
    SELECT b FROM t1;  
ELSE  
    SELECT c FROM t1;'  

결과: 오류, 일치 하지 않는 형식 (varchar (10) 비교 nvarchar (10)).

결과 집합이 오류를 반환할 수 있음

첫 번째 결과 집합이 오류 또는 결과 집합입니다.

sp_describe_first_result_set @tsql =   
N'  
IF(1=1)  
    RAISERROR(''Some Error'', 16, 1);  
  
ELSE  
    SELECT a FROM t1;  
SELECT e FROM t2; -- Ignored, not a possible first result set.;'  

결과:는 intNULL

일부 코드 경로에서 아무 결과도 반환하지 않음

첫 번째 결과 집합이 Null 또는 결과 집합입니다.

sp_describe_first_result_set @tsql =   
N'  
IF(1=1)  
    RETURN;  
SELECT a FROM t1;'  

결과:는 intNULL

동적 SQL의 결과

첫 번째 결과 집합이 리터럴 문자열이기 때문에 검색 가능한 동적 SQL입니다.

sp_describe_first_result_set @tsql =   
N'EXEC(N''SELECT a FROM t1'');'  

결과:는 INT NULL

동적 SQL로 인한 결과 오류

첫 번째 결과 집합이 동적 SQL로 인해 정의되지 않습니다.

sp_describe_first_result_set @tsql =   
N'  
DECLARE @SQL NVARCHAR(max);  
SET @SQL = N''SELECT a FROM t1 WHERE 1 = 1 '';  
IF(1=1)  
    SET @SQL += N'' AND e > 10 '';  
EXEC(@SQL); '  

결과: 오류입니다. 동적 SQL로 인해 결과를 검색할 수 없습니다.

사용자가 지정한 결과 집합

첫 번째 결과 집합을 사용자가 수동으로 지정합니다.

sp_describe_first_result_set @tsql =   
N'  
DECLARE @SQL NVARCHAR(max);  
SET @SQL = N''SELECT a FROM t1 WHERE 1 = 1 '';  
IF(1=1)  
    SET @SQL += N'' AND e > 10 '';  
EXEC(@SQL)  
    WITH RESULT SETS(  
        (Column1 BIGINT NOT NULL)  
    ); '  

결과: Column1 bigint NULL이 아님

불확실한 결과 집합으로 인한 오류

이 예제 user1 라는 이름의 다른 사용자에 열이 있는 기본 스키마 s 1에서 t 1 이라는 테이블이 있다고 가정 (한 int NOT NULL).

sp_describe_first_result_set @tsql =   
N'  
    IF(@p > 0)  
    EXECUTE AS USER = ''user1'';  
    SELECT * FROM t1;'  
, @params = N'@p int'  

결과: 오류입니다. 다른 dbo.t1 또는 열 수가 서로 다르므로 서로 s1.t1 t1 수 있습니다.

불확실한 결과 집합이 포함된 결과

이전 예와 동일한 가정을 사용합니다.

sp_describe_first_result_set @tsql =   
N'  
    IF(@p > 0)  
    EXECUTE AS USER = ''user1'';  
    SELECT a FROM t1;'  

결과:는 int NULL dbo.t1.a와 s1.t1.a 형식을 가지 int null 허용 여부가 있습니다.

sp_describe_undeclared_parameters & #40입니다. TRANSACT-SQL )
sys.dm_exec_describe_first_result_set & #40입니다. TRANSACT-SQL )
sys.dm_exec_describe_first_result_set_for_object & #40입니다. TRANSACT-SQL )

커뮤니티 추가 항목

추가
표시: