Récupérer les options de session

Comment connaître la liste des options de session (par exemple SET NOCOUNT ON) que nous utilisons dans la session en cours ou bien dans le contexte d’exécution ?
Ce snippet est valable pour les options suivantes :

– DISABLE_DEF_CNST_CHK
– IMPLICIT_TRANSACTIONS
– CURSOR_CLOSE_ON_COMMIT
– ANSI_WARNINGS
– ANSI_PADDING
– ANSI_NULLS
– ARITHABORT
– ARITHIGNORE
– QUOTED_IDENTIFIER
– NOCOUNT
– ANSI_NULL_DFLT_ON
– ANSI_NULL_DFLT_OFF
– CONCAT_NULL_YIELDS_NULL
– NUMERIC_ROUNDABORT
– XACT_ABORT

Et pas pour les suivantes :

– TEXTSIZE
– LANGUAGE
– DATEFORMAT
– DATEFIRST
– LOCK_TIMEOUT
– ISOLATION LEVEL

Il est assez simple de vérifier la liste des options de session comme SET NOCOUNT ON à l’aide de l’instruction DBCC USEROPTIONS :

Mais si l’on souhaite pouvoir manipuler le résultat, nous devons écrire :

1
2
3
4
5
6
7
8
9
10
---------------------------------
-- 27/09/2009 - Nicolas SOUQUET -
---------------------------------
SELECT [Set Option], [Value]
FROM OPENROWSET
(
  'SQLNCLI',
  'Server=monServeur\monInstanceSQLServer;Uid=login;Pwd=motDePasse;',
  'SET FMTONLY OFF;EXEC(''DBCC USEROPTIONS'')'
)

Mais comme la commande EXEC s’exécute dans un autre contexte, on n’obtient pas les informations relatives à la session en cours.
Néanmoins la fonction @@OPTIONS elle aussi une valeur qui est une somme de valeurs des puissances de 2, où chacune des options est une puissance de 2.
Dès lors nous pouvons écrire la fonction suivante :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
---------------------------------
-- 27/09/2009 - Nicolas SOUQUET -
---------------------------------
CREATE FUNCTION FnGetSessionOptions()
  RETURNS TABLE
  WITH SCHEMABINDING
AS
  RETURN
  (
    SELECT sessionOptions
    FROM
    (
      SELECT CASE
            WHEN @@OPTIONS & 1 = 1 THEN 'DISABLE_DEF_CNST_CHK'
            ELSE ''
          END AS sessionOptions
      UNION
      SELECT CASE
            WHEN @@OPTIONS & 2 = 2 THEN 'IMPLICIT_TRANSACTIONS'
            ELSE ''
          END
      UNION
      SELECT CASE
            WHEN @@OPTIONS & 4 = 4 THEN 'CURSOR_CLOSE_ON_COMMIT'
            ELSE ''
          END
      UNION
      SELECT CASE
            WHEN @@OPTIONS & 8 = 8 THEN 'ANSI_WARNINGS'
            ELSE ''
          END
      UNION
      SELECT CASE
            WHEN @@OPTIONS & 16 = 16 THEN 'ANSI_PADDING'
            ELSE ''
          END
      UNION
      SELECT CASE
            WHEN @@OPTIONS & 32 = 32 THEN 'ANSI_NULLS'
            ELSE ''
          END
      UNION
      SELECT CASE
            WHEN @@OPTIONS & 64 = 64 THEN 'ARITHABORT'
            ELSE ''
          END
      UNION
      SELECT CASE
            WHEN @@OPTIONS & 128 = 128 THEN 'ARITHIGNORE'
            ELSE ''
          END
      UNION
      SELECT CASE
            WHEN @@OPTIONS & 256 = 256 THEN 'QUOTED_IDENTIFIER'
            ELSE ''
          END
      UNION
      SELECT CASE
            WHEN @@OPTIONS & 512 = 512 THEN 'NOCOUNT'
            ELSE ''
          END
      UNION
      SELECT CASE
            WHEN @@OPTIONS & 1024 = 1024 THEN 'ANSI_NULL_DFLT_ON'
            ELSE ''
          END
      UNION
      SELECT CASE
            WHEN @@OPTIONS & 2048 = 2048 THEN 'ANSI_NULL_DFLT_OFF'
            ELSE ''
          END
      UNION
      SELECT CASE
            WHEN @@OPTIONS & 4096 = 4096 THEN 'CONCAT_NULL_YIELDS_NULL'
            ELSE ''
          END
      UNION
      SELECT CASE
            WHEN @@OPTIONS & 8192 = 8192 THEN 'NUMERIC_ROUNDABORT'
            ELSE ''
          END
      UNION
      SELECT CASE
            WHEN @@OPTIONS & 16384 = 16384 THEN 'XACT_ABORT'
            ELSE ''
          END
    ) AS TMP
    WHERE sessionOptions > ''
  )

Ce qui nous permet de manipuler le résultat de celle-ci très simplement :

1
2
SELECT sessionOptions
FROM dbo.FnGetSessionOptions()

où, avec aucune option de session modifiée, nous obtenons :

ElSuket

Laisser un commentaire