>데이터 베이스 >MySQL 튜토리얼 >SQL Server IN 절에서 VARCHAR 변수를 사용하면 변환 오류가 발생하는 이유는 무엇입니까?

SQL Server IN 절에서 VARCHAR 변수를 사용하면 변환 오류가 발생하는 이유는 무엇입니까?

DDD
DDD원래의
2025-01-09 20:42:46307검색

Why Does Using a VARCHAR Variable in an SQL Server IN Clause Cause a Conversion Error?

SQL Server IN 절 및 VARCHAR 변수: 문제 해결 가이드

문제:

다음 SQL Server 코드는 변환 오류를 생성합니다.

<code class="language-sql">DECLARE @ExcludedList VARCHAR(MAX)
SET @ExcludedList = '3, 4, 22' -- Note: Strings are now enclosed in single quotes

SELECT * FROM A WHERE Id NOT IN (@ExcludedList)</code>

오류 설명:

IN 절에는 비교되는 열과 동일한 데이터 유형의 쉼표로 구분된 값 목록이 필요합니다(이 경우 Id(정수로 추정)). @ExcludedList 변수는 문자열을 포함하는 VARCHAR(MAX)입니다. SQL Server는 암시적으로 전체 문자열을 정수로 변환하려고 시도하며 문자열에 쉼표가 포함되어 있으므로 오류가 발생합니다.

해결책:

IN 절 내에서 직접 문자열 변수를 사용하지 마세요. 대신 테이블 값 접근 방식을 사용하세요.

<code class="language-sql">DECLARE @ExcludedList VARCHAR(MAX)
SET @ExcludedList = '3, 4, 22'

DECLARE @IntExcludedList TABLE (ID INT);
INSERT INTO @IntExcludedList (ID)
SELECT value FROM STRING_SPLIT(@ExcludedList, ',');

SELECT * FROM A WHERE Id NOT IN (SELECT ID FROM @IntExcludedList);</code>

이 개선된 코드는 쉼표로 구분된 문자열을 개별 행으로 효율적으로 분할하는 내장 함수인 STRING_SPLIT를 활용합니다. 그런 다음 각 행의 값이 정수 테이블 변수 @IntExcludedList에 삽입되어 Id 열과 정확하게 비교할 수 있습니다. 이 방법은 암시적 변환을 방지하고 IN 절이 의도한 대로 작동하도록 보장합니다. @ExcludedList.

에서 문자열 값 주위에 작은따옴표를 사용하는 것에 유의하세요.

이 접근 방식은 SUBSTRINGPATINDEX을 사용한 원래 솔루션보다 더 효율적이고 읽기 쉽습니다. 최적의 성능을 위해 SQL Server에 내장된 문자열 조작 기능을 활용합니다.

위 내용은 SQL Server IN 절에서 VARCHAR 변수를 사용하면 변환 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.