SR0014: {Type1}에서 {Type2}로 캐스팅할 때 데이터 손실이 발생할 수도 있습니다.
규칙 ID |
SR0014 |
범주 |
Microsoft.Design |
변경 수준 |
주요 변경 아님 |
원인
열, 변수 또는 매개 변수의 데이터 형식은 다른 데이터 형식으로 암시적으로 변환됩니다.
규칙 설명
데이터 형식이 열, 변수 또는 매개 변수에 일관성 없게 할당되어 있으면 해당 개체가 포함된 Transact-SQL 코드를 실행할 때 암시적으로 변환됩니다. 이 형식 변환은 성능을 줄일 뿐만 아니라, 경우에 따라서는 미묘한 데이터 손실도 초래합니다. 예를 들어, 테이블 스캔은 WHERE 절에 있는 모든 열을 변환해야 하는 경우 실행할 수 있습니다. 게다가, 유니코드가 다른 코드 페이지를 사용하는 ASCII 문자열로 변환되는 경우 데이터가 손실될 수 있습니다.
이 규칙은 없습니다:
런타임까지 형식이 알려져 있지 않으므로 계산된 열의 형식을 확인하십시오.
CASE 문 내에 있는 것을 분석합니다. 또한 CASE 문의 반환 값을 분석하지 않습니다.
입력 매개 변수를 분석하거나 호출 값을 ISNULL에 반환합니다.
SQL CLR 개체
SQL Server 공용 언어 런타임(SQL CLR) 개체에 대해 다음 검사가 수행됩니다.
Object 형식 |
형식 호환성 확인 |
잠재적인 데이터 손실 확인 |
---|---|---|
Columns |
예 |
아니요 |
저장된 프로시저 및 함수 매개 변수 |
아니요 |
아니요 |
변수 |
아니요 |
아니요 |
XML 형식 |
아니요 |
아니요 |
한 개체를 다른 개체에 할당하고 둘 모두 SQL CLR 개체 형식이면 같은 형식이어야 합니다. 그렇지 않으면 경고가 생성됩니다. 다음을 SQL CLR 개체 형식으로만 명시적으로 변환할 수 있습니다. 그렇지 않으면 경고가 나타납니다: binary, varbinary, char, nchar, varchar 또는 nvarchar.
시스템 함수
다음 시스템 기능에 대해 반환 형식을 확인합니다. @@ERROR, @@FETCH_STATUS, @@IDENTITY, @@ROWCOUNT, @@TRANCOUNT, CHECKSUM, CHECKSUM_AGG, COUNT, COUNT_BIG, GROUPING, STDEV, STDEVP, VAR, ARP, RANK, DENSE_RANK, NTILE, ROW_NUMBER, CURSOR_STATUS, SYSDATETIME, SYSDATETIMEOFFSET, SYSUTCDATETIME, DATEDIFF, DATENAME, DATEPART, DAY, MONTH, YEAR, CURRENT_TIMESTAMP, GETDATE, GETUTCDATE, AVG, SUM, MIN, MAX, DATEADD, SWITCHOFFSET, TODATETIMEOFFSET 및 ISNULL.
참고
LEFT, RIGHT, CONVERT 및 CAST 함수를 제외하고 함수 컨텍스트에서 입력이 유효한지 확인하지 않습니다. 예를 들어, 데이터베이스 코드 분석이 SUM 함수에 예상되는 입력 형식을 이해하지 못하기 때문에 SUM(datetime2 형식)에 대한 경고가 나타나지 않습니다. 입력 식 자체에 문제가 있는 경우, 예를 들어 SUM(money + real)을 지정한 경우 경고가 나타납니다.
수행된 특정 검사
다음 표에서는 다음과 같이 수행되는 특정 검사를 설명합니다.
언어 구문 |
내용 확인 |
예제 |
---|---|---|
매개 변수의 기본값 |
매개 변수 데이터 형식 |
|
CREATE INDEX 조건자 |
조건자는 부울입니다. |
|
LEFT 또는 RIGHT 함수의 인수 |
문자열 인수 형식 및 길이 |
|
CAST 및 CONVERT 함수의 인수 |
식 및 형식이 유효합니다. |
|
SET 문 |
왼쪽 및 오른쪽에 호환되는 형식이 있습니다. |
|
IF 문 조건자 |
조건자는 부울입니다. |
|
WHILE 문 조건자 |
조건자는 부울입니다. |
|
INSERT 문 |
열과 값이 올바릅니다. |
참고
와일드카드는 확인할 수 없습니다.예를 들어: INSERT INTO t1 SELECT * FROM t2
|
SELECT WHERE 조건자 |
조건자는 부울입니다. |
|
SELECT TOP 식 |
식은 정수 또는 부동 소수점 형식입니다. |
|
UPDATE 문 |
식 및 열에 호환되는 형식이 있습니다. |
|
UPDATE 조건자 |
조건자는 부울입니다. |
|
UPDATE TOP 식 |
식은 정수 또는 부동 소수점 형식입니다. |
|
DELETE PREDICATE |
조건자는 부울입니다. |
|
DELETE TOP 식 |
식은 정수 또는 부동 소수점 형식입니다. |
|
DECLARE 변수 선언 |
초기 값과 데이터 형식이 호환되지 않습니다. |
|
EXECUTE 문 인수 및 반환 형식 |
매개 변수 및 인수 |
|
RETURN 문 |
RETURN 식에는 호환되는 데이터 형식이 있습니다. |
|
MERGE 문 조건 |
조건은 부울입니다. |
|
위반 문제를 해결하는 방법
데이터 형식을 일관성 있게 할당하고 필요한 경우 명시적으로 형식을 변환하여 이러한 문제를 피하고 해결할 수 있습니다. 데이터 형식을 명시적으로 변환하는 방법에 대한 자세한 내용은 Microsoft 웹 사이트의 CAST and CONVERT (Transact-SQL) 페이지를 참조하십시오.
경고를 표시하지 않는 경우
이런 종류의 경고는 반드시 표시해야 합니다.
예제
이 예제에서는 테이블에 데이터를 삽입하는 두 저장된 프로시저를 보여 줍니다. 첫 번째 절차인 procWithWarning으로 데이터 형식의 암시적 변환이 발생합니다. 두 번째 절차 procFixed는 성능을 극대화하고 모든 데이터를 유지하기 위해 명시적 변환을 추가하는 방법을 보여줍니다.
CREATE TABLE [dbo].[Table2]
(
[ID] INT NOT NULL IDENTITY(0, 1),
[c1] INT NOT NULL ,
[c2] INT NOT NULL ,
[c3] BIGINT NOT NULL ,
[Comment] VARCHAR (25)
)
ON [PRIMARY]
CREATE PROCEDURE [dbo].[procWithWarning]
(
@Value1 INT,
@Value2 INT,
@Value3 BIGINT,
@Comment CHAR(30)
)
AS
BEGIN
INSERT INTO [Table2] ([c1], [c2], [c3], Comment)
VALUES (@Value1, @Value2, @Value3, @Comment)
END
CREATE PROCEDURE [dbo].[procFixed]
(
@Value1 INT,
@Value2 INT,
@Value3 BIGINT,
@Comment CHAR(10)
)
AS
BEGIN
INSERT INTO [Table2] ([c1], [c2], [c3], Comment)
VALUES (@Value1, @Value2, @Value3, CAST(@Comment AS VARCHAR(25)))
END