Bueno, no hay TRY_CONVERT()
o TRY_CAST()
en SQL-Server 2008, pero puede usar conversiones internas de XML para tipos anulables.
Prueba esto
DECLARE @tbl TABLE(SomeInt VARCHAR(100));
INSERT INTO @tbl VALUES('123')
,('blah') --bad data
SELECT t.*
,CAST('' AS XML).value('sql:column("t.SomeInt") cast as xs:int?','int')
FROM @tbl t;
Un truco... pero de alguna manera hermoso;-)
Alguna explicación
El CAST('' AS XML)
es solo un truco para obtener un XML real para poder utilizar los métodos nativos de XML. El sql:column()
es una XQuery
-función, que le permite incluir la columna de un conjunto en el XQuery
(use sql:variable
para variables).
El cast as xs:int?
intentará analizar la cadena como valor int y devolverá NULL si esto no funciona.
El límite es:Esto siempre usará los valores predeterminados de su sistema (similar a TRY_CAST
). Con TRY_CONVERT
tendrías más control sobre la salida con el tercer parámetro...
Pista:XQuery/Xpath
es estrictamente sensible a mayúsculas y minúsculas. Entonces hay xs:dateTime?
, pero obtendrá un error con xs:datetime
...