|
이 문서는 수동으로 번역한 것입니다. 원본 텍스트를 보려면 포인터를 문서의 문장 위로 올리십시오.
|
번역
원본
|
sp_describe_undeclared_parameters(Transact-SQL)
|
|
|
|
|---|---|---|
|
|
int NOT NULL |
|
|
|
sysname NOT NULL |
|
|
|
int NOT NULL |
|
|
|
nvarchar (256) NULL |
|
|
|
smallint NOT NULL |
|
|
|
tinyint NOT NULL |
|
|
|
tinyint NOT NULL |
|
|
|
int NULL |
|
|
|
sysname NULL |
|
|
|
sysname NULL |
|
|
|
sysname NULL |
|
|
|
nvarchar (4000) NULL |
|
|
|
int NULL |
|
|
|
sysname NULL |
|
|
|
sysname NULL |
|
|
|
sysname NULL |
|
|
|
bit NOT NULL |
|
|
|
bit NOT NULL |
|
|
|
bit NOT NULL |
|
|
|
bit NOT NULL |
|
|
|
bit NOT NULL |
|
|
|
sysname NULL |
|
|
|
int NOT NULL |
|
|
|
int NOT NULL |
|
-
@tsql 입력이 유효한 Transact-SQL 일괄 처리가 아닌 경우. 유효성은 Transact-SQL 일괄 처리에 대한 구문 분석을 통해 결정됩니다. 쿼리 최적화 또는 실행 중에 일괄 처리에서 발생한 오류는 Transact-SQL 일괄 처리가 유효한지 확인할 때 고려되지 않습니다. -
@params가 NULL이 아니고 구문상 매개 변수에 유효한 선언 문자열이 아닌 문자열을 포함하는 경우 또는 매개 변수를 선언하는 문자열을 두 번 이상 포함하는 경우 -
Transact-SQL 입력 일괄 처리에서 @params에 선언된 매개 변수와 이름이 같은 지역 변수를 선언하는 경우 -
해당 문에서 임시 테이블을 만드는 경우
매개 변수 선택 알고리즘
1단계
-
열, 상수, 변수 및 선언된 매개 변수 -
UDF(사용자 정의 함수) 호출 결과 -
모든 입력에 대해 선언되지 않은 매개 변수에 종속되지 않는 데이터 형식이 포함된 식
SELECT * FROM t1 WHERE @p1 = @p2 SELECT * FROM t1 WHERE c1 = @p1 + @p2 SELECT * FROM t1 WHERE @p1 = SUBSTRING(@p2, 2, 3)
SELECT * FROM t1 WHERE @p1 = dbo.tbl(c1, @p2, @p3)
2단계
비교 또는 대입 연산자의 인수 사용자 정의 함수(테이블 반환 UDF 포함), 프로시저 또는 메서드의 인수 INSERT 문의 VALUES 절의 인수 CAST 또는 CONVERT의 인수
비교 또는 대입의 다른 쪽 데이터 형식 이 인수가 전달되는 매개 변수의 선언된 데이터 형식 이 값이 삽입되는 열의 데이터 형식 문이 캐스팅 또는 변환되는 데이터 형식
3단계
단순 추론 E(@p) = @p이고 TT(@p)가 존재하는 경우, 즉 @p가 2단계 시작 부분에 나열된 식 중 하나의 인수인 경우 형식 추론 알고리즘은 @p의 데이터 형식을 TT(@p)로 추론합니다. 예를 들면 다음과 같습니다. SELECT * FROM t WHERE c1 = @p1 AND @p2 = dbo.tbl(@p3)
@p1, @p2 및 @p3의 데이터 형식은 각각 c1의 데이터 형식, dbo.tbl의 반환 데이터 형식 및 dbo.tbl의 매개 변수 데이터 형식이 됩니다. 특별한 경우이기는 하지만 @p가 <, >, <= 또는 >= 연산자의 인수인 경우에는 단순 추론 규칙이 적용되지 않습니다. 이 경우 형식 추론 알고리즘에서는 다음 섹션에 설명된 일반 추론 규칙을 사용합니다. 예를 들어 c1이 데이터 형식 char(30)의 열인 경우 다음 두 가지 쿼리를 고려합니다. SELECT * FROM t WHERE c1 = @p SELECT * FROM t WHERE c1 > @p
첫째, 형식 추론 알고리즘에서 이 항목의 앞부분에 설명된 규칙에 따라 char(30)을 @p의 데이터 형식으로 추론합니다. 둘째, 형식 추론 알고리즘에서 다음 섹션에 설명된 일반 추론 규칙에 따라 varchar(8000)을 추론합니다. 일반 추론 단순 추론이 적용되지 않는 경우 선언되지 않은 매개 변수에 대해 다음 데이터 형식이 고려됩니다. 정수 데이터 형식(bit, tinyint, smallint, int, bigint) Money 데이터 형식(smallmoney, money) 부동 소수점 데이터 형식(float, real) numeric(38, 19) - 다른 숫자 또는 10진수 데이터 형식은 고려되지 않음 varchar(8000) , varchar(max), nvarchar(4000) 및 nvarchar(max) - 다른 문자열 데이터 형식(예: text, char(8000), nvarchar(30) 등)은 고려되지 않음 varbinary(8000) 및 varbinary(max) - 다른 이진 데이터 형식(예: image, binary(8000), varbinary(30) 등)은 고려되지 않음 date , time(7), smalldatetime, datetime, datetime2(7), datetimeoffset(7) - 다른 날짜 및 시간 형식(예: time(4))은 고려되지 않음 sql_variant
xml
CLR 시스템 정의 형식(hierarchyid, geometry, geography) CLR 사용자 정의 형식
선택 조건
E(@p)에서 암시적 변환 횟수가 가장 적은 데이터 형식이 선택됩니다. 특정 데이터 형식이 E(@p)에 대해 TT(@p)와 다른 데이터 형식을 생성하는 경우 형식 추론 알고리즘은 이를 E(@p)의 데이터 형식에서 TT(@p)로의 추가 암시적 변환으로 간주합니다. 예를 들면 다음과 같습니다. SELECT * FROM t WHERE Col_Int = Col_Int + @p
이 경우 E(@p)는 Col_Int + @p이고, TT(@p)는 int입니다. 따라서 생성되는 암시적 변환이 없으므로 @p에 대해 int가 선택됩니다. 다른 데이터 형식은 하나 이상의 암시적 변환을 생성합니다. 변환 수가 가장 적은 데이터 형식에 여러 데이터 형식이 연결된 경우 우선 순위가 가장 높은 데이터 형식이 사용됩니다. 예를 들면 다음과 같습니다. SELECT * FROM t WHERE Col_Int = Col_smallint + @p
이 경우 int와 smallint가 하나의 변환을 생성합니다. 다른 모든 데이터 형식은 두 번 이상 변환을 생성합니다. int 가 smallint보다 우선적으로 적용되므로 int가 @p에 사용됩니다. 데이터 형식 우선 순위에 대한 자세한 내용은 데이터 형식 우선 순위(Transact-SQL)를 참조하십시오. 이 규칙은 규칙 1에 따라 연결된 모든 데이터 형식과 우선 순위가 가장 높은 데이터 형식 간에 암시적 변환이 있는 경우에만 적용됩니다. 암시적 변환이 없으면 데이터 형식 추론이 오류와 함께 실패합니다. 예를 들어 SELECT @p FROM t 쿼리에서는 @p에 대한 데이터 형식의 우선 순위가 동일하므로 데이터 형식 추론이 실패합니다. 즉, int에서 xml로의 암시적 변환이 없습니다. 유사한 데이터 형식 두 개(예: varchar(8000)과 varchar(max))가 규칙 1에 따라 연결된 경우 보다 작은 데이터 형식(varchar(8000))이 선택됩니다. nvarchar 및 varbinary 데이터 형식에도 동일한 원칙이 적용됩니다. 규칙 1의 목적상, 형식 추론 알고리즘에서 선호하는 변환에는 우선 순위가 있습니다. 가장 선호하는 변환부터 순서대로 나열하면 다음과 같습니다. 길이가 다른 동일한 기본 데이터 형식 간의 변환 동일한 데이터 형식의 고정 길이 버전과 가변 길이 버전 간의 변환(예: char과 varchar) NULL 과 int 간의 변환 기타 변환
sp_describe_undeclared_parameters @tsql = N'SELECT object_id, name, type_desc FROM sys.indexes WHERE object_id = @id OR name = @name'
sp_describe_undeclared_parameters @tsql = N'SELECT object_id, name, type_desc FROM sys.indexes WHERE object_id = @id OR NAME = @name', @params = N'@id int'