ฉันมีปัญหาเดียวกันและพบว่าปัญหานี้เกิดขึ้นเนื่องจาก SQL Server ไม่ทำการเปรียบเทียบกับอักขระที่แปลงเป็นจำนวนเต็มในลักษณะที่เหมือนกัน ในการทดสอบของฉันฉันพบว่าการเปรียบเทียบอักขระที่แปลงแล้วเช่นเครื่องหมายอัศเจรีย์จะส่งคืนข้อผิดพลาดการแปลงประเภทในขณะที่การเปรียบเทียบอักขระที่แปลงอื่น ๆ เช่นช่องว่างจะถูกกำหนดให้อยู่นอกช่วง
โค้ดตัวอย่างนี้จะทดสอบสถานการณ์ที่เป็นไปได้ต่างๆและนำเสนอวิธีแก้ปัญหาโดยใช้คำสั่ง REPLACE ที่ซ้อนกัน REPLACE กำหนดว่ามีอักขระใด ๆ ในสตริงที่ไม่ใช่ตัวเลขหรือเครื่องหมายทับและหากมีอยู่ความยาวของสตริงจะมากกว่าศูนย์ซึ่งแสดงว่ามีอักขระ 'ไม่ถูกต้อง' และวันที่ไม่ถูกต้อง .
DECLARE @str varchar(10)
SET @str = '12/10/2012'
IF convert(int, substring(@str,4,2)) <= 31 AND convert(int, substring(@str,4,2)) >= 1
PRINT @str+': Passed Test'
ELSE PRINT @str+': Failed Test'
GO
DECLARE @str varchar(10)
SET @str = '12/10/2012'
PRINT 'Number of characters in ' + @str + ' that are not numerals or a slash (0 means the date is valid; all values greater than 0 indicate a problem): ' + convert(varchar(5),len(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(@str,'0',''),'1',''),'2',''),'3',''),'4',''),'5',''),'6',''),'7',''), '8',''),'9',''),'/',''),' ','+')))
PRINT ''
GO
DECLARE @str varchar(10)
SET @str = '12/!0/2012'
IF convert(int, substring(@str,4,2)) <= 31 AND convert(int, substring(@str,4,2)) >= 1
PRINT @str+': Passed Test'
ELSE PRINT @str+': Failed Test'
GO
DECLARE @str varchar(10)
SET @str = '12/!0/2012'
PRINT 'Number of characters in ' + @str + ' that are not numerals or a slash (0 means the date is valid; all values greater than 0 indicate a problem): ' + convert(varchar(5),len(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(@str,'0',''),'1',''),'2',''),'3',''),'4',''),'5',''),'6',''),'7',''), '8',''),'9',''),'/',''),' ','+')))
PRINT ''
GO
DECLARE @str varchar(10)
SET @str = '12/ /2012'
IF convert(int, substring(@str,4,2)) <= 31 AND convert(int, substring(@str,4,2)) >= 1
PRINT @str+': Passed Test'
ELSE PRINT @str+': Failed Test'
GO
DECLARE @str varchar(10)
SET @str = '12/ /2012'
PRINT 'Number of characters in ' + @str + ' that are not numerals or a slash (0 means the date is valid; all values greater than 0 indicate a problem): ' + convert(varchar(5),len(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(@str,'0',''),'1',''),'2',''),'3',''),'4',''),'5',''),'6',''),'7',''), '8',''),'9',''),'/',''),' ','+')))
เอาท์พุต: