다음을 통해 공유


sp_describe_first_result_set(Transact-SQL)

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

항목 링크 아이콘 Transact-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_batch는 nvarchar(n) 또는 nvarchar(max)일 수 있습니다.

  • [ @params = ] N'parameters'
    @params는 sp_executesql과 비슷하게 Transact-SQL 일괄 처리를 위해 매개 변수에 대한 선언 문자열을 제공합니다. 매개 변수는 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개인 결과 집합이 반환됩니다.

열 이름

데이터 형식

설명

is_hidden

bit NOT NULL

해당 열이 정보 검색을 목적으로 추가되어 실제로 결과 집합에 나타나지 않는 별도의 열임을 나타냅니다.

column_ordinal

int NOT NULL

결과 집합에서 열의 서수 위치를 포함합니다. 첫째 열의 위치가 1로 지정됩니다.

name

sysname NULL

이름을 확인할 수 있으면 열 이름을 포함하고 그렇지 않으면 NULL을 포함합니다.

is_nullable

bit NOT NULL

열이 NULL을 허용하는 경우 1, 열이 NULL을 허용하지 않는 경우 0, 열이 NULL을 허용하는지 확인할 수 없는 경우 1을 포함합니다.

system_type_id

int NOT NULL

sys.types에 지정된 대로 열 데이터 형식의 system_type_id를 포함합니다. CLR 형식의 경우 system_type_name 열에서 NULL을 반환해도 이 열은 값 240을 반환합니다.

system_type_name

nvarchar(256) NULL

열의 데이터 형식에 지정한 이름 및 인수(length, precision, scale 등)를 포함합니다. 데이터 형식이 사용자 정의 별칭 형식인 경우 기본 시스템 형식이 여기에 지정됩니다. 데이터 형식이 CLR 사용자 정의 형식인 경우 이 열에 NULL이 반환됩니다.

max_length

smallint NOT NULL

열의 최대 길이(바이트)입니다.

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

text 열의 경우 max_length 값은 16이거나 sp_tableoption 'text in row'에서 설정한 값이 됩니다.

precision

tinyint NOT NULL

숫자 기반일 경우 열의 전체 자릿수이고 그렇지 않으면 0을 반환합니다.

scale

tinyint NOT NULL

숫자 기반일 경우 열의 소수 자릿수이고 그렇지 않으면 0을 반환합니다.

collation_name

sysname NULL

문자 기반일 경우 열의 데이터 정렬 이름이고 그렇지 않으면 NULL을 반환합니다.

user_type_id

int NULL

CLR 및 별칭 형식의 경우 sys.types에 지정된 대로 열 데이터 형식의 user_type_id를 포함합니다. 그렇지 않으면 NULL입니다.

user_type_database

sysname NULL

CLR 및 별칭 형식의 경우 해당 형식이 정의된 데이터베이스의 이름을 포함합니다. 그렇지 않으면 NULL입니다.

user_type_schema

sysname NULL

CLR 및 별칭 형식의 경우 해당 형식이 정의된 스키마의 이름을 포함합니다. 그렇지 않으면 NULL입니다.

user_type_name

sysname NULL

CLR 및 별칭 형식의 경우 형식 이름입니다. 그렇지 않으면 NULL입니다.

assembly_qualified_type_name

nvarchar(4000)

CLR 형식의 경우 형식을 정의하는 어셈블리 및 클래스 이름을 반환합니다. 그렇지 않으면 NULL입니다.

xml_collection_id

int NULL

sys.columns에 지정된 대로 열 데이터 형식의 xml_collection_id를 포함합니다. 반환된 형식이 XML 스키마 컬렉션과 연결되지 않은 경우 이 열은 NULL을 반환합니다.

xml_collection_database

sysname NULL

이 형식과 연결된 XML 스키마 컬렉션이 정의된 데이터베이스를 포함합니다. 반환된 형식이 XML 스키마 컬렉션과 연결되지 않은 경우 이 열은 NULL을 반환합니다.

xml_collection_schema

sysname NULL

이 형식과 연결된 XML 스키마 컬렉션이 정의된 스키마를 포함합니다. 반환된 형식이 XML 스키마 컬렉션과 연결되지 않은 경우 이 열은 NULL을 반환합니다.

