Bene, non c'è TRY_CONVERT()
o TRY_CAST()
in SQL-Server 2008, ma puoi utilizzare i cast interni di XML per i tipi nullable.
Prova questo
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 po' un trucco... Ma in qualche modo bello;-)
Alcune spiegazioni
Il CAST('' AS XML)
è solo un trucco per ottenere un XML reale per utilizzare i metodi nativi di XML. Il sql:column()
è un XQuery
-function, che ti permette di includere la colonna di un set in XQuery
(usa sql:variable
per le variabili).
Il cast as xs:int?
proverà ad analizzare la stringa come valore int e restituirà NULL se non funziona.
Il limite è:Questo utilizzerà sempre le impostazioni predefinite del tuo sistema (simile a TRY_CAST
). Con TRY_CONVERT
avresti più controllo sull'output con il terzo parametro...
Suggerimento:XQuery/Xpath
è rigorosamente case-sensitive. Quindi c'è xs:dateTime?
, ma riceverai un errore con xs:datetime
...