CAST 및 CONVERT(Transact-SQL)

적용 대상:SQL 서버Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsMicrosoft Fabric 의 SQL 분석 엔드포인트Microsoft Fabric 의 웨어하우스Microsoft Fabric의 SQL 데이터베이스

이러한 함수는 한 데이터 형식의 식을 다른 데이터 형식의 식으로 변환합니다.

구문

CAST 구문:

CAST ( expression AS data_type [ ( length ) ] )

CONVERT 구문:

CONVERT ( data_type [ ( length ) ] , expression [ , style ] )

Transact-SQL 구문 표기 규칙

인수

표현식

유효한 식입니다.

data_type

대상 데이터 형식입니다. 여기에는 xml, bigint 및 sql_variant가 있습니다. 별칭 데이터 형식은 사용할 수 없습니다.

길이

사용자가 지정한 길이를 허용하는 데이터 형식에 대해 대상 데이터 형식의 길이를 지정하는 선택적 정수입니다. 기본값은 30입니다.

스타일

함수가 CONVERT 표현 식을 어떻게 번역하는지 명시하는 정수식입니다. 스타일 값이 있을 NULL때, 는 NULL 반환됩니다. data_type은 범위를 결정합니다.

반환 형식

data_type으로 변환된 식을 반환합니다.

날짜 및 시간 스타일

날짜 또는 시간 데이터 형식 식인 경우 스타일은 다음 표에 있는 값 중 하나일 수 있습니다. 다른 값들은 로 처리 0됩니다. SQL Server 2012(11.x)부터는 날짜 및 시간 타입에서 datetimeoffset으로 변환할 때 지원되는 스타일은 0 또는 1입니다. 다른 모든 변환 스타일은 오류 9809를 반환합니다.

참고

SQL Server 데이터베이스 엔진은 쿠웨이트 알고리즘과 함께 아랍식 날짜 형식을 지원합니다.

두 자리 연도(yy)1 네 자리 연도(yyyy) 스탠다드 입출력3
- 0또는 1001,2 datetime 및 smalldatetime의 기본값 MMM dd yyyy hh:mmtt (tt 또는 AMPM)
1 101 미국 1 = MM/dd/yy
101 = MM/dd/yyyy
2 102 미국 국가 표준 협회 (ANSI) 2 = yy.MM.dd
102 = yyyy.MM.dd
3 103 영국/프랑스 3 = dd/MM/yy
103 = dd/MM/yyyy
4 104 독일어 4 = dd.MM.yy
104 = dd.MM.yyyy
5 105 이탈리아어 5 = dd-MM-yy
105 = dd-MM-yyyy
6 106 1 - 6 = dd MMM yy
106 = dd MMM yyyy
7 107 1 - 7 = MMM dd, yy
107 = MMM dd, yyyy
8 또는 24 108 - HH:mm:ss
- 9또는 1091,2 기본값 + 밀리초 MMM dd yyyy hh:mm:ss:ffftt (tt 또는 AMPM)
10 110 미국 10 = MM-dd-yy
110 = MM-dd-yyyy
11 111 Japan 11 = yy/MM/dd
111 = yyyy/MM/dd
12 112 ISO 12 = yyMMdd
112 = yyyyMMdd
- 13또는 1131,2 유럽 기본값 + 밀리초 dd MMM yyyy HH:mm:ss:fff(24시간)
14 114 - HH:mm:ss:fff(24시간)
- 20 또는 1202 ODBC 표준 yyyy-MM-dd HH:mm:ss(24시간)
- 21 또는 251212 time, date, datetime2, datetimeoffset의 ODBC 표준(밀리초 포함) 기본값 yyyy-MM-dd HH:mm:ss.fff(24시간)
22 - 미국 MM/dd/yy hh:mm:ss tt (tt 또는 AMPM)
- 23 ISO8601 yyyy-MM-dd
- 126 4 ISO8601 yyyy-MM-ddTHH:mm:ss.fff(공백 없음)6
- 127 8, 9 ISO8601(Z 표준 시간대) yyyy-MM-ddTHH:mm:ss.fffZ(공백 없음)6
- 130 1,2 히즈리 5 dd MMMM yyyy hh:mm:ss:ffftt 7개
- 131 2 히즈리 5 dd/MM/yyyy hh:mm:ss:ffftt

1 이러한 스타일 값은 비결정적 결과를 반환합니다. 모든 (yy)(두 자리 연도) 스타일과 (yyyy)(네 자리 연도) 스타일의 하위 집합을 포함합니다.

2 기본 값 (0 , 100, 1099 , 2012011313212523또는 ) 121는 항상 세기yyyy()를 반환합니다.

중요

기본적으로 SQL Server 데이터베이스 엔진은 2049년이라는 마감 연도를 기준으로 두 자리 연도를 해석합니다. 즉, 데이터베이스 엔진은 2자리 연도를 2049년으로, 2자리 연도를 1950년으로 해석합니다. Automation 개체를 기반으로 하는 애플리케이션 등 많은 클라이언트 애플리케이션에서는 2030년을 구분 연도로 사용합니다. 데이터베이스 엔진은 데이터베이스 엔진에서 사용하는 마감 연도를 변경할 수 있는 두 자리 연도 설정 옵션을 제공합니다. 이를 통해 날짜를 일관성 있게 처리할 수 있습니다. 네 자리 연도를 지정하는 것이 더 편리합니다.

3datetime으로 변환할 때의 입력이며 문자 데이터로 변환할 때의 출력입니다.

4 XML용으로 고안되었습니다. datetime 또는 smalldatetime을 문자 데이터로 변환하는 경우 출력 형식은 앞의 표를 참조하세요.

5 회교식 달력 시스템에는 여러 가지 형태가 있는데 데이터베이스 엔진은 쿠웨이트 알고리즘을 사용합니다.

6 밀리초(fff) 값 0의 경우 밀리초 소수 부분 값이 표시되지 않습니다. 예를 들어 값 2022-11-07T18:26:20.000은 2022-11-07T18:26:20으로 표시됩니다.

7 이 스타일 MMMM 에서는 전체 월 이름의 다중 토큰 Hijri 유니코드 표현을 나타냅니다. 이 값은 SSMS의 기본 미국 영어 설치에서 올바르게 렌더링되지 않습니다.

