아래 쿼리는 ...
SELECT YEAR(TRY_CAST(m.MetaValue AS DATE))
FROM MetaData m
...이 오류가 발생합니다.
String or binary data would be truncated.
쿼리를 유효한 레코드 집합으로 필터링하면 오류가 사라집니다.
SELECT YEAR(TRY_CAST(m.MetaValue AS DATE))
FROM MetaData m
WHERE m.MetaKey IN (...)
선택한 표현식을 기준으로 필터링하려고하면 쿼리가 다시 실패합니다.
SELECT * FROM (
SELECT YEAR(TRY_CAST(m.MetaValue AS DATE)) AS Yr
FROM MetaData m
WHERE MetaKey IN (...)
) x
WHERE x.Yr > 1900
여기서 무슨 일이 일어나고 있습니까? SQL Server가 이러한 행을 따라 쿼리를 최적화하고 있다는 느낌을 받았지만이를 방지하는 방법을 모르겠습니다.
SELECT YEAR(TRY_CAST(m.MetaValue AS DATE)) AS Yr
FROM MetaData m
WHERE MetaKey IN (...)
AND YEAR(TRY_CAST(m.MetaValue AS DATE)) > 1900
바이트 인 경우이 문제 MetaValue
가 발생 > 8,000
합니다. 에 의해 잡히지 않은 오류가 발생합니다 TRY_CAST
.
이것에 대한 간단한 데모는 다음과 같습니다 ( db <> fiddle )
DECLARE @X NVARCHAR(MAX) = 'X'
SET @X = REPLICATE(@X, 4001)
SELECT TRY_CAST(@X AS DATE)
일반적으로 SQL Server는 조건과 일치하는 모든 항목 이 짧은 문자열 인 경우에도 논리적 처리 순서를 벗어난 식 을 평가할 수 있습니다 WHERE MetaKey IN (...)
( 여기 에서도 경고 됨 ).
TRY_CAST
추가 CASE
표현식 에서 가드하면 이 경우 문제가 해결됩니다.
SELECT CASE WHEN DATALENGTH(m.MetaValue) <8000 THEN YEAR(TRY_CAST(m.MetaValue AS DATE)) END
FROM MetaData m
WHERE m.MetaKey IN (...)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다