Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL Server 2008 passando il tipo di dati come parametro per la funzione

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