8 문자 데이터를 datetime 또는 smalldatetime으로 캐스팅하는 경우에만 지원됩니다. 날짜 또는 시간 구성 요소만 나타내는 문자 데이터를 datetime 또는 smalldatetime 데이터 형식으로 캐스팅하면 지정되지 않은 시간 구성 요소는 00:00:00.000으로 설정되고 지정되지 않은 날짜 구성 요소는 1900-01-01로 설정됩니다.

9 선택적 시간대 표시기를 Z 사용하여 시간대 정보가 포함된 XML datetime 값을 데이터베이스 엔진의 시간대가 없는 datetime 값에 쉽게 매핑할 수 있도록 합니다. Z는 UTC-0 시간대를 나타냅니다. HH:mm 또는 + 방향의 - 오프셋으로 다른 시간대를 나타냅니다. 예: 2022-12-12T23:45:12-08:00

smalldatetime을 문자 데이터로 변환할 때는 초나 밀리초가 포함된 스타일이 해당 위치에 0으로 표시됩니다. datetime 또는 smalldatetime 값을 변환할 때는 적합한 char 또는 varchar 데이터 형식 길이를 사용하여 불필요한 날짜 부분을 자를 수 있습니다.

시간이 포함된 스타일을 사용하여 문자 데이터에서 datetimeoffset으로 변환할 때는 결과에 표준 시간대 오프셋이 추가됩니다.

float 및 real 스타일

float 또는 real식의 경우 스타일은 다음 표에 표시된 값 중 하나를 가질 수 있습니다. 다른 값들은 로 처리 0됩니다.

값 출력
0(기본값) 최대 6자리 수입니다. 해당되는 경우 과학 표기법을 사용하세요.
1 항상 8자리 수입니다. 항상 과학 표기법을 사용하세요.
2 항상 16자리 수입니다. 항상 과학 표기법을 사용하세요.
3 항상 17자리 수입니다. 무손실 변환용입니다. 이 스타일에서는 모든 고유 부동 또는 실수 값이 고유 문자열로 변환됩니다.

적용 대상: SQL Server 2016(13.x) 이상 버전 및 Azure SQL Database.
126, 128, 129 레거시 이유로 포함됩니다. 새 개발에는 이 값을 사용하지 마세요.

money 및 smallmoney 스타일

money 또는 smallmoney 식의 경우 스타일은 다음 표에 표시된 값 중 하나를 가질 수 있습니다. 다른 값들은 로 처리 0됩니다.

값 출력
0(기본값) 소수점 앞 세 자리마다 쉼표를 사용하지 않으며 소수점 이하 두 자리인 수입니다.

예제: 4235.98.
1 소수점 앞 세 자리마다 쉼표를 사용하며 소수점 이하 두 자리인 수입니다.

예제: 3,510.92.
2 소수점 앞 세 자리마다 쉼표를 사용하지 않으며 소수점 이하 4자리인 수입니다.

예제: 4235.9819.
126 스타일 와 동등2하며, char(n) 또는 varchar(n)로 변환할 때

xml 스타일

xml’식’인 경우 ‘스타일’은 다음 테이블에 있는 값 중 하나일 수 있습니다. 다른 값들은 로 처리 0됩니다.

값 출력
0(기본값) 불필요한 공백을 삭제하고 내부 DTD 하위 집합을 허용하지 않는 기본 구문 분석 동작을 사용합니다.

참고:XML 데이터 타입으로 변환할 때, 데이터베이스 엔진은 XML 1.0과는 다르게 중요하지 않은 공백을 처리합니다. 자세한 내용은 XML 데이터 인스턴스 만들기를 참조하세요.
1 불필요한 공백을 유지합니다. 이 스타일 설정은 기본 xml:space 처리를 xml:space="preserve" 동작에 맞게 설정합니다.
2 제한된 내부 DTD 하위 집합 처리를 설정합니다.

설정된 경우 서버가 내부 DTD 하위 집합에 제공된 다음 정보를 사용하여 유효성을 검사하지 않는 구문 분석 작업을 수행합니다.

- 특성의 기본값이 적용됩니다.
- 내부 엔터티 참조가 확인 및 확장됩니다.
- DTD 콘텐츠 모델의 구문이 올바른지 확인합니다.

구문 분석기가 외부 DTD 하위 집합을 무시합니다. 또한, 독립 실행형 속성이 a yes 또는 no 값을 갖는지 XML 선언을 평가하지 않습니다. 대신, 독자적인 문서로 XML 인스턴스를 구문 분석합니다.
3 불필요한 공백을 유지하고 제한된 내부 DTD 하위 집합 처리를 설정합니다.

이진 스타일

이진(n), char(n), varbinary(n) 또는 varchar(n)식의 경우 스타일에 다음 표에 표시된 값 중 하나가 있을 수 있습니다. 테이블에 없는 스타일 값은 오류를 반환합니다.

값 출력
0(기본값) ASCII 문자를 이진 바이트로 또는 이진 바이트를 ASCII 문자로 변환합니다. 각 문자 또는 바이트는 1:1로 변환됩니다.

이진 data_type의 경우, 문자 0x 는 결과 왼쪽에 추가됩니다.
1, 2 이진 data_type인 경우 식이 문자 식이어야 합니다. 이 식은 16진수 자리의 짝수 개를 가져야 합니다 (0, 1, 2, edcabFEDCB3A954678). f 스타일이 로 설정1되면 표현식은 반드시 첫 두 문자를 가져 0x 야 합니다. 식에 홀수 개의 문자나 유효하지 않은 문자가 포함되어 있으면 오류가 발생합니다.

변환된 식의 길이가 data_type의 길이보다 길면 결과의 오른쪽이 잘립니다.

고정 길이 data_types가 변환된 결과보다 길면 결과의 오른쪽에 0이 추가됩니다.

형식 문자 data_type에서는 이진 식을 사용해야 합니다. 각 이진 문자는 두 개의 16진수 문자로 변환됩니다. 변환된 식의 길이가 data_type의 길이보다 길다고 가정합니다. 이런 경우에는 잘립니다.

고정 크기 문자 유형 data_type이고 변환된 결과의 길이가 data_type의 길이보다 짧으면 짝수 개의 16진수가 유지되도록 변환된 식의 오른쪽에 공백이 추가됩니다.

0x 스타일을 위해2 변환된 결과 왼쪽에 문자가 추가되지 않습니다.

