Welnu, er is geen TRY_CONVERT()
of TRY_CAST()
in SQL-Server 2008, maar u kunt de interne casts van XML naar nullable-typen gebruiken.
Probeer dit
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;
Beetje een hack... Maar op de een of andere manier mooi;-)
Enige uitleg
De CAST('' AS XML)
is gewoon een truc om een echte XML te krijgen om gebruik te maken van de native methoden van XML. De sql:column()
is een XQuery
-functie, waarmee u de kolom van een set kunt opnemen in de XQuery
(gebruik sql:variable
voor variabelen).
De cast as xs:int?
zal proberen de string te ontleden als int-waarde en zal NULL teruggeven als dit niet werkt.
De limiet is:dit gebruikt altijd de standaardinstellingen van uw systeem (vergelijkbaar met TRY_CAST
). Met TRY_CONVERT
je zou meer controle hebben over de output met de derde parameter...
Hint:XQuery/Xpath
is strikt hoofdlettergevoelig. Dus er is xs:dateTime?
, maar je krijgt een foutmelding met xs:datetime
...