xml_collection_name

sysname NULL

이 형식과 연결된 XML 스키마 컬렉션 이름을 포함합니다. 반환된 형식이 XML 스키마 컬렉션과 연결되지 않은 경우 이 열은 NULL을 반환합니다.

is_xml_document

bit NOT NULL

반환된 데이터 형식이 XML이고 해당 형식이 XML 조각이 아닌 완전한 XML 문서(루트 노드 포함)라고 보장될 경우 1을 반환합니다. 그렇지 않으면 0을 반환합니다.

is_case_sensitive

bit NOT NULL

열이 대/소문자를 구분하는 문자열 형식인 경우 1을 반환하고 그렇지 않으면 0을 반환합니다.

is_fixed_length_clr_type

bit NOT NULL

열이 고정 길이 CLR 형식인 경우 1을 반환하고 그렇지 않으면 0을 반환합니다.

source_server

sysname

이 결과에서 열이 반환한 원본 서버의 이름입니다(원본이 원격 서버인 경우). 이름은 sys.servers에 표시된 대로 지정됩니다. 열의 원본이 로컬 서버이거나 원본 서버를 확인할 수 없는 경우 NULL을 반환합니다. 정보 검색을 요청할 경우에만 채워집니다.

source_database

sysname

이 결과에서 열이 반환한 원본 데이터베이스 이름입니다. 데이터베이스를 확인할 수 없는 경우 NULL을 반환합니다. 정보 검색을 요청할 경우에만 채워집니다.

source_schema

sysname

이 결과에서 열이 반환한 원본 스키마 이름입니다. 스키마를 확인할 수 없는 경우 NULL을 반환합니다. 정보 검색을 요청할 경우에만 채워집니다.

source_table

sysname

이 결과에서 열이 반환한 원본 테이블 이름입니다. 테이블을 확인할 수 없는 경우 NULL을 반환합니다. 정보 검색을 요청할 경우에만 채워집니다.

source_column

sysname

결과 열에서 반환한 원본 열의 이름입니다. 열을 확인할 수 없는 경우 NULL을 반환합니다. 정보 검색을 요청할 경우에만 채워집니다.

is_identity_column

bit NULL

열이 ID 열일 경우 1을 반환하고 그렇지 않으면 0을 반환합니다. 열이 ID 열인지 확인할 수 없으면 NULL을 반환합니다.

is_part_of_unique_key

bit NULL

열이 고유 인덱스의 일부일 경우(unique 및 primary 제약 조건 포함) 1을 반환하고 그렇지 않으면 0을 반환합니다. 열이 고유 인덱스의 일부인지 확인할 수 없으면 NULL을 반환합니다. 정보 검색을 요청할 경우에만 채워집니다.

is_updateable

bit NULL

열이 업데이트 가능할 경우 1을 반환하고 그렇지 않으면 0을 반환합니다. 열이 업데이트 가능한지 확인할 수 없으면 NULL을 반환합니다.

is_computed_column

bit NULL

열이 계산 열일 경우 1을 반환하고 그렇지 않으면 0을 반환합니다. 열이 계산 열인지 확인할 수 없으면 NULL을 반환합니다.

is_sparse_column_set

bit NULL

열이 스파스 열일 경우 1을 반환하고 그렇지 않으면 0을 반환합니다. 열이 스파스 열 집합의 일부인지 확인할 수 없으면 NULL을 반환합니다.

ordinal_in_order_by_list

smallint NULL

ORDER BY 목록에서 이 열의 위치입니다. 열이 ORDER BY 목록에 없거나 ORDER BY 목록을 고유하게 확인할 수 없을 경우 NULL을 반환합니다.

order_by_list_length

smallint NULL

ORDER BY 목록의 길이입니다. ORDER BY 목록이 없거나 ORDER BY 목록을 고유하게 확인할 수 없는 경우 NULL을 반환합니다. sp_describe_first_result_set에서 반환하는 모든 열에 대해 이 값이 동일합니다.

order_by_is_descending

smallint NULL

ordinal_in_order_by_list가 NULL이 아닐 경우 order_by_is_descending 열에서 이 열에 대한 ORDER BY 절의 방향을 보고합니다. 그렇지 않으면 NULL을 보고합니다.