암시적 변환

암시적 변환에서는 CAST 함수나 CONVERT 함수 지정이 필요하지 않습니다. 명시적 변환에서는 CAST 함수나 CONVERT 함수를 지정해야 합니다. 다음 그림은 데이터베이스 엔진 시스템 제공 데이터 타입에 대해 허용되는 모든 명시적 및 암시적 데이터 타입 변환을 보여줍니다. 여기에는 bigint, sql_variant, xml, hierarchyid, geography, geometry, json, vector 등이 포함됩니다. json과 벡터 데이터 타입은 SQL Server 2025 (17.x), Azure SQL Database, Azure SQL Managed Instance, Microsoft Fabric의 SQL 데이터베이스에서만 사용 가능합니다. sql_variant 데이터 타입에서 할당 시 암묵적으로 변환되는 것은 없지만, sql_variant로의 암묵적 변환은 있습니다.

계층 구조, 지리, 기하학, json, 벡터 데이터 타입 등 SQL Server 데이터 타입 간 변환이 명시적, 암묵적, 허용되지 않음을 보여주는 다이어그램입니다.

위 차트는 데이터베이스 엔진에서 허용되는 모든 명시적 및 암묵적 변환을 보여주지만, 변환의 결과 데이터 유형은 수행되는 연산에 따라 달라집니다:

  • 명시적 변환의 경우 문 자체에서 결과 데이터 형식을 결정합니다.
  • 암시적 변환의 경우 변수 값을 설정하거나 열에 값을 삽입하는 등의 대입문은 변수 선언 또는 열 정의에 의해 정의된 데이터 형식으로 변환됩니다.
  • 비교 연산자 또는 다른 식의 경우 결과 데이터 형식은 데이터 형식 우선 순위 규칙에 따라 달라집니다.

일부 데이터 타입의 경우, 결과는 데이터 타입이 어떻게 선언되는지에 따라 달라집니다:

  • 십진수와숫자: 데이터베이스 엔진은 정밀도와 스케일의 각 조합을 서로 다른 데이터 타입으로 취급합니다. 그들 간의 전환은 암묵적일 수 있습니다. 목표 스케일보다 소수점이 더 많은 값은 오류 없이 반올림됩니다. 목표 정밀도에 비해 너무 큰 값은 오차 8115를 발생시키며, 만약 와 가 모두 OFF이라면 ARITHABORT 결과는 가 됩니다NULL.ANSI_WARNINGS
  • varchar(max),nvarchar(max),varbinary(max)를 sql_variant로 변환할 수 없습니다.
  • 서로 다른 CLR 사용자 정의 유형 간 변환은 허용되지 않습니다.
  • 비타입 XML 간, 그리고 동일한 XML 스키마 컬렉션과 동일 CONTENTDOCUMENT 또는 면을 사용하는 타입 XML 값 간에는 암묵적 변환이 지원됩니다.
  • 서로 다른 XML 스키마 컬렉션 간 변환이나 서로 다른 DOCUMENTCONTENT 측면 간의 변환은 명시적이어야 합니다. CLR 사용자 정의 타입과 타입이 있는 XML 간의 변환은 허용되지 않습니다.
  • 벡터 값 간 변환은 치수와 기본 타입(float32 또는 float16)이 동일할 때만 허용됩니다.

차트에서 허용된 변환이 가능하다고 표시해도, 예를 들어 유효한 JSON이 아닌 문자열이나 차원 수가 다른 벡터처럼 특정 값에 대해서는 실패할 수 있습니다. 이미지, ntext, text, xml, 지리, 기하학, json, 벡터 데이터 타입의 값은 동일한 데이터 타입을 가졌더라도 equ-to (=) 연산자와 비교할 수 없습니다.

팁

변환에서 데이터 형식 우선 순위의 효과에 대한 실질적인 예는 이 섹션의 뒷부분에서 확인할 수 있습니다.

datetimeoffset과 char, nchar, nvarchar 및 varchar 문자 형식 간에 변환할 경우 변환된 표준 시간대 오프셋 부분의 HH 및 mm 부분은 항상 두 자리여야 합니다. 예: -08:00.

nchar와 nvarchar 데이터 타입은 항상 짝수 바이트를 사용하는 UTF-16 인코딩으로 유니코드 데이터를 저장합니다. 이진 또는 변배 변환을 nchar 또는 nvarchar로 변환할 때는 주의하세요. 예를 들어, 다음 변환은 16진수 의 값을 41반환하지 않습니다. 16진수 값으로 4100반환됩니다:

SELECT CAST (CAST (0x41 AS NVARCHAR) AS VARBINARY);

자세한 내용은 데이터 정렬 및 유니코드 지원을 참조하십시오.

큰 값 데이터 형식

큰 값 데이터 형식은 작은 데이터 형식, 특히 nvarchar, varbinary 및 varchar 데이터 형식과 같은 암시적 및 명시적 변환 동작을 보입니다. 그러나 다음 지침을 고려합니다.

  • image와 varbinary(max) 간 변환은 암시적 변환이며 text와 varchar(max) 간, ntext와 nvarchar(max) 간 변환도 암시적 변환입니다.
  • varchar(max) 등 큰 값 데이터 형식을 varchar 등의 작은 데이터 형식으로 변환하는 것은 암시적 변환이지만 작은 데이터 형식에 지정된 길이에 비해 큰 값이 너무 크면 값이 잘립니다.
  • nvarchar, varbinary 또는r varchar를 해당하는 큰 값 데이터 형식으로 변환하는 것은 암시적으로 수행됩니다.
  • sql_variant 데이터 형식을 큰 값 데이터 형식으로 변환하는 것은 명시적 변환입니다.
  • 큰 값 데이터 형식은 sql_variant 데이터 형식으로 변환할 수 없습니다.

XML 데이터 타입으로부터의 변환에 대한 자세한 내용은 XML 데이터 인스턴스 생성(Create of XML data)을 참조하세요.

XML 데이터 형식입니다.

xml 데이터 형식을 명시적 또는 암시적으로 문자열 또는 바이너리 데이터 형식으로 변환할 때는 xml 데이터 형식의 내용이 정의된 일련의 규칙에 따라 직렬화됩니다. 이 규칙들에 대한 정보는 XML 데이터 직렬화 정의를 참조하십시오. 다른 데이터 타입에서 XML 데이터 타입으로의 변환에 관한 정보는 XML 데이터 인스턴스 생성(Create of XML data)을 참조하세요.

