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