다음을 통해 공유


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 동일한 정보를 반환합니다.

Transact-SQL 구문 표기 규칙

구문

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/TRYCATCH 블록)뿐만 아니라 문, 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;';

이로 인해 형식이 일치하지 않는 오류가 발생합니다(intsmallint).

열 이름을 확인할 수 없습니다.

가능한 첫 번째 결과 집합의 열은 동일한 가변 길이 형식, 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.t1s1.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 허용 여부가 다릅니다.