text 및 image 데이터 형식

text 및 image 데이터 형식은 자동 데이터 형식 변환을 지원하지 않습니다. 명시적으로 text 데이터를 문자 데이터로 변환하거나 image 데이터를 binary 또는 varbinary로 변환할 수 있지만 최대 길이는 8,000바이트입니다. 예를 들어, 문자가 포함된 문자 표현식을 정수로 변환하는 등 잘못된 변환을 시도하면 데이터베이스 엔진이 오류 메시지를 반환합니다.

출력 데이터 정렬

CAST 또는 CONVERT 함수가 문자열을 출력하고 문자열 입력을 받으면 출력과 입력은 동일한 데이터 정렬 및 데이터 정렬 레이블을 가집니다. 입력이 문자열이 아닌 경우에는 출력에서 데이터베이스의 기본 데이터 정렬을 사용하며 강제할 수 있는 기본값의 데이터 정렬 레이블을 사용합니다. 자세한 내용은 데이터 정렬 우선 순위참조하세요.

출력에 다른 콜레이션을 할당하려면, or COLLATE 함수의 CAST 결과 표현식에 절 CONVERT 을 적용하세요. 다음은 그 예입니다.

SELECT CAST ('abc' AS VARCHAR (5)) COLLATE French_CS_AS;

결과 잘라내기 및 반올림

문자 또는 이진 식(binary, char, nchar, nvarchar, varbinary 또는 varchar)을 데이터 형식이 다른 식으로 변환할 때는 변환 작업에서 출력 데이터를 잘라 출력 데이터의 일부만 표시하거나 오류를 반환할 수 있습니다. 이러한 경우는 결과가 너무 짧아 표시할 수 없을 때 발생합니다. binary, char, nchar, nvarchar, varbinary 또는varchar로 변환하면 다음 표에 있는 변환을 제외하고 결과가 잘립니다.

원래 데이터 형식 변경할 데이터 형식 결과
int, smallint 또는 tinyint 문자
varchar
너무 짧아서 표시할 수 없음
nchar
nvarchar
오류1
money, smallmoney, numeric, decimal, float 또는 real 문자
varchar
오류1
nchar
nvarchar
오류1

1 결과 길이가 너무 짧아 표시되지 않으므로 오류가 반환됩니다.

SQL Server 데이터베이스 엔진은 원래 데이터 타입에서 다시 변환하는 왕복 변환만이 버전 간 동일한 값을 제공하도록 보장합니다. 다음 예에서는 이러한 왕복 변환을 보여 줍니다.

DECLARE @myval AS DECIMAL (5, 2);
SET @myval = 193.57;

SELECT CAST (CAST (@myval AS VARBINARY (20)) AS DECIMAL (10, 5));

-- Or, using CONVERT
SELECT CONVERT (DECIMAL (10, 5), CONVERT (VARBINARY (20), @myval));
GO

경고

binary 값을 생성한 다음, 숫자 데이터 형식 범주에 속하는 데이터 형식으로 변환하지 마세요. 데이터베이스 엔진은 십진수나 숫자 데이터 타입을 이진수로 변환했을 때 SQL Server 버전 간에 결과가 동일하다고 보장하지 않습니다.

다음 예에서는 길이가 짧아 표시할 수 없는 결과 식을 보여 줍니다.

USE AdventureWorks2025;
GO

SELECT p.FirstName,
       p.LastName,
       SUBSTRING(p.Title, 1, 25) AS Title,
       CAST (e.SickLeaveHours AS CHAR (1)) AS [Sick Leave]
FROM HumanResources.Employee AS e
     INNER JOIN Person.Person AS p
         ON e.BusinessEntityID = p.BusinessEntityID
WHERE NOT e.BusinessEntityID > 5;
GO

결과 집합은 다음과 같습니다.

