sp_describe_first_result_set(Transact-SQL)
적용 대상: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW) Microsoft Fabric의 SQL 분석 엔드포인트 Microsoft Fabric의 웨어하우스
Transact-SQL 일괄 처리의 가능한 첫 번째 결과 집합에 대한 메타데이터를 반환합니다. 일괄 처리에서 아무 결과도 반환되지 않은 경우 빈 결과 집합을 반환합니다. 데이터베이스 엔진 정적 분석을 수행하여 실행할 첫 번째 쿼리에 대한 메타데이터를 확인할 수 없는 경우 오류가 발생합니다. 동적 관리 뷰 sys.dm_exec_describe_first_result_set 동일한 정보를 반환합니다.
구문
sp_describe_first_result_set [ @tsql = ] N'tsql'
[ , [ @params = ] N'@parameter_name data_type [ , ... n ]' ]
[ , [ @browse_information_mode = ] <tinyint> ]
[ ; ]
인수
[ @tsql = ] 'tsql'
하나 이상의 Transact-SQL 문입니다. @tsql nvarchar(n) 또는 nvarchar(max)일 수 있습니다.
[ @params = ] N'@parameter_name data_type [ , ... n ]'
@params 다음과 유사한 Transact-SQL 일괄 처리에 대한 매개 변수에 대한 선언 문자열을 sp_executesql
제공합니다. 매개 변수는 nvarchar(n) 또는 nvarchar(max)일 수 있습니다.
@tsql 포함된 모든 매개 변수의 정의를 포함하는 문자열입니다. 문자열은 유니코드 상수 또는 유니코드 변수여야 합니다. 각 매개 변수 정의는 매개 변수 이름과 데이터 형식으로 구성됩니다. n 은 추가 매개 변수 정의를 나타내는 자리 표시자입니다. 문에 지정된 모든 매개 변수는 @params 정의해야 합니다. 문의 Transact-SQL 문 또는 일괄 처리에 매개 변수 가 포함되어 있지 않으면 @params 필요하지 않습니다. NULL
는 이 매개 변수의 기본값입니다.
[ @browse_information_mode = ] tinyint
추가 키 열 및 원본 테이블 정보가 반환되는지를 지정합니다. 설정 1
하면 각 쿼리는 쿼리에 옵션이 포함된 FOR BROWSE
것처럼 분석됩니다.
로 설정
0
하면 정보가 반환되지 않습니다.설정
1
하면 각 쿼리는 쿼리에 옵션이 포함된FOR BROWSE
것처럼 분석됩니다. 그러면 기본 테이블 이름이 원본 열 정보로 반환됩니다.설정된
2
경우 각 쿼리는 커서를 준비하거나 실행하는 데 사용되는 것처럼 분석됩니다. 이렇게 하면 뷰 이름이 원본 열 정보로 반환됩니다.
반환 코드 값
sp_describe_first_result_set
는 성공하면 항상 0의 상태를 반환합니다. 프로시저가 오류를 throw하고 프로시저가 RPC로 호출되면 반환 상태는 error_type 열 sys.dm_exec_describe_first_result_set
에 설명된 오류 유형으로 채워집니다. Transact-SQL에서 프로시저를 호출하는 경우 오류가 있는 경우에도 반환 값은 항상 0입니다.
결과 집합
이 일반적인 메타데이터는 결과 메타데이터의 각 열에 대해 하나의 행이 있는 결과 집합으로 반환됩니다. 각 행은 다음 섹션에 설명된 형식으로 열의 유형과 Null 허용 여부를 설명합니다. 모든 컨트롤 경로에 대해 첫 번째 문이 없으면 행이 0인 결과 집합이 반환됩니다.
열 이름 | 데이터 형식 | 설명 |
---|---|---|
is_hidden |
bit | 열이 정보 검색을 위해 추가된 추가 열이며 실제로 결과 집합에 표시되지 않음을 나타냅니다. Null을 허용하지 않습니다. |
column_ordinal |
int | 결과 집합에 있는 열의 서수 위치를 포함합니다. 첫 번째 열의 위치는 .로 1 지정됩니다. Null을 허용하지 않습니다. |
name |
sysname | 이름을 확인할 수 있는 경우 열의 이름을 포함합니다. 그렇지 않으면 .NULL Nullable. |
is_nullable |
bit | 열에서 허용하는 NULL 경우, 0 열이 허용하지 NULL 않는 경우 및 1 열이 허용하는NULL 지 확인할 수 없는 경우 값을 1 포함합니다. Null을 허용하지 않습니다. |
system_type_id |
int | 에 system_type_id 지정된 sys.types 열의 데이터 형식을 포함합니다. CLR 형식의 경우 열이 system_type_name 반환 NULL 되더라도 이 열은 값을 240 반환합니다. Null을 허용하지 않습니다. |
system_type_name |
nvarchar(256) | 열의 데이터 형식에 대해 지정된 이름 및 인수(예: 길이, 정밀도, 소수 자릿수)를 포함합니다. 데이터 형식이 사용자 정의 별칭 형식인 경우 기본 시스템 형식이 여기에 지정됩니다. CLR 사용자 정의 형식 NULL 인 경우 이 열에 반환됩니다. Nullable. |
max_length |
smallint | 열의 최대 길이(바이트)입니다.-1 = 열 데이터 형식은 varchar(max), nvarchar(max), varbinary(max) 또는 xml입니다.텍스트 열의 경우 값은 max_length .에 의해 sp_tableoption 'text in row' 설정된 값 또는 값입니다16 . Null을 허용하지 않습니다. |
precision |
tinyint | 숫자 기반일 경우 열의 전체 자릿수이고 그렇지 않으면 0 를 반환합니다. Null을 허용하지 않습니다. |
scale |
tinyint | 숫자 기반인 경우 열의 배율입니다. 그렇지 않으면 0 를 반환합니다. Null을 허용하지 않습니다. |
collation_name |
sysname | 문자 기반인 경우 열의 데이터 정렬 이름입니다. 그렇지 않으면 NULL 를 반환합니다. Nullable. |
user_type_id |
int | CLR 및 별칭 형식의 경우 에 지정된 sys.types 대로 열의 데이터 형식을 포함합니다user_type_id . 그렇지 않으면 .입니다 NULL . Nullable. |
user_type_database |
sysname | CLR 및 별칭 형식의 경우 해당 형식이 정의된 데이터베이스의 이름을 포함합니다. 그렇지 않으면 .입니다 NULL . Nullable. |
user_type_schema |
sysname | CLR 및 별칭 형식의 경우 해당 형식이 정의된 스키마의 이름을 포함합니다. 그렇지 않으면 .입니다 NULL . Nullable. |
user_type_name |
sysname | CLR 및 별칭 형식의 경우 형식 이름입니다. 그렇지 않으면 .입니다 NULL . Nullable. |
assembly_qualified_type_name |
nvarchar(4000) | CLR 형식의 경우 어셈블리의 이름과 형식을 정의하는 클래스를 반환합니다. 그렇지 않으면 .입니다 NULL . Nullable. |
xml_collection_id |
int | 에 xml_collection_id 지정된 sys.columns 열의 데이터 형식을 포함합니다. 반환된 형식이 XML 스키마 컬렉션과 연결되지 않은 경우 이 열이 반환 NULL 됩니다. Nullable. |
xml_collection_database |
sysname | 이 형식과 연결된 XML 스키마 컬렉션이 정의된 데이터베이스를 포함합니다. 반환된 형식이 XML 스키마 컬렉션과 연결되지 않은 경우 이 열이 반환 NULL 됩니다. Nullable. |
xml_collection_schema |
sysname | 이 형식과 연결된 XML 스키마 컬렉션이 정의된 스키마를 포함합니다. 반환된 형식이 XML 스키마 컬렉션과 연결되지 않은 경우 이 열이 반환 NULL 됩니다. Nullable. |
xml_collection_name |
sysname | 이 형식과 연결된 XML 스키마 컬렉션의 이름을 포함합니다. 반환된 형식이 XML 스키마 컬렉션과 연결되지 않은 경우 이 열이 반환 NULL 됩니다. Nullable. |
is_xml_document |
bit | 반환된 데이터 형식이 XML이고 해당 형식이 XML 조각이 아닌 완전한 XML 문서(루트 노드 포함)가 되도록 보장되는지를 반환 1 합니다. 그렇지 않으면 0 를 반환합니다. Null을 허용하지 않습니다. |
is_case_sensitive |
bit | 1 열이 대/소문자를 구분하는 문자열 형식이고 0 그렇지 않은 경우 반환합니다. Null을 허용하지 않습니다. |
is_fixed_length_clr_type |
bit | 1 열이 고정 길이 CLR 형식 0 이고 그렇지 않은 경우 반환합니다. Null을 허용하지 않습니다. |
source_server |
sysname | 이 결과의 열에서 반환된 원래 서버의 이름입니다(원격 서버에서 시작된 경우). 이름은 에 표시되면 지정됩니다 sys.servers . 열이 로컬 서버에서 시작되는지 또는 열이 시작되는 서버를 확인할 수 없는지 여부를 반환 NULL 합니다. 검색 정보가 요청된 경우에만 채워집니다. Nullable. |
source_database |
sysname | 이 결과의 열에서 반환된 원래 데이터베이스의 이름입니다. 데이터베이스를 확인할 수 없는 경우 반환 NULL 합니다. 검색 정보가 요청된 경우에만 채워집니다. Nullable. |
source_schema |
sysname | 이 결과의 열에서 반환된 원래 스키마의 이름입니다. 스키마를 확인할 수 없는 경우 반환 NULL 합니다. 검색 정보가 요청된 경우에만 채워집니다. Nullable. |
source_table |
sysname | 이 결과의 열에서 반환된 원래 테이블의 이름입니다. 테이블을 확인할 수 없는 경우 반환 NULL 합니다. 검색 정보가 요청된 경우에만 채워집니다. Nullable. |
source_column |
sysname | 결과 열에서 반환된 원래 열의 이름입니다. NULL 열을 확인할 수 없는 경우 반환합니다. 검색 정보가 요청된 경우에만 채워집니다. Nullable. |
is_identity_column |
bit | 열이 ID 열 0 이고 그렇지 않은 경우를 반환 1 합니다. NULL 열이 ID 열인지 확인할 수 없는 경우 반환합니다. Nullable. |
is_part_of_unique_key |
bit | 열이 고유 인덱스(고유 및 기본 제약 조건 포함)0 의 일부이고 그렇지 않은 경우를 반환 1 합니다. NULL 열이 고유 인덱스의 일부임을 확인할 수 없는 경우 반환합니다. 정보 검색을 요청할 경우에만 채워집니다. Nullable. |
is_updateable |
bit | 열이 업데이트 가능하고 0 업데이트할 수 없는 경우를 반환 1 합니다. 열을 업데이트할 수 있는지 확인할 수 없는 경우 반환 NULL 합니다. Nullable. |
is_computed_column |
bit | 열이 계산 열 0 이고 그렇지 않은 경우를 반환 1 합니다. NULL 열이 계산 열인지 확인할 수 없는 경우 반환합니다. Nullable. |
is_sparse_column_set |
bit | 1 열이 스파스 열 0 이고 그렇지 않은 경우 반환합니다. NULL 열이 스파스 열 집합의 일부임을 확인할 수 없는 경우 반환합니다. Nullable. |
ordinal_in_order_by_list |
smallint | 목록에 있는 이 열 ORDER BY 의 위치입니다. 열이 목록에 표시되지 ORDER BY 않거나 목록을 고유하게 확인할 수 없는 경우 ORDER BY 를 반환 NULL 합니다. Nullable. |
order_by_list_length |
smallint | 목록의 길이입니다 ORDER BY . 목록이 없거나 ORDER BY 목록을 고유하게 확인할 수 없는 경우 ORDER BY 반환 NULL 합니다. 이 값은 .에서 반환 sp_describe_first_result_set 하는 모든 행에 대해 동일합니다. Nullable. |
order_by_is_descending |
smallint | ordinal_in_order_by_list 그렇지 않은 NULL 경우 열은 order_by_is_descending 이 열에 대한 절의 ORDER BY 방향을 보고합니다. 그렇지 않으면 보고됩니다 NULL . Nullable. |
tds_type_id |
int | 내부용. Null을 허용하지 않습니다. |
tds_length |
int | 내부용. Null을 허용하지 않습니다. |
tds_collation_id |
int | 내부용. Nullable. |
tds_collation_sort_id |
tinyint | 내부용. Nullable. |
설명
sp_describe_first_result_set
는 프로시저가 (가상) 일괄 처리 A에 대한 첫 번째 결과 집합 메타데이터를 반환하고 해당 일괄 처리(A)가 실행되는 경우 일괄 처리 중 하나를 반환하도록 보장합니다.
- 최적화 시간 오류가 발생합니다.
- 런타임 오류가 발생합니다.
- 결과 집합을 반환하지 않습니다.
- 에서 설명한 것과 동일한 메타데이터를 사용하여 첫 번째 결과 집합을 반환합니다.
sp_describe_first_result_set
이름, Null 허용 여부 및 데이터 형식이 다를 수 있습니다. 빈 결과 집합을 반환하는 경우 sp_describe_first_result_set
일괄 처리 실행이 결과 없음 집합을 반환한다는 보장이 있습니다.
이 보장은 서버에 관련 스키마 변경 내용이 없다고 가정합니다. 서버의 관련 스키마 변경 사항에는 일괄 처리 A에서 임시 테이블 또는 테이블 변수를 만드는 것은 호출되는 sp_describe_first_result_set
시간과 실행 중에 결과 집합이 반환되는 시간(일괄 처리 B의 스키마 변경 포함)을 만드는 것을 포함하지 않습니다.
sp_describe_first_result_set
에서는 다음 중 한 가지 경우에 오류가 반환됩니다.
입력 @tsql 유효한 Transact-SQL 일괄 처리가 아닙니다. 유효성은 Transact-SQL 일괄 처리를 구문 분석하고 분석하여 결정됩니다. 쿼리 최적화 중 또는 실행 중에 일괄 처리로 인한 오류는 Transact-SQL 일괄 처리가 유효한지 여부를 결정할 때 고려되지 않습니다.
NULL
@params 매개 변수에 대해 구문적으로 유효한 선언 문자열이 아니거나 매개 변수를 두 번 이상 선언하는 문자열이 포함된 경우 문자열을 포함합니다.입력 Transact-SQL 일괄 처리는 @params 선언된 매개 변수와 동일한 이름의 지역 변수를 선언합니다.
이 문은 임시 테이블을 사용합니다.
쿼리에 다음으로 쿼리되는 영구 테이블 생성이 포함되는 경우
다른 모든 확인이 성공한 경우에는 입력 일괄 처리 내에서 가능한 모든 제어 흐름 경로가 고려됩니다. 모든 제어 흐름 문(GOTO
, IF
/ELSE
, WHILE
및 Transact-SQL/TRY
CATCH
블록)뿐만 아니라 문, DDL 트리거를 발생시키는 DDL 문 또는 외래 키 제약 조건에 대한 연속 작업으로 인해 수정된 테이블에서 트리거를 발생시키는 DML 문에 의해 EXEC
입력 일괄 처리에서 호출된 모든 프로시저, 동적 Transact-SQL 일괄 처리 또는 트리거를 고려합니다. 가능한 많은 제어 경로와 마찬가지로 어느 시점에서 알고리즘이 중지됩니다.
각 제어 흐름 경로에 대해 결과 집합을 반환하는 첫 번째 문(있는 경우)은 에 의해 sp_describe_first_result_set
결정됩니다.
일괄 처리에서 가능한 첫 번째 문이 여러 개 있으면 열 수, 열 이름, null 허용 여부 및 데이터 형식이 다를 수 있습니다. 이러한 차이점을 처리하는 방법은 여기에서 자세히 설명합니다.
열 수가 다르면 오류가 throw되고 결과가 반환되지 않습니다.
열 이름이 다른 경우 반환되는 열 이름은 .로
NULL
설정됩니다.null 허용 여부가 다르면 반환된 null 허용 성이 허용됩니다
NULL
.데이터 형식이 다른 경우 오류가 throw되고 다음 경우를 제외하고 결과가 반환되지 않습니다.
- varchar(a) to varchar(a') where a' > a.
- varchar(a) to varchar(max)
- nvarchar(a) to nvarchar(a') where a' > a.
- nvarchar(a)에서 nvarchar(max)로
- varbinary(a) to varbinary(a') where a' > a.
- varbinary(a)에서 varbinary(max)로
sp_describe_first_result_set
는 간접 재귀를 지원하지 않습니다.
사용 권한
@tsql 인수를 실행할 수 있는 권한이 필요합니다.
예제
일반적인 예제
A. 기본 예제
다음 예제에서는 단일 쿼리에서 반환된 결과 집합에 대해 설명합니다.
EXEC sp_describe_first_result_set @tsql = N'SELECT object_id, name, type_desc FROM sys.indexes';
다음 예에서는 매개 변수가 포함된 단일 쿼리에서 반환되는 결과 집합을 보여 줍니다.
EXEC sp_describe_first_result_set @tsql = N'
SELECT object_id, name, type_desc
FROM sys.indexes
WHERE object_id = @id1',
@params = N'@id1 int';
B. 찾아보기 모드 예제
다음 세 가지 예제는 여러 가지 탐색 정보 모드 간의 주요 차이점을 보여줍니다. 관련 열만 쿼리 결과에 포함됩니다.
정보가 반환되지 않음을 나타내는 using 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 |
C. 테이블에 결과 저장
일부 시나리오에서는 스키마를 추가로 처리할 수 있도록 프로시저 결과를 sp_describe_first_result_set
테이블에 배치해야 합니다.
먼저 프로시저의 sp_describe_first_result_set
출력과 일치하는 테이블을 만들어야 합니다.
CREATE TABLE #frs (
is_hidden BIT NOT NULL,
column_ordinal INT NOT NULL,
name SYSNAME NULL,
is_nullable BIT NOT NULL,
system_type_id INT NOT NULL,
system_type_name NVARCHAR(256) NULL,
max_length SMALLINT NOT NULL,
precision TINYINT NOT NULL,
scale TINYINT NOT NULL,
collation_name SYSNAME NULL,
user_type_id INT NULL,
user_type_database SYSNAME NULL,
user_type_schema SYSNAME NULL,
user_type_name SYSNAME NULL,
assembly_qualified_type_name NVARCHAR(4000),
xml_collection_id INT NULL,
xml_collection_database SYSNAME NULL,
xml_collection_schema SYSNAME NULL,
xml_collection_name SYSNAME NULL,
is_xml_document BIT NOT NULL,
is_case_sensitive BIT NOT NULL,
is_fixed_length_clr_type BIT NOT NULL,
source_server SYSNAME NULL,
source_database SYSNAME NULL,
source_schema SYSNAME NULL,
source_table SYSNAME NULL,
source_column SYSNAME NULL,
is_identity_column BIT NULL,
is_part_of_unique_key BIT NULL,
is_updateable BIT NULL,
is_computed_column BIT NULL,
is_sparse_column_set BIT NULL,
ordinal_in_order_by_list SMALLINT NULL,
order_by_list_length SMALLINT NULL,
order_by_is_descending SMALLINT NULL,
tds_type_id INT NOT NULL,
tds_length INT NOT NULL,
tds_collation_id INT NULL,
tds_collation_sort_id TINYINT NULL
);
테이블을 만들 때 해당 테이블에 일부 쿼리의 스키마를 저장할 수 있습니다.
DECLARE @tsql NVARCHAR(MAX) = 'select top 0 * from sys.credentials';
INSERT INTO #frs
EXEC sys.sp_describe_first_result_set @tsql;
SELECT * FROM #frs;
문제의 예
다음 예제에서는 모든 예제에 대해 두 개의 테이블을 사용합니다. 예제 테이블을 만들려면 다음 문을 실행합니다.
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
);
서로 다른 열 수로 인한 오류
이 예제에서는 가능한 첫 번째 결과 집합의 열 수가 다릅니다.
EXEC 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.';
데이터 형식이 다르기 때문에 오류 발생
열 형식은 가능한 첫 번째 결과 집합마다 다릅니다.
EXEC sp_describe_first_result_set @tsql = N'
IF (1 = 1)
SELECT a FROM t1;
ELSE
SELECT a FROM t2;';
이로 인해 형식이 일치하지 않는 오류가 발생합니다(int 및 smallint).
열 이름을 확인할 수 없습니다.
가능한 첫 번째 결과 집합의 열은 동일한 가변 길이 형식, null 허용 여부 및 열 이름에 대해 길이가 다릅니다.
EXEC sp_describe_first_result_set @tsql = N'
IF (1 = 1)
SELECT b FROM t1;
ELSE
SELECT d FROM t2;';
다음은 결과 집합의 일부입니다.
Column | 값 |
---|---|
name |
알 수 없는 열 이름 |
system_type_name |
varchar |
max_length |
20 |
is_nullable |
1 |
별칭을 통해 동일해진 열 이름
이전 예와 동일하지만, 열 별칭을 통해 열 이름이 같아진 경우입니다.
EXEC sp_describe_first_result_set @tsql = N'
IF (1 = 1)
SELECT b FROM t1;
ELSE
SELECT d AS b FROM t2;';
다음은 결과 집합의 일부입니다.
Column | 값 |
---|---|
name |
b |
system_type_name |
varchar |
max_length |
20 |
is_nullable |
1 |
열 형식을 일치시킬 수 없기 때문에 오류 발생
열 형식은 가능한 첫 번째 결과 집합마다 다릅니다.
EXEC sp_describe_first_result_set @tsql = N'
IF (1 = 1)
SELECT b FROM t1;
ELSE
SELECT c FROM t1;';
이로 인해 형식이 일치하지 않는 오류가 발생합니다(varchar(10) 및 nvarchar(10)).
결과 집합에서 오류를 반환할 수 있습니다.
첫 번째 결과 집합이 오류 또는 결과 집합입니다.
EXEC 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.';
다음은 결과 집합의 일부입니다.
Column | 값 |
---|---|
name |
a |
system_type_name |
int |
is_nullable |
1 |
일부 코드 경로에서 아무 결과도 반환하지 않음
첫 번째 결과 집합이 Null 또는 결과 집합입니다.
EXEC sp_describe_first_result_set @tsql = N'
IF (1 = 1)
RETURN;
SELECT a FROM t1;';
다음은 결과 집합의 일부입니다.
Column | 값 |
---|---|
name |
a |
system_type_name |
int |
is_nullable |
1 |
동적 SQL의 결과
첫 번째 결과 집합은 리터럴 문자열이므로 검색할 수 있는 동적 SQL입니다.
EXEC sp_describe_first_result_set @tsql = N'
EXEC(N''SELECT a FROM t1'');';
다음은 결과 집합의 일부입니다.
Column | 값 |
---|---|
name |
a |
system_type_name |
int |
is_nullable |
1 |
동적 SQL의 결과 오류
첫 번째 결과 집합은 동적 SQL로 인해 정의되지 않습니다.
EXEC 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로 인해 결과를 검색할 수 없습니다.
사용자가 지정한 결과 집합
첫 번째 결과 집합은 사용자가 수동으로 지정합니다.
EXEC 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)
);';
다음은 결과 집합의 일부입니다.
Column | 값 |
---|---|
name |
Column1 |
system_type_name |
bigint |
is_nullable |
0 |
모호한 결과 집합으로 인한 오류
이 예제에서는 명명된 user1
다른 사용자에게 열()이 있는 기본 스키마 s1
에 이름이 지정된 t1
테이블이a int NOT NULL
있다고 가정합니다.
EXEC sp_describe_first_result_set @tsql = N'
IF (@p > 0)
EXECUTE AS USER = ''user1'';
SELECT * FROM t1;',
@params = N'@p int';
이 코드는 오류가 발생합니다 Invalid object name
. t1
은 각각 서로 다른 수의 열을 가진 열일 dbo.t1
수 s1.t1
있습니다.
모호한 결과 집합이 있는 경우에도 결과
이전 예제와 동일한 가정을 사용합니다.
EXEC sp_describe_first_result_set @tsql =
N'
IF (@p > 0)
EXECUTE AS USER = ''user1'';
SELECT a FROM t1;';
다음은 결과 집합의 일부입니다.
Column | 값 |
---|---|
name |
a |
system_type_name |
int |
is_nullable |
1 |
s1.t1.a
둘 다 dbo.t1.a
int 형식과 Null 허용 여부가 다릅니다.