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