FirstName   LastName      Title   Sick Leave
---------   ------------- ------- --------`
Ken         Sanchez       NULL   *
Terri       Duffy         NULL   *
Roberto     Tamburello    NULL   *
Rob         Walters       NULL   *
Gail        Erickson      Ms.    *

소수점 단위로 다른 데이터 타입을 변환할 때, 데이터베이스 엔진은 때때로 잘린 결과 값을 반환하고, 때로는 반올림된 값을 반환합니다. 이 표에서는 이러한 동작을 보여 줍니다.

보낸 사람 수행할 작업 동작
숫자 숫자 라운드
숫자 int 자르다
숫자 돈 라운드
돈 int 라운드
돈 숫자 라운드
플로트 int 자르다
플로트 숫자 반올림1
플로트 날짜/시간 라운드
날짜/시간 int 라운드

1 과학적 표기법을 사용하는 float 값을 decimal 또는 numeric으로 변환할 경우 전체 자릿수 값이 17자리로 제한됩니다. 17자리를 넘는 값은 0으로 반올림됩니다.

예를 들어, 값 10.6496과 -10.6496은 정수 형 또는 숫자 형으로 변환할 때 잘림되거나 반올림될 수 있습니다:

SELECT CAST (10.6496 AS INT) AS trunc1,
       CAST (-10.6496 AS INT) AS trunc2,
       CAST (10.6496 AS NUMERIC) AS round1,
       CAST (-10.6496 AS NUMERIC) AS round2;

쿼리 결과가 다음 표에 나와 있습니다.

trunc1 trunc2 round1 round2
10 -10 11 -11

대상 데이터 형식의 소수 자릿수가 원본 데이터 형식의 소수 자릿수보다 적은 데이터 형식을 변환할 경우 값이 반올림됩니다. 예를 들어 이 변환은 $10.3497을 반환합니다.

SELECT CAST (10.3496847 AS MONEY);

데이터베이스 엔진은 비수치 char, nchar, nvarchar 또는 varchar 데이터를 십진수, float, int, 수치로 변환할 때 오류 메시지를 반환합니다. 데이터베이스 엔진은 빈 문자열( )을 숫자 또는 십진수로 변환할 때도 오류를 반환합니다.

일부 datetime 변환은 비결정적임

문자열에서 datetime으로의 변환이 비결정적인 스타일은 다음과 같습니다.

  • 1 이하 100 의 모든 스타일
  • 106
  • 107
  • 109
  • 113
  • 130

1 스타일 20 과 를 제외하고 21

자세한 내용은 날짜 값으로 리터럴 날짜 문자열의 비결정적 변환을 참조하세요.

보조 문자(서로게이트 쌍)

SQL Server 2012(11.x)부터는 SC(보조 문자) 데이터 정렬을 사용할 경우 CAST 또는 nvarchar 형식에서 길이가 작은 nchar 또는 nvarchar 형식으로 연산을 수행하면 서로게이트 쌍 안에서 자르지 않습니다. 대신 이 연산은 보조 문자 앞에서 자릅니다. 예를 들어 다음 코드 조각에서는 @x만 보유한 ab를 남깁니다. 공간이 부족하여 보조 문자를 포함할 수 없습니다.

DECLARE @x AS NVARCHAR (10) = 'ab' + NCHAR(0x10000);

SELECT CAST (@x AS NVARCHAR (3));

SC 데이터 정렬을 사용할 경우 CONVERT의 동작은 CAST의 동작과 유사합니다. 자세한 내용은 데이터 정렬 및 유니코드 지원 - 보조 문자를 참조하세요.

호환성 지원

초기 SQL Server 버전에서는 시간과datetime2 데이터 타입에 대한 기본 스타일 CASTCONVERT 과 연산은 121계산된 열식 표현식에서 두 타입 중 하나가 사용되는 경우를 제외하고는 입니다. 계산된 열의 기본 스타일은 0입니다. 이 동작은 계산된 열이 생성될 때, 자동 매개변수화 관련 쿼리에 사용될 때, 또는 제약 조건 정의에 사용될 때 영향을 미칩니다.

호환성 수준110 이상에서는 time 및 datetime2 데이터 타입에 대한 and CONVERT 연산이 CAST 항상 기본 스타일로 사용됩니다121. 쿼리가 이전 동작에 의존한다면, 보다 낮은 110호환성 수준을 사용하거나 영향을 받는 쿼리에서 명시적으로 스타일을 0 지정하세요.

호환성 수준 값 기본 스타일 및 CASTCONVERT1 계산 열의 기본 스타일
< 110 121 0
>= 110 121 121

1 계산 열 제외

데이터베이스를 호환성 수준 110 이상으로 업그레이드해도 디스크에 저장된 사용자 데이터는 변경되지 않습니다. 수동으로 이 데이터를 적절하게 수정해야 합니다. 예를 들어, SELECT INTO 위에서 설명한 계산된 열식 포함 소스에서 테이블을 만들었다면, 계산된 열 정의 자체가 아니라 데이터(스타일 0를 사용)가 저장됩니다. 이 데이터를 수동으로 업데이트하여 스타일 121에 맞춰야 합니다.

예제

이 글의 코드 샘플은 Azure Data SQL Samples Repository GitHub 저장소에서 다운로드할 수 있는 , , AdventureWorksDW2025또는 AdventureWorksLT2025 샘플 데이터베이스를 사용합니다AdventureWorks2025.

A. CAST 및 CONVERT 모두 사용

각 예제에서는 제품 가격 첫 자리에 3이 있는 제품의 이름을 검색하고 ListPrice 값을 int로 변환합니다.

CAST는 다음 용도로 사용합니다.

USE AdventureWorks2025;
GO

SELECT SUBSTRING(Name, 1, 30) AS ProductName,
       ListPrice
FROM Production.Product
WHERE CAST (ListPrice AS INT) LIKE '33%';
GO

CONVERT는 다음 용도로 사용합니다.

USE AdventureWorks2025;
GO

SELECT SUBSTRING(Name, 1, 30) AS ProductName,
       ListPrice
FROM Production.Product
WHERE CONVERT (INT, ListPrice) LIKE '33%';
GO

결과 집합은 다음과 같습니다. 샘플 결과 집합은 CAST 및 CONVERT 모두에 대해 동일합니다.

ProductName                    ListPrice
------------------------------ ---------------------
LL Road Frame - Black, 58      337.22
LL Road Frame - Black, 60      337.22
LL Road Frame - Black, 62      337.22
LL Road Frame - Red, 44        337.22
LL Road Frame - Red, 48        337.22
LL Road Frame - Red, 52        337.22
LL Road Frame - Red, 58        337.22
LL Road Frame - Red, 60        337.22
LL Road Frame - Red, 62        337.22
LL Road Frame - Black, 44      337.22
LL Road Frame - Black, 48      337.22
LL Road Frame - Black, 52      337.22
Mountain-100 Black, 38         3374.99
Mountain-100 Black, 42         3374.99
Mountain-100 Black, 44         3374.99
Mountain-100 Black, 48         3374.99
HL Road Front Wheel            330.06
LL Touring Frame - Yellow, 62  333.42
LL Touring Frame - Blue, 50    333.42
LL Touring Frame - Blue, 54    333.42
LL Touring Frame - Blue, 58    333.42
LL Touring Frame - Blue, 62    333.42
LL Touring Frame - Yellow, 44  333.42
LL Touring Frame - Yellow, 50  333.42
LL Touring Frame - Yellow, 54  333.42
LL Touring Frame - Yellow, 58  333.42
LL Touring Frame - Blue, 44    333.42
HL Road Tire                   32.60

B. CAST에 산술 연산자 사용

이 예에서는 총 연간 매출(Computed)을 커미션 비율(SalesYTD)로 나누어 한 열을 계산(CommissionPCT)합니다. 이 값은 가장 근사한 정수로 반올림된 다음, CAST 데이터 형식으로 연산이 수행됩니다.

USE AdventureWorks2025;
GO

SELECT CAST (ROUND(SalesYTD / CommissionPCT, 0) AS INT) AS Computed
FROM Sales.SalesPerson
WHERE CommissionPCT != 0;
GO

결과 집합은 다음과 같습니다.

Computed
------
379753754
346698349
257144242
176493899
281101272
0
301872549
212623750
298948202
250784119
239246890
101664220
124511336
97688107

C. CAST를 사용하여 연결

이 예제에서는 CAST를 사용하여 문자가 아닌 식을 연결합니다. AdventureWorksDW2025 데이터베이스를 사용합니다.

SELECT 'The list price is ' + CAST (ListPrice AS VARCHAR (12)) AS ListPrice
FROM dbo.DimProduct
WHERE ListPrice BETWEEN 350.00 AND 400.00;

결과 집합은 다음과 같습니다.

ListPrice
------------------------
The list price is 357.06
The list price is 364.09
The list price is 364.09
The list price is 364.09
The list price is 364.09

D. CAST를 사용하여 읽기 쉬운 텍스트 만들기

이 예시는 리스트에서 SELECT 열을 Name char(10) 열로 변환하는 데 사용됩니다CAST. AdventureWorksDW2025 데이터베이스를 사용합니다.

SELECT DISTINCT CAST (EnglishProductName AS CHAR (10)) AS Name,
                ListPrice
FROM dbo.DimProduct
WHERE EnglishProductName LIKE 'Long-Sleeve Logo Jersey, M';
GO

결과 집합은 다음과 같습니다.

Name        ListPrice
----------  ---------
Long-Sleev  31.2437
Long-Sleev  32.4935
Long-Sleev  49.99

E. CAST에 LIKE 절 사용

이 예제에서는 money 열 SalesYTD 값을 init 데이터 형식으로 변환한 다음, char(20) 데이터 형식으로 변환하여 LIKE 절이 사용할 수 있게 합니다.

USE AdventureWorks2025;
GO

SELECT p.FirstName,
       p.LastName,
       s.SalesYTD,
       s.BusinessEntityID
FROM Person.Person AS p
     INNER JOIN Sales.SalesPerson AS s
         ON p.BusinessEntityID = s.BusinessEntityID
WHERE CAST (CAST (s.SalesYTD AS INT) AS CHAR (20)) LIKE '2%';
GO

결과 집합은 다음과 같습니다.

FirstName        LastName            SalesYTD         BusinessEntityID
---------------- ------------------- ---------------- -------------
Tsvi             Reiter              2811012.7151      279
Syed             Abbas               219088.8836       288
Rachel           Valdez              2241204.0424      289

F. CONVERT 또는 CAST에 형식화된 XML 사용

이 예시들은 XML 데이터 타입과 컬럼(SQL Server)을 사용하여 데이터를 타입이 있는 XML로 변환하는 데 사용되는 방식을 CONVERT 보여줍니다.

다음 예에서는 공백, 텍스트 및 태그가 있는 문자열을 형식화된 XML로 변환하고 불필요한 공백(노드 사이의 경계 공백)을 모두 제거합니다.

SELECT CONVERT (XML, '<root><child/></root>');

다음 예에서는 공백, 텍스트 및 태그가 있는 비슷한 문자열을 형식화된 XML로 변환하고 불필요한 공백(노드 사이의 경계 공백)을 유지합니다.

SELECT CONVERT (XML, '<root>          <child/>         </root>', 1);

다음 예에서는 공백, 텍스트 및 태그가 있는 문자열을 형식화된 XML로 캐스팅합니다.

SELECT CAST ('<Name><FName>Carol</FName><LName>Elliot</LName></Name>' AS XML);

더 많은 예시는 XML 데이터 인스턴스 생성 을 참조하세요.

G. CAST 및 CONVERT에 datetime 데이터 사용

GETDATE() 값으로 시작하는 다음 예에서는 현재 날짜와 시간을 표시합니다. 즉, CAST를 사용하여 현재 날짜와 시간을 문자 데이터 형식으로 변경한 다음, CONVERT를 사용하여 ISO 8601 형식으로 날짜와 시간을 표시합니다.

SELECT GETDATE() AS UnconvertedDateTime,
       CAST (GETDATE() AS NVARCHAR (30)) AS UsingCast,
       CONVERT (NVARCHAR (30), GETDATE(), 126) AS UsingConvertTo_ISO8601;
GO

결과 집합은 다음과 같습니다.

UnconvertedDateTime     UsingCast              UsingConvertTo_ISO8601
----------------------- ---------------------- ------------------------------
2022-04-18 09:58:04.570 Apr 18 2022  9:58AM    2022-04-18T09:58:04.570

이 예에서는 이전 예와 반대로 수행합니다. 이 예제에서는 날짜와 시간을 문자 데이터로 표시하고, CAST를 사용하여 문자 데이터를 datetime 데이터 형식으로 변경한 다음, CONVERT를 사용하여 문자 데이터를 datetime 데이터 형식으로 변경합니다.

SELECT '2006-04-25T15:50:59.997' AS UnconvertedText,
       CAST ('2006-04-25T15:50:59.997' AS DATETIME) AS UsingCast,
       CONVERT (DATETIME, '2006-04-25T15:50:59.997', 126) AS UsingConvertFrom_ISO8601;
GO

결과 집합은 다음과 같습니다.

UnconvertedText         UsingCast               UsingConvertFrom_ISO8601
----------------------- ----------------------- ------------------------
2006-04-25T15:50:59.997 2006-04-25 15:50:59.997 2006-04-25 15:50:59.997

H. CONVERT에 이진 및 문자 데이터 사용

이 예에서는 다양한 스타일을 사용하여 이진 및 문자 데이터를 변환한 결과를 보여 줍니다.

--Convert the binary value 0x4E616d65 to a character value.
SELECT CONVERT (CHAR (8), 0x4E616d65, 0) AS [Style 0, binary to character];

결과 집합은 다음과 같습니다.

Style 0, binary to character
----------------------------
Name

이 예시는 스타일이 1 결과 절단을 강제할 수 있음을 보여줍니다. 결과 집합 내 문자 0x 들이 절단을 강제합니다.

SELECT CONVERT (CHAR (8), 0x4E616d65, 1) AS [Style 1, binary to character];

결과 집합은 다음과 같습니다.

Style 1, binary to character
------------------------------
0x4E616D

이 예시는 스타일 2 이 결과를 잘라내지 않는다는 것을 보여줍니다. 결과에 문자 0x가 포함되지 않기 때문입니다.

SELECT CONVERT (CHAR (8), 0x4E616d65, 2) AS [Style 2, binary to character];

결과 집합은 다음과 같습니다.

Style 2, binary to character
------------------------------
4E616D65

문자 값을 Name 이진 값으로 변환하세요.

SELECT CONVERT (BINARY (8), 'Name', 0) AS [Style 0, character to binary];

결과 집합은 다음과 같습니다.

Style 0, character to binary
----------------------------
0x4E616D6500000000
SELECT CONVERT (BINARY (4), '0x4E616D65', 1) AS [Style 1, character to binary];

결과 집합은 다음과 같습니다.

Style 1, character to binary
----------------------------
0x4E616D65
SELECT CONVERT (BINARY (4), '4E616D65', 2) AS [Style 2, character to binary];

결과 집합은 다음과 같습니다.

Style 2, character to binary
----------------------------------
0x4E616D65

9\. 날짜 및 시간 데이터 형식 변환

이 예제는 date, time 및 datetime 데이터 형식의 변환을 보여 줍니다.

DECLARE @d1 AS DATE,
        @t1 AS TIME,
        @dt1 AS DATETIME;

SET @d1 = GETDATE();
SET @t1 = GETDATE();
SET @dt1 = GETDATE();
SET @d1 = GETDATE();

-- When converting date to datetime the minutes portion becomes zero.
SELECT @d1 AS DATE,
       CAST (@d1 AS DATETIME) AS [date as datetime];

-- When converting time to datetime the date portion becomes zero
-- which converts to January 1, 1900.
SELECT @t1 AS TIME,
       CAST (@t1 AS DATETIME) AS [time as datetime];

-- When converting datetime to date or time non-applicable portion is dropped.
SELECT @dt1 AS DATETIME,
       CAST (@dt1 AS DATE) AS [datetime as date],
       CAST (@dt1 AS TIME) AS [datetime as time];

date에서 datetime 또는 datetime2로 변환을 고려하는 경우 값이 호환되는 범위 내에 있는지 확인합니다. datetime의 최소 연도 값은 1753이지만, 0001 및 datetime2의 최소 연도 값은 입니다.

DECLARE @d1 AS DATE,
        @dt1 AS DATETIME,
        @dt2 AS DATETIME2;

SET @d1 = '1492-08-03';
--This is okay; Minimum YYYY for DATE is 0001

SET @dt2 = CAST (@d1 AS DATETIME2);
--This is okay; Minimum YYYY for DATETIME2 IS 0001

SET @dt1 = CAST (@d1 AS DATETIME);
--This returns an error with (Msg 242) "The conversion of a date data type to a datetime data type resulted in an out-of-range value."
--Minimum YYYY for DATETIME is 1753

J. CONVERT에 다양한 형식의 datetime 데이터 사용

GETDATE() 값에서 시작하는 이 예에서는 CONVERT를 사용하여 이 글의 날짜 및 시간 스타일 섹션의 모든 날짜 및 시간 스타일을 표시합니다.

판 # 예제 쿼리 샘플 결과
0 SELECT CONVERT(NVARCHAR, GETDATE(), 0) 8 월 23 2019 1:39 오후
1 SELECT CONVERT(NVARCHAR, GETDATE(), 1) 08/23/19
2 SELECT CONVERT(NVARCHAR, GETDATE(), 2) 19.08.23
3 SELECT CONVERT(NVARCHAR, GETDATE(), 3) 23/08/19
4 SELECT CONVERT(NVARCHAR, GETDATE(), 4) 23.08.19
5 SELECT CONVERT(NVARCHAR, GETDATE(), 5) 23-08-19
6 SELECT CONVERT(NVARCHAR, GETDATE(), 6) 8월 23일 19일
7 SELECT CONVERT(NVARCHAR, GETDATE(), 7) 8월 23일, 19일
8 또는 24 또는 108 SELECT CONVERT(NVARCHAR, GETDATE(), 8) 13:39:17
9 또는 109 SELECT CONVERT(NVARCHAR, GETDATE(), 9) 8 월 23 2019 1:39:17:090 오후
10 SELECT CONVERT(NVARCHAR, GETDATE(), 10) 08-23-19
11 SELECT CONVERT(NVARCHAR, GETDATE(), 11) 19/08/23
12 SELECT CONVERT(NVARCHAR, GETDATE(), 12) 190823
13 또는 113 SELECT CONVERT(NVARCHAR, GETDATE(), 13) 23 8 월 2019 13:39:17:090
14 또는 114 SELECT CONVERT(NVARCHAR, GETDATE(), 14) 13:39:17:090
20 또는 120 SELECT CONVERT(NVARCHAR, GETDATE(), 20) 2019-08-23 13:39:17
21 또는 25 또는 121 SELECT CONVERT(NVARCHAR, GETDATE(), 21) 2019-08-23 13:39:17.090
22 SELECT CONVERT(NVARCHAR, GETDATE(), 22) 08/23/19 오후 1:39:17
23 SELECT CONVERT(NVARCHAR, GETDATE(), 23) 2019-08-23
101 SELECT CONVERT(NVARCHAR, GETDATE(), 101) 08/23/2019
102 SELECT CONVERT(NVARCHAR, GETDATE(), 102) 2019.08.23
103 SELECT CONVERT(NVARCHAR, GETDATE(), 103) 23/08/2019
104 SELECT CONVERT(NVARCHAR, GETDATE(), 104) 23.08.2019
105 SELECT CONVERT(NVARCHAR, GETDATE(), 105) 23-08-2019
106 SELECT CONVERT(NVARCHAR, GETDATE(), 106) 2019년 8월 23일
107 SELECT CONVERT(NVARCHAR, GETDATE(), 107) 2019년 8월 23일
110 SELECT CONVERT(NVARCHAR, GETDATE(), 110) 08-23-2019
111 SELECT CONVERT(NVARCHAR, GETDATE(), 111) 2019/08/23
112 SELECT CONVERT(NVARCHAR, GETDATE(), 112) 20190823
113 SELECT CONVERT(NVARCHAR, GETDATE(), 113) 23 8 월 2019 13:39:17.090
120 SELECT CONVERT(NVARCHAR, GETDATE(), 120) 2019-08-23 13:39:17
121 SELECT CONVERT(NVARCHAR, GETDATE(), 121) 2019-08-23 13:39:17.090
126 SELECT CONVERT(NVARCHAR, GETDATE(), 126) 2019-08-23T13:39:17.09
127 SELECT CONVERT(NVARCHAR, GETDATE(), 127) 2019-08-23T13:39:17.09
130 SELECT CONVERT(NVARCHAR, GETDATE(), 130) 22 ل 1440 1:39:17.090P
131 SELECT CONVERT(NVARCHAR, GETDATE(), 131) 22/12/1440 1:39:17.090오후

11. 허용되는 변환에서 데이터 형식 우선 순위의 효과

다음의 예제는 varchar(10) 형식의 변수를 정의하고, 변수에 정수 값을 할당한 다음, 문자열과 변수의 연결을 선택합니다.

DECLARE @string AS VARCHAR (10);
SET @string = 1;

SELECT @string + ' is a string.' AS Result;

결과 집합은 다음과 같습니다.

Result
-----------------------
1 is a string.

int 값 1이 varchar로 변환되었습니다.

이 예제에서는 int 변수를 다음 대신 사용하여 유사한 쿼리를 표시합니다.

DECLARE @notastring AS INT;
SET @notastring = '1';

SELECT @notastring + ' is not a string.' AS Result;

이 경우 SELECT 문은 다음 오류를 발생시킵니다.

Msg 245, Level 16, State 1, Line 3
Conversion failed when converting the varchar value ' is not a string.' to data type int.

표현@notastring + ' is not a string.'식 를 평가하기 위해 데이터베이스 엔진은 데이터 타입 우선순위 규칙을 따라야 암묵적 변환을 완료한 후 표현식 결과를 계산할 수 있습니다. int가 varchar보다 우선순위가 높기 때문에, 데이터베이스 엔진은 문자열을 정수로 변환하려 시도하지만, 이 문자열이 정수로 변환될 수 없어 실패합니다.

변환 가능한 문자열을 제공하면, 다음 예시에서 확인할 수 있듯이 이 명제는 성공합니다:

DECLARE @notastring AS INT;
SET @notastring = '1';

SELECT @notastring + '1';

이 경우 문자열 '1'은 정수 값 1로 변환할 수 있으므로 이 SELECT 문은 값 2를 반환합니다. 제공된 데이터 타입이 정수일 경우, 연산자는 + 문자열 연결 대신 덧算수학적 연산자가 됩니다.

예제: Azure Synapse Analytics

12. CAST 및 CONVERT 사용

이 예에서는 제품 가격 첫 자리에 3이 있는 제품의 이름을 검색하고 이 제품의 ListPrice를 int로 변환합니다. AdventureWorksDW2025 데이터베이스를 사용합니다.

SELECT EnglishProductName AS ProductName,
       ListPrice
FROM dbo.DimProduct
WHERE CAST (ListPrice AS INT) LIKE '3%';

이 예제는 CONVERT 대신 CAST를 사용하여 동일한 쿼리를 보여 줍니다. AdventureWorksDW2025 데이터베이스를 사용합니다.

SELECT EnglishProductName AS ProductName,
       ListPrice
FROM dbo.DimProduct
WHERE CONVERT (INT, ListPrice) LIKE '3%';

13. CAST에 산술 연산자 사용

이 예에서는 제품 단가(UnitPrice)를 할인율(UnitPriceDiscountPct)로 나누어 한 열 값을 계산합니다. 그런 다음, 이 결과를 가장 가까운 정수로 반올림한 후 int 데이터 형식으로 변환합니다. 다음 예에서는 AdventureWorksDW2025 데이터베이스를 사용합니다.

SELECT ProductKey,
       UnitPrice,
       UnitPriceDiscountPct,
       CAST (ROUND(UnitPrice * UnitPriceDiscountPct, 0) AS INT) AS DiscountPrice
FROM dbo.FactResellerSales
WHERE SalesOrderNumber = 'SO47355'
      AND UnitPriceDiscountPct > .02;

결과 집합은 다음과 같습니다.

ProductKey  UnitPrice  UnitPriceDiscountPct  DiscountPrice
----------  ---------  --------------------  -------------
323         430.6445   0.05                  22
213         18.5043    0.05                  1
456         37.4950    0.10                  4
456         37.4950    0.10                  4
216         18.5043    0.05                  1

14. CAST에 LIKE 절 사용

이 예시는 머니 열 ListPrice 을 int 타입으로, 그리고 char(20) 타입으로 변환하여 절이 LIKE 이를 사용할 수 있도록 합니다. 다음 예에서는 AdventureWorksDW2025 데이터베이스를 사용합니다.

SELECT EnglishProductName AS Name,
       ListPrice
FROM dbo.DimProduct
WHERE CAST (CAST (ListPrice AS INT) AS CHAR (20)) LIKE '2%';

15. CAST 및 CONVERT에 datetime 데이터 사용

이 예제에서는 현재 날짜와 시간을 표시하고, CAST를 사용하여 현재 날짜와 시간을 문자 데이터 형식으로 변환한 다음, CONVERT를 사용하여 날짜와 시간을 ISO 8601 형식으로 표시합니다. 다음 예에서는 AdventureWorksDW2025 데이터베이스를 사용합니다.

SELECT TOP (1) SYSDATETIME() AS UnconvertedDateTime,
               CAST (SYSDATETIME() AS NVARCHAR (30)) AS UsingCast,
               CONVERT (NVARCHAR (30), SYSDATETIME(), 126) AS UsingConvertTo_ISO8601
FROM dbo.DimCustomer;

결과 집합은 다음과 같습니다.

UnconvertedDateTime     UsingCast                     UsingConvertTo_ISO8601
---------------------   ---------------------------   ---------------------------
07/20/2010 1:44:31 PM   2010-07-20 13:44:31.5879025   2010-07-20T13:44:31.5879025

이 예에서는 이전 예와 거의 반대로 수행됩니다. 이 예제에서는 날짜와 시간을 문자 데이터로 표시하고, CAST를 사용하여 문자 데이터를 datetime 데이터 형식으로 변경한 다음, CONVERT를 사용하여 문자 데이터를 datetime 데이터 형식으로 변경합니다. 다음 예에서는 AdventureWorksDW2025 데이터베이스를 사용합니다.

SELECT TOP (1) '2010-07-25T13:50:38.544' AS UnconvertedText,
               CAST ('2010-07-25T13:50:38.544' AS DATETIME) AS UsingCast,
               CONVERT (DATETIME, '2010-07-25T13:50:38.544', 126) AS UsingConvertFrom_ISO8601
FROM dbo.DimCustomer;

결과 집합은 다음과 같습니다.

UnconvertedText         UsingCast               UsingConvertFrom_ISO8601
----------------------- ----------------------- ------------------------
2010-07-25T13:50:38.544 07/25/2010 1:50:38 PM   07/25/2010 1:50:38 PM