SET OPTIONs abfragen und SSIS-Probleme vermeiden
Im vorliegenden Fall hatte ich ein Problem mit einem SSIS-Paket dass mit einer Fehlermeldung abgebrochen wurde. Die Fehlermeldung besagte, dass es eine Warnung beim Aufruf der Datenquelle (View) gegeben hätte.
Diese Warnung sollte nach meiner Meinung auch als Warnung und nicht als Fehler behandelt werden. Das Problem war leicht zu beheben, ich musste nur ein Set-Kommando vor der View platzieren dass die ANSI_WARNINGS abschaltet.
| T-SQL | | copy code | | ? |
| 1 | SET ANSI_WARNINGS OFF |
Der View Aufruf liefert jetzt den Returncode 0 zurück und das Paket tut das was es immer hätte tun sollen.
Im Nachhinein stellte sich mir jedoch die Frage, welche SET-Options denn eigentlich für eine aktuell ausgeführte Session gerade aktiv sind und wie diese abgefragt werden können?
Für diesen Zweck stellt SQL-Server die Variable @@OPTIONS zur Verfügung. Hier kann man über eine bitweise UND-Verknüpfung den Status der verschiedenen SET-Optionen bestimmen.
Da mir dies jedoch für den wiederholten Gebrauch zu unhandlich erschien, habe ich mal eben eine kleine Funktion geschrieben die den Status aller Optionen in einer Tabelle zurückliefert:
| T-SQL | | copy code | | ? |
| 01 | CREATE FUNCTION fn_Get_SetOptions() |
| 02 | RETURNS TABLE |
| 03 | AS RETURN |
| 04 | WITH Options AS |
| 05 | ( |
| 06 | SELECT CONVERT(BIT,(@@OPTIONS & 0x0001) / 0x0001) AS DISABLE_DEF_CNST_CHK |
| 07 | ,CONVERT(BIT,(@@OPTIONS & 0x0002) / 0x0002) AS IMPLICIT_TRANSACTIONS |
| 08 | ,CONVERT(BIT,(@@OPTIONS & 0x0004) / 0x0004) AS CURSOR_CLOSE_ON_COMMIT |
| 09 | ,CONVERT(BIT,(@@OPTIONS & 0x0008) / 0x0008) AS ANSI_WARNINGS |
| 10 | ,CONVERT(BIT,(@@OPTIONS & 0x0010) / 0x0010) AS ANSI_PADDING |
| 11 | ,CONVERT(BIT,(@@OPTIONS & 0x0020) / 0x0020) AS ANSI_NULLS |
| 12 | ,CONVERT(BIT,(@@OPTIONS & 0x0040) / 0x0040) AS ARITHABORT |
| 13 | ,CONVERT(BIT,(@@OPTIONS & 0x0080) / 0x0080) AS ARITHIGNORE |
| 14 | ,CONVERT(BIT,(@@OPTIONS & 0x0100) / 0x0100) AS QUOTED_IDENTIFIER |
| 15 | ,CONVERT(BIT,(@@OPTIONS & 0x0200) / 0x0200) AS NOCOUNT |
| 16 | ,CONVERT(BIT,(@@OPTIONS & 0x0400) / 0x0400) AS ANSI_NULL_DFLT_ON |
| 17 | ,CONVERT(BIT,(@@OPTIONS & 0x0800) / 0x0800) AS ANSI_NULL_DFLT_OFF |
| 18 | ,CONVERT(BIT,(@@OPTIONS & 0x1000) / 0x1000) AS CONCAT_NULL_YIELDS_NULL |
| 19 | ,CONVERT(BIT,(@@OPTIONS & 0x2000) / 0x2000) AS NUMERIC_ROUNDABORT |
| 20 | ,CONVERT(BIT,(@@OPTIONS & 0x4000) / 0x4000) AS XACT_ABORT |
| 21 | ) |
| 22 | SELECT * FROM |
| 23 | ( |
| 24 | SELECT * FROM Options |
| 25 | unpivot |
| 26 | ( |
| 27 | IsSet FOR SetOption in |
| 28 | ( |
| 29 | DISABLE_DEF_CNST_CHK |
| 30 | ,IMPLICIT_TRANSACTIONS |
| 31 | ,CURSOR_CLOSE_ON_COMMIT |
| 32 | ,ANSI_WARNINGS |
| 33 | ,ANSI_PADDING |
| 34 | ,ANSI_NULLS |
| 35 | ,ARITHABORT |
| 36 | ,ARITHIGNORE |
| 37 | ,QUOTED_IDENTIFIER |
| 38 | ,NOCOUNT |
| 39 | ,ANSI_NULL_DFLT_ON |
| 40 | ,ANSI_NULL_DFLT_OFF |
| 41 | ,CONCAT_NULL_YIELDS_NULL |
| 42 | ,NUMERIC_ROUNDABORT |
| 43 | ,XACT_ABORT |
| 44 | ) |
| 45 | ) unpvt |
| 46 | ) x |
| 47 | GO |
| 48 | |
| 49 | -- ---------------- So wird die Funktion aufgerufen ------------------ |
| 50 | SELECT * FROM [AdventureWorks].[dbo].[fn_Get_SetOptions] () |
| 51 | |
| 52 |
Hier noch die Values für die verschiedenen SET-Optionen zum selber verknüpfen:
| 1 |
DISABLE_DEF_CNST_CHK |
| 2 |
IMPLICIT_TRANSACTIONS |
| 4 |
CURSOR_CLOSE_ON_COMMIT |
| 8 |
ANSI_WARNINGS |
| 16 |
ANSI_PADDING |
| 32 |
ANSI_NULLS |
| 64 |
ARITHABORT |
| 128 |
ARITHIGNORE |
| 256 |
QUOTED_IDENTIFIER |
| 512 |
NOCOUNT |
| 1024 |
ANSI_NULL_DFLT_ON |
| 2048 |
ANSI_NULL_DFLT_OFF |
| 4096 |
CONCAT_NULL_YIELDS_NULL |
| 8192 |
NUMERIC_ROUNDABORT |
| 16384 |
XACT_ABORT |
have fun
Facebook
XING
META-SQL