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
...