T-SQL 코드가 제대로 작동하는 개발 서버가 있지만 프로덕션 서버로 이식하면 중단됩니다. 코드는 다음과 같습니다.
DECLARE @ModelNumber AS int = 67787
;WITH UsedNumbers (clnum, clname1) AS
(
SELECT
clnum COLLATE SQL_Latin1_General_CP1_CI_AS AS clnum,
clname1 COLLATE SQL_Latin1_General_CP1_CI_AS AS clname1
FROM
ELITE.son_db.dbo.client
WHERE
clnum NOT LIKE '%[A-Z]%'
),
OrderedNumbers (clnum, clnum_int, clname1) AS
(
SELECT TOP 500000
clnum, CAST(clnum AS int) AS clnum_int, clname1
FROM
UsedNumbers
WHERE
CAST(clnum AS int) >= @ModelNumber
ORDER BY
clnum
)
SELECT TOP 1
REPLACE(STR(previd + 1, 6), ' ', '0') AS previd
FROM
(SELECT
clnum_int, LAG(clnum_int) OVER (ORDER BY clnum) previd
FROM
OrderedNumbers) q
WHERE
previd <> clnum_int - 1
ORDER BY
clnum_int
이 코드를 개발 서버에서 실행하면 문제없이 결과가 반환됩니다. 프로덕션 서버에서 실행할 때 다음 오류가 발생합니다.
메시지 245, 수준 16, 상태 1, 줄 3
varchar 값 '57235A'를 데이터 형식 int로 변환 할 때 변환에 실패했습니다.
두 서버에서 마지막 SELECT 문을 다음으로 바꾸면
SELECT *
FROM UsedNumbers
WHERE clnum LIKE '57%'
개발 서버 나 프로덕션 서버에서 결과가 나오지 않아서 오류 메시지가 완전히 혼란 스럽습니다.
사이드 포인트 : 초기 SELECT 문에서 ELITE는 두 서버에있는 연결된 서버를 나타냅니다. 두 연결된 서버 모두 동일한 데이터베이스를 가리 킵니다. 즉, 연결된 서버가 가리키는 개발 및 프로덕션 버전이 없습니다. 67787은 최종 사용자가 나에게 제공 한 시드 값입니다. 그 숫자 뒤의 다음 숫자를 찾는 것 외에는 프로그램에 아무런 의미가 없습니다.
누구든지 여기서 무슨 일이 일어날 수 있는지 제안 할 수 있습니까?
분명히 캐스팅 할 때 여기에서 생성 된 오류
OrderedNumbers (clnum, clnum_int, clname1)
AS
(
SELECT TOP 500000 clnum, CAST(clnum AS int) AS clnum_int, clname1
FROM UsedNumbers
WHERE CAST(clnum AS int) >= @ModelNumber
ORDER BY clnum
)
clnum이 VARCHAR 및 CAST ()를 int 중단으로 유출하는 방법. 프로덕션은 cte를 병렬로 실행할 수 있습니다. ISNUMERIC (clnum) = 1을 사용하십시오.
OrderedNumbers (clnum, clnum_int, clname1)
AS
(
SELECT TOP 500000 clnum, CAST(clnum AS int) AS clnum_int, clname1
FROM UsedNumbers
WHERE ISNUMERIC ( clnum ) = 1
AND CAST(clnum AS int) >= @ModelNumber
ORDER BY clnum
)
첫 번째 cte에서 ISNUMERIC ()을 사용할 수도 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다