Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server 2008, der den Datentyp als Parameter für die Funktion übergibt

Nun, es gibt kein TRY_CONVERT() oder TRY_CAST() in SQL-Server 2008, aber Sie können die internen Umwandlungen von XML in nullfähige Typen verwenden.

Versuchen Sie dies

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;

Etwas abgedroschen... Aber irgendwie schön;-)

Einige Erklärung

Der CAST('' AS XML) ist nur ein Trick, um ein echtes XML zu bekommen um die nativen Methoden von XML zu nutzen. Die sql:column() ist eine XQuery -Funktion, mit der Sie die Spalte eines Satzes in die XQuery aufnehmen können (verwenden Sie sql:variable für Variablen).

Der cast as xs:int? versucht, den String als int-Wert zu parsen und gibt NULL zurück, wenn dies nicht funktioniert.

Das Limit ist:Dies wird immer die Standardeinstellungen Ihres Systems verwenden (ähnlich wie TRY_CAST ). Mit TRY_CONVERT Mit dem dritten Parameter hätten Sie mehr Kontrolle über die Ausgabe...

Hinweis:XQuery/Xpath Groß- und Kleinschreibung wird strikt beachtet. Es gibt also xs:dateTime? , aber Sie würden einen Fehler mit xs:datetime erhalten ...