Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Server 2008 passando tipo de dados como parâmetro para função


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