Bem, não há
TRY_CONVERT() ou TRY_CAST() no SQL-Server 2008, mas você pode usar as conversões internas do XML para tipos anuláveis. Tente isso
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;
Meio hack... Mas de alguma forma lindo;-)
Alguma explicação
O
CAST('' AS XML) é apenas um truque para obter um XML real para usar os métodos nativos do XML. O sql:column() é uma XQuery -função, que permite incluir a coluna de um conjunto no XQuery (use sql:variable para variáveis). O
cast as xs:int? tentará analisar a string como valor int e retornará NULL se isso não funcionar. O limite é:Isso sempre usará os padrões do seu sistema (semelhante a
TRY_CAST ). Com TRY_CONVERT você teria mais controle sobre a saída com o terceiro parâmetro ... Dica:
XQuery/Xpath é estritamente sensível a maiúsculas e minúsculas. Então existe xs:dateTime? , mas você receberia um erro com xs:datetime ...