Ich hatte das gleiche Problem und stellte fest, dass dieses Problem auftritt, weil SQL Server keine Vergleiche mit Zeichen durchführt, die auf identische Weise in Ganzzahlen konvertiert wurden. In meinem Test habe ich festgestellt, dass einige Vergleiche von konvertierten Zeichen, wie z. B. das Ausrufezeichen, Typkonvertierungsfehler zurückgeben, während andere Vergleiche von konvertierten Zeichen, wie z. B. das Leerzeichen, außerhalb des Bereichs liegen.
Dieser Beispielcode testet die verschiedenen möglichen Szenarien und präsentiert eine Lösung mit verschachtelten REPLACE-Anweisungen. Der REPLACE bestimmt, ob die Zeichenfolge Zeichen enthält, die keine Ziffern oder Schrägstriche sind, und falls vorhanden, ist die Länge der Zeichenfolge größer als Null, wodurch angezeigt wird, dass "schlechte" Zeichen vorhanden sind und das Datum ungültig ist .
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',''),'/',''),' ','+')))
Ausgabe: