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 PROCEDURE p1(
@p1 INT = 1)
AS
BEGIN
END

CREATE INDEX 조건자

조건자는 부울입니다.

CREATE INDEX index1 ON table1 (column1) 
WHERE column1 > 10

LEFT 또는 RIGHT 함수의 인수

문자열 인수 형식 및 길이

SET @v = LEFT('abc', 2)

CAST 및 CONVERT 함수의 인수

식 및 형식이 유효합니다.

SET @v = CAST('abc' AS CHAR(10))

SET 문

왼쪽 및 오른쪽에 호환되는 형식이 있습니다.

SET @v1 = 'xyz'
SELECT @v1 = c1 FROM t1

IF 문 조건자

조건자는 부울입니다.

IF (@v > 10)

WHILE 문 조건자

조건자는 부울입니다.

WHILE (@v > 10)

INSERT 문

열과 값이 올바릅니다.

INSERT INTO t1(c1, c2) VALUES (99, 'xyz')
INSERT INTO t1 SELECT c1 FROM t2.
참고참고
와일드카드는 확인할 수 없습니다.예를 들어: INSERT INTO t1 SELECT * FROM t2

SELECT WHERE 조건자

조건자는 부울입니다.

SELECT * FROM t1 WHERE c1 > 10

SELECT TOP 식

식은 정수 또는 부동 소수점 형식입니다.

SELECT TOP 4 * FROM t1 
SELECT TOP 1.5 PERCENT * FROM t1

UPDATE 문

식 및 열에 호환되는 형식이 있습니다.

UPDATE t1 SET c1 = 100

UPDATE 조건자

조건자는 부울입니다.

UPDATE t1 SET c1 = 100 
WHERE c1 > 100

UPDATE TOP 식

식은 정수 또는 부동 소수점 형식입니다.

UPDATE TOP 4 table1

DELETE PREDICATE

조건자는 부울입니다.

DELETE t1 WHERE c1 > 10

DELETE TOP 식

식은 정수 또는 부동 소수점 형식입니다.

DELETE TOP 2 FROM t1

DECLARE 변수 선언

초기 값과 데이터 형식이 호환되지 않습니다.

DECLARE @v INT = 10

EXECUTE 문 인수 및 반환 형식

매개 변수 및 인수

CREATE PROCEDURE p1 (@p1 INT) AS
GO
EXECUTE p1 100
EXECUTE @v1 = p1 100

RETURN 문

RETURN 식에는 호환되는 데이터 형식이 있습니다.

CREATE FUNCTION f1() RETURNS INT
AS
BEGIN
  RETURN 100
END

MERGE 문 조건

조건은 부울입니다.

MERGE t1 USING t2
ON t1.c1 = t2.c2
WHEN t1.c1 > 10 THEN DELETE

위반 문제를 해결하는 방법

데이터 형식을 일관성 있게 할당하고 필요한 경우 명시적으로 형식을 변환하여 이러한 문제를 피하고 해결할 수 있습니다. 데이터 형식을 명시적으로 변환하는 방법에 대한 자세한 내용은 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

참고 항목

개념

데이터베이스 코드를 분석하여 코드 품질 향상