sql >> Base de Datos >  >> RDS >> Sqlserver

SQL Server 2008 pasando el tipo de datos como parámetro para la función

Bueno, no hay TRY_CONVERT() o TRY_CAST() en SQL-Server 2008, pero puede usar conversiones internas de XML para tipos anulables.

Prueba esto

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 truco... pero de alguna manera hermoso;-)

Alguna explicación

El CAST('' AS XML) es solo un truco para obtener un XML real para poder utilizar los métodos nativos de XML. El sql:column() es una XQuery -función, que le permite incluir la columna de un conjunto en el XQuery (use sql:variable para variables).

El cast as xs:int? intentará analizar la cadena como valor int y devolverá NULL si esto no funciona.

El límite es:Esto siempre usará los valores predeterminados de su sistema (similar a TRY_CAST ). Con TRY_CONVERT tendrías más control sobre la salida con el tercer parámetro...

Pista:XQuery/Xpath es estrictamente sensible a mayúsculas y minúsculas. Entonces hay xs:dateTime? , pero obtendrá un error con xs:datetime ...