tds_type_id

int NOT NULL

내부적으로만 사용할 수 있습니다.

tds_length

int NOT NULL

내부적으로만 사용할 수 있습니다.

tds_collation_id

int NULL

내부적으로만 사용할 수 있습니다.

tds_collation_sort_id

tinyint NULL

내부적으로만 사용할 수 있습니다.

주의

sp_describe_first_result_set는 프로시저에서 가상 일괄 처리 A에 대한 첫 번째 결과 집합 메타데이터를 반환하고, 이후에 일괄 처리(A)가 실행되는 경우 해당 일괄 처리에서 (1) 최적화 시간 오류를 발생시키거나, (2) 런타임 오류를 발생시키거나, (3) 아무 결과 집합도 반환하지 않거나, (4) sp_describe_first_result_set에서 설명하는 것과 동일한 메타데이터가 있는 첫 번째 결과 집합을 반환하도록 합니다.

이름, Null 허용 여부 및 데이터 형식이 다를 수 있습니다. sp_describe_first_result_set에서 빈 결과 집합을 반환하면 일괄 처리 실행에서 아무 결과 집합도 반환하지 않습니다.

이 보장은 서버의 관련 스키마 변경 사항이 없는 것으로 가정합니다. 일괄 처리 B에 의한 스키마 변경을 포함하여 sp_describe_first_result_set가 호출된 시점과 실행 중에 결과 집합이 반환된 시점 사이에 일괄 처리 A에서 임시 테이블 또는 테이블 변수가 생성된 것은 서버의 관련 스키마 변경 사항에서 제외됩니다.

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

  • @tsql 입력이 유효한 Transact-SQL 일괄 처리가 아닌 경우. 유효성은 Transact-SQL 일괄 처리에 대한 구문 분석을 통해 결정됩니다. 쿼리 최적화 또는 실행 중에 일괄 처리에서 발생한 오류는 Transact-SQL 일괄 처리가 유효한지 확인할 때 고려되지 않습니다.

  • @params가 NULL이 아니고 구문상 매개 변수에 유효한 선언 문자열이 아닌 문자열을 포함하는 경우 또는 매개 변수를 선언하는 문자열을 두 번 이상 포함하는 경우

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

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

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

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

각 제어 흐름 경로에 대해 결과 집합을 반환하는 첫 번째 문(있는 경우)은 sp_describe_first_result_set에 의해 결정됩니다.

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

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

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

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

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

    • varchar(a) 및 varchar(a')(여기서 a' > a)

    • varchar(a) to varchar(max)

    • nvarchar(a) 및 nvarchar(a')(여기서 a' > a)

    • nvarchar(a) to nvarchar(max)

    • varbinary(a) 및 varbinary(a')(여기서 a' > a)

    • varbinary(a) to 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_hidden

column_ordinal

name

source_schema

source_table

source_column

is_part_of_unique_key

0

1

b3

NULL

NULL

NULL

NULL

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

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

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

is_hidden

column_ordinal

name

source_schema

source_table

source_column

is_part_of_unique_key

0

1

b3

dbo

t

B1

0

1

2

a

dbo

t

a

1

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

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

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

is_hidden

column_ordinal

name

source_schema

source_table

source_column

is_part_of_unique_key

0

1

B3

dbo

v

B2

0

1

2

ROWSTAT

NULL

NULL

NULL

0

문제 예

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

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.;'

결과: a int NULL

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

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

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

결과: a int NULL

동적 SQL의 결과

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

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

결과: a 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 NOT NULL

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

이 예에서는 user1이라는 다른 사용자가 열(int NOT NULL)이 있는 기본 스키마 s1의 t1이라는 테이블을 소유한 것으로 가정합니다.

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

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

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

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

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

결과: dbo.t1.a와 s1.t1.a가 둘 다 int 형식이지만 Null 허용 여부가 서로 다르므로 a int NULL입니다.

참고 항목

참조

sp_describe_undeclared_parameters(Transact-SQL)

sys.dm_exec_describe_first_result_set(Transact-SQL)

sys.dm_exec_describe_first_result_set_for_object(Transact-SQL)