Tôi đã gặp vấn đề tương tự và xác định rằng vấn đề này phát sinh do SQL Server không thực hiện so sánh trên các ký tự được chuyển đổi thành số nguyên theo cách giống hệt nhau. Trong thử nghiệm của mình, tôi nhận thấy rằng một số so sánh của các ký tự được chuyển đổi, chẳng hạn như dấu chấm than, sẽ trả về lỗi chuyển đổi kiểu, trong khi các so sánh khác của các ký tự được chuyển đổi, chẳng hạn như khoảng trắng, sẽ được xác định là nằm ngoài phạm vi.
Mã mẫu này kiểm tra các tình huống có thể xảy ra khác nhau và trình bày giải pháp bằng cách sử dụng các câu lệnh REPLACE lồng nhau. REPLACE xác định xem có bất kỳ ký tự nào trong chuỗi không phải là số hoặc dấu gạch chéo hay không và nếu có, độ dài của chuỗi sẽ lớn hơn 0, do đó cho biết rằng có các ký tự 'xấu' và ngày tháng không hợp lệ .
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',''),'/',''),' ','+')))
Đầu ra: