Faq SQL Server

80
SQL Server - La FAQ Date de publication : 28.9.2005 Dernière mise à jour : 24.5.2009 Question / réponses à tout ce que vous avez toujours voulu savoir sur Microsoft SQL Server sans jamais oser le demander

Transcript of Faq SQL Server

Page 1: Faq SQL Server

SQL Server - La FAQ

Date de publication : 28.9.2005

Dernière mise à jour : 24.5.2009

Question / réponses à tout ce que vous avez toujours voulu savoir sur Microsoft SQLServer sans jamais oser le demander

Page 2: Faq SQL Server

Ont contribué à cette FAQ :

Fabien Celaia - Morsi - Wolo Laurent - Rudi Bruchez -Maitrebn - devdev - drahu - HULK - spidetra - FrédéricBrouard - davidou2001 - Ylarvor - elsuket - maitrebn -

Page 3: Faq SQL Server

SQL Server - La FAQ

- 3 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

1. Consulter les informations de schéma (23) ...............................................................................................................................42. Consulter la taille des objects de la base de données (4) ....................................................................................................... 173. Administration de la base de données (39) .............................................................................................................................19

3.1. Editions de SQL Serveur (5) ..........................................................................................................................................203.2. Utilisateurs et connexions (11) .......................................................................................................................................223.3. Connexions au serveur (10) ............................................................................................................................................283.4. Performances (2) .............................................................................................................................................................313.5. Sauvegardes et restauration (11) .................................................................................................................................... 34

4. Trucs et Astuces en T-SQL (44) .............................................................................................................................................394.1. Fonctions (11) .................................................................................................................................................................404.2. Limiter le jeu de résultat (14) ........................................................................................................................................ 464.3. Validation des données (5) .............................................................................................................................................654.4. Programmation des bases de données (11) .................................................................................................................... 694.5. Champs auto-incrémentés (3) .........................................................................................................................................75

5. Utilisation des utilitaires (7) ....................................................................................................................................................76

Page 4: Faq SQL Server

SQL Server - La FAQ

- 4 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

Sommaire > Consulter les informations de schéma

Comment obtenir la liste des tables d'une base de donnée ?

Auteurs : Wolo Laurent , Fabien Celaia ,

Vous avez beaucoups de possibilités pour connaître la liste des tables d'une base de données. Nous vous recommandonsd'utiliser les vues d'informations de schéma.

SELECT table_nameFROM information_schema.tablesWHERE table_type='BASE TABLE'

Vous pouvez aussi passer par la procedure stockée sp_tables ou encore passez par les tables systèmes.

SELECT name FROM sysobjects WHERE type='U'

Comment connaître la liste des colonnes d'une table ?

Auteurs : Wolo Laurent , Fabien Celaia ,

Comme pour la liste des bases de données d'un serveur, SQL Server offre trois possibilités 1-La consultation des vuesd'informations de schema

SELECT COLUMN_NAME, ORDINAL_POSITIONFROM INFORMATION_SCHEMA.COLUMNSWHERE TABLE_NAME='MA_TABLE'

2-L'utilisation de la procédure stockée sp_columns

EXEC sp_columns 'Nom_de_table'

3-L'utilisation des tables systèmes.

SELECT c.colid, c.name Colonne, t.name Type, CAST(c.prec as varchar(10)) + CASE WHEN c.scale > 0 THEN ',' + CAST(c.scale as varchar(10) ) ELSE '' END Taille FROM syscolumns c INNER JOIN systypes t ON t.usertype=c.usertypeWHERE c.id=object_id('VotreTable')ORDER BY c.colid

4-L'utilisation de la procédure stockée sp_help

Page 5: Faq SQL Server

SQL Server - La FAQ

- 5 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

EXEC sp_help NomTable

Comment lister l'ensemble des vues d'une base de données SQL Server ?

Auteurs : Wolo Laurent ,

La liste des vues d'une base de données de SQL-Server est accessible grâce à une requêtesur les tables systèmes : sysobjects, syscomments et sysusers.

SELECT name FROM sysobjects WHERE type='V'

Mais il est recommandé d'utiliser les vues d'informations de schemas.

SELECT * FROM information_schema.views

Comment lister l'ensemble des UDF d'une base de données SQL Server ?

Auteurs : Wolo Laurent ,

La liste des fonctions définies par l'utilisateur de SQL-Server est accessiblegrâce à une requête sur les tables systèmes : sysobjects, syscomments et sysusers.

SELECT name FROM sysobjects WHERE type='FN'

Comment lister l'ensemble des procédures stockées d'une base de données SQL Server ?

Auteurs : Wolo Laurent ,

La liste des procédures stockées de SQL-Server est accessible grâce à une requêtesur les tables systèmes : sysobjects, syscomments et sysusers.

SELECT name FROM sysobjects WHERE type='P'

On peut également utiliser la méthode des vues d'informations de schema

SELECT * FROM INFORMATION_SCHEMA.ROUTINES

Page 6: Faq SQL Server

SQL Server - La FAQ

- 6 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

Ou encore, utiliser la procedure stockée : sp_stored_procedures

Comment lister l'ensemble des déclencheurs d'une base de données SQL Server ?

Auteurs : spidetra ,

La liste des triggers de SQL-Server est accessible grâce à une requête sur les tables systèmes : sysobjects, syscommentset sysusers.

SELECT o.name, o.xtype, c.text, u.name, o.crdate FROM dbo.sysobjects o INNER JOIN dbo.syscomments c ON c.id = o.id INNER JOIN dbo.sysusers u ON u.uid = c.uid WHERE xtype = 'TR'

Quelle est la requête qui permet de savoir quelles colonnes d'une table servent de clé primaire ?

Auteurs : Fabien Celaia ,

Il existe une procédure stockée pour celà :

EXEC sp_pkeys @table_name='MaTable'

Quelle commande permet d'afficher la description d'une table sous SQLServer ?

Auteurs : Wolo Laurent ,

sp_help MaTable

Ou

select column_name as champ, COALESCE(domain_name, cast(data_type as varchar(128))+ ISNULL(' ' + cast(character_maximum_length as varchar(10)) ,'')) as type_donnee, CASE UPPER(IS_NULLABLE) when 'YES' then '' when 'NO' then 'Oui' when Null then '' else IS_NULLABLE END as Obligatoire, '' as description from INFORMATION_SCHEMA.columns where table_name = 'Matable'

Page 7: Faq SQL Server

SQL Server - La FAQ

- 7 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

order by table_name, ordinal_position

Comment récupérer la valeur par défaut d'un champs d'une table ?

Auteurs : Fabien Celaia ,

select cdefaultfrom syscolumnswhere id = object_id('VotreTable')and name = 'VotreColonne'

Quel est le nombre de ligne de chacune des tables d'une base de données ?

Auteurs : Wolo Laurent ,

Select O.Name as Table_Name, I.Rows as Rows_CountFROM sysobjects O join sysindexes I ON O.id=I.idWhere O.xtype='U'

Comment connaître le nom de la base de données en cours ?

Auteurs : Wolo Laurent , Fabien Celaia ,

Pour connaître le nom de la base de donnée en cours, vous pouvez utiliser la fonction DB_NAME().

Base de donnée en cours

SELECT DB_NAME() AS BASE_DE_DONNEES_EN_COURS

Comment afficher la liste des bases de données d'un serveur ?

Auteurs : Wolo Laurent ,

Vous avez trois méthodes au choix: 1- L'utilisation des vues d'informations de schema, Exemple :

VUE D'INFORMATIONS DE SCHEMA

SELECT CATALOG_NAME FROM INFORMATION_SCHEMA.SCHEMATAGo

2-La consultation des tables systemes bien que non recommandée pour des raisons de portabilité Exemple:

TABLES SYSTEMES

USE masterGoSELECT name as BaseDedonneeDuServeurFROM sysdatabasesGo

Page 8: Faq SQL Server

SQL Server - La FAQ

- 8 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

3-L'utilisation de la procedure stockée sp_databases Exemple:

PROCEDURE STOCKEE SYSTEME

EXEC sp_databasesgo

Comment changer le type de données d'une colonne ?

Auteurs : Wolo Laurent ,

Pour changer le type de données d'une colonne, MS SQL Serveur fournit la clauseAlter ColumnExemple ferait l'affaire:

ALTER TABLE MyTable ALTER COLUMN MyColumn NVARCHAR(20) NOT NULL

Vous pouvez également proceder comme ceci:

• Demmarrer une transaction sérialisée;• Créer une nouvelle table avec le nouveau type de données telle que souhaitée;• Importer les données de l'ancienne table vers la nouvelle;• Supprimer l'ancienne table;• Renommer la nouvelle table avec l'ancien nom;•

Exemple :

--Supposons que nous ayant une table T_Person dont la definition est :CREATE TABLE Tmp_T_PERSONNE(PER_ID int NOT NULL,PER_NOM varchar(50) NOT NULL,PER_PRENOM varchar(50) NULL,PER_NE_LE smalldatetime NOT NULL,) ON [PRIMARY]GO--Et que nous voulons changer le type Per_Nom du type varchar(50) au type varchar(100)--Nous aurons :BEGIN TRANSACTIONSET TRANSACTION ISOLATION LEVEL SERIALIZABLE--Créer une table temporaire ayant même structure que la premièreCREATE TABLE Tmp_T_PERSONNE(PER_ID int NOT NULL,PER_NOM varchar(100) NOT NULL,PER_PRENOM varchar(50) NULL,PER_NE_LE smalldatetime NOT NULL,) ON [PRIMARY]GO-- Peupler la tableIF EXISTS(SELECT * FROM T_PERSONNE) EXEC('INSERT INTO Tmp_T_PERSONNE (PER_ID,PER_NOM, PER_PRENOM, PER_NE_LE, PAY_ID, PER_NE_A)SELECT PER_ID, PER_NOM, PER_PRENOM, PER_NE_LE FROM T_PERSONNE TABLOCKX')GO--Supprimer la tableDROP TABLE dbo.T_PERSONNE

Page 9: Faq SQL Server

SQL Server - La FAQ

- 9 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

GO--Renommer la nouvelle table avec l'ancien nomEXECUTE sp_rename N'Tmp_T_PERSONNE', N'T_PERSONNE', 'OBJECT'GOCOMMIT

Comment renommer une base de données ?

Auteurs : Wolo Laurent ,

Pour renommer une base de données, MS SQL Server fournit la procedure stockée sp_renamedbExemple :

EXEC sp_renamedb('MyOldDB','MyNiewDB')

Vous pouvez également créer une nouvelle base de données, importez les donnéespar DTS de l'ancienne base de données vers la nouvelle, puis supprimer l'ancienne base de données.

Comment renommer une table ou un autre object de base de données ?

Auteurs : Wolo Laurent ,

Pour renommer un object d'une base de données, l'on peut passer par la procedure stockée sp_rename.Voici ce que l'aide en ligne de MS SQL Serveur 2000 apporte a ce sujet:

sp_rename [ @objname = ] 'object_name' , [ @newname = ] 'new_name' [ , [ @objtype = ] 'object_type' ]

ou object_name désigne le nom de l'object à renommer,new_name la nouvelle désignation de l'object etet object_type l'une des valeurs du tableau ci-dessous.

Valeur DescriptionCOLUMN Une colonne qui doit être renommée..BASE DE DONNEES Base de données définie par l'utilisateur. Cette option est

nécessaire pour renommer une base de données.INDEX Un index défini par l'utilisateur.OBJECT Élément d'un type repris dans sysobjects. Par exemple,

OBJECT peut être utilisé pour renommer les objets dontles contraintes (CHECK, FOREIGN KEY, PRIMARY/UNIQUE KEY), des tables utilisateur, des affichages, desprocédures stockées, des déclencheurs et des règles.

USERDATATYPE Type de données défini par l'utilisateur ajouté enexécutant sp_addtype.

Exemple : A1-Renommer une table Dans cet exemple la table customers est renommée custs.

EXEC sp_rename 'customers', 'custs'

Page 10: Faq SQL Server

SQL Server - La FAQ

- 10 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

A2-Renommer une colonne Dans cet exemple la colonne contact title de la table customers est renommé title.

EXEC sp_rename 'customers.[contact title]', 'title', 'COLUMN'

Comment visualiser le code T-SQL d'une procédure stocké ?

Auteurs : Fabien Celaia , Morsi ,

Pour se faire plaisir

select text from dbo.syscomments, dbo.sysobjectswhere syscomments.id = sysobjects.idAnd sysobjects.xtype = 'P'AND sysobjects.name='MaProcédure'

mais bien plus simplement, et avec les bons retour-chariots

sp_helptext 'MaProcédure'

Comment récuperer un schéma de base de données sur un serveurSQL2005 depuis une restauration d'une base de données en version 2000 ?

Auteurs : Wolo Laurent ,

Après restauration d'une sauvegarde d'une base de données SQL Serveur 2000 sur un serveur de base de données SQLServeur 2005, vous ne pouvez pas acceder au schema de cette base de données.

SQL Serveur 2005 vous renvoie le message :

Database diagram support objects cannot be installed because this database does not have a valid owner. To continue, first use the Files page of the Database Properties dialog box or the ALTER AUTHORIZATION statement to set the database owner to a valid login, then add the database diagram support objects.

Pour résoudre ce problème, il faut

• Changer le niveau de compatibilité EXEC sp_dbcmptlevel 'database_name', '90';• Changer le propriétaire de la base de données sur le nouveau serveur

ALTER AUTHORIZATION ON DATABASE::database_name TO valid_login

Comment lister les contraintes de clés primaires et étrangères des tables d'une base de données ?

Auteurs : Rudi Bruchez ,

SELECT *

Page 11: Faq SQL Server

SQL Server - La FAQ

- 11 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = 'matable'

Comment trouver la liste des tables dont dépend la vue ?

Auteurs : Maitrebn ,

SELECT DISTINCT NECESSAIRE.NAMEFROM SYSOBJECTS AS NECESSAIREINNER JOIN SYSDEPENDS AS DEPENDENCESON NECESSAIRE.ID = DEPENDENCES.depidINNER JOIN SYSOBJECTS AS DEPENDANTEON DEPENDENCES.id = DEPENDANTE.idWHERE DEPENDANTE.name='NOMDELAVUE'

Comment comparer 2 tables ?

Auteurs : Frédéric Brouard , Fabien Celaia ,

Soit via requêtage peu aisé dans syscolumns (exemple pour rechercher des différences de type, il faudra complexifieravec outer jin et consors pour rechercher les colonnes manquantes, de trop...)

select s1.name, s1.type, s2.name, s2.type from syscolumns s1, syscolumns s2where s1.id = object_id('MaTable1')and s2.id = object_id('MaTable2')and s1.name=s2.nameand s1.type<>s2.type

Soit via l'utilitaire tablediff.exe installé par défaut avec SQL Serrver 2005 dans le répertoire COM.

Comment comparer 2 bases de données ?

Auteurs : Ylarvor ,

Automatique• SQL Compare• SQL Delta• SQL Examiner• Visual Studio for DB professional• Apex SQLDiff• EMS DB Comparer for SQL Server• Quest

Visuel• Sybase PowerAMC

Gratuit• Simple Tools for MS SQL Server

Page 12: Faq SQL Server

SQL Server - La FAQ

- 12 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

Manuel• Script en Python ou Ruby pour générer les scripts des objets, et comparaison les deux répertoires avec

un outil comme winmerge

manuel :

Script en Python ou Ruby : http://www.babaluga.com/doku.php/pro...on_python-ruby pour générer les scripts desobjets, et tu compares les deux répertoires avec un outil comme winmerge"

Comment trouver une table à travers toutes les bases ?

Auteurs : Frédéric Brouard ,

Voici une procédure permettant de rechercher toutes les bases contenant une table de nom @SCH.@TAB :

DECLARE @SCH NVARCHAR(128), @TAB NVARCHAR(128); SELECT @SCH = '???' , @TAB = '???'; DECLARE @SQL NVARCHAR(max) SET @SQL = ''; SELECT @SQL = @SQL + 'SELECT * FROM ' + name + '.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ''' + COALESCE(@SCH, 'dbo') + ''' AND TABLE_NAME = ''' + @TAB +''';' FROM sys.databases; EXEC (@SQL);

Auditer le taux d'occupation de vos disques de manière automatique

Auteurs : Frédéric Brouard ,

Voici un ensemble de codes SQL utilisant des procédures systèmes et l'agent SQL pour scruter le taux d'occupation desdisques et remonter une alerte en cas de dépassement.

Création des objets dans la basez de données MSDB

Création des tables de suivi de l'évolution de l'espace disque et de leur taux d'occupation. Notez l'utilisation du schémaS_SYS dans msdb :

USE msdb; GO CREATE SCHEMA S_SYS CREATE TABLE T_A_DISK_DSK ( DSK_ID INT NOT NULL PRIMARY KEY, DSK_UNIT CHAR(1) NOT NULL UNIQUE CHECK (DSK_UNIT COLLATE French_CI_AS BETWEEN 'C' AND 'Z'), DSK_ALERT_PC FLOAT NOT NULL DEFAULT 30.0 CHECK (DSK_ALERT_PC BETWEEN 0.0 AND 100.0)) CREATE TABLE T_A_TRACE_SPACE_DISK_TSP ( TSP_ID INT NOT NULL PRIMARY KEY, DSK_UNIT CHAR(1) NOT NULL FOREIGN KEY REFERENCES T_A_DISK_DSK (DSK_UNIT), TSP_DATETIME DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, TSP_SIZE_MO INT NOT NULL, TSP_USED_MO INT NOT NULL);

Page 13: Faq SQL Server

SQL Server - La FAQ

- 13 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

GO CREATE INDEX X_TSP_DTM ON S_SYS.T_A_TRACE_SPACE_DISK_TSP (TSP_DATETIME, DSK_UNIT); GO

Création de la procédure de capture des données d'espace disque

CREATE PROCEDURE S_SYS.P_AUDIT_SPACE_DISK AS SET NOCOUNT ON; DECLARE @HDL int, @FSO int, @HD char(1), @DRV int, @SZ varchar(20), @MB bigint ; SET @MB = 1048576; CREATE TABLE #HD (HD_UNIT char(1) PRIMARY KEY, HD_FREESPACE int NULL, HD_SIZE int NULL); INSERT INTO #HD (HD_UNIT, HD_FREESPACE) EXEC master.dbo.xp_fixeddrives; DELETE FROM #HD WHERE HD_UNIT NOT IN (SELECT DSK_UNIT FROM S_SYS.T_A_DISK_DSK); EXEC @HDL = sp_OACreate 'Scripting.FileSystemObject',@FSO OUT; IF @HDL <> 0 EXEC sp_OAGetErrorInfo @FSO; DECLARE C CURSOR LOCAL FAST_FORWARD FOR SELECT HD_UNIT FROM #HD; OPEN C; FETCH NEXT FROM C INTO @HD; WHILE @@FETCH_STATUS=0 BEGIN EXEC @HDL = sp_OAMethod @FSO, 'GetDrive', @DRV OUT, @HD IF @HDL <> 0 EXEC sp_OAGetErrorInfo @FSO; EXEC @HDL = sp_OAGetProperty @DRV, 'TotalSize', @SZ OUT IF @HDL <> 0 EXEC sp_OAGetErrorInfo @DRV; UPDATE #HD SET HD_SIZE = CAST(@SZ AS FLOAT) / @MB WHERE HD_UNIT = @HD; FETCH NEXT FROM C INTO @HD; END CLOSE C; DEALLOCATE C; EXEC @HDL=sp_OADestroy @FSO; IF @HDL <> 0 EXEC sp_OAGetErrorInfo @FSO;

Page 14: Faq SQL Server

SQL Server - La FAQ

- 14 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

INSERT INTO S_SYS.T_A_TRACE_SPACE_DISK_TSP (TSP_UNIT, TSP_SIZE_MO, TSP_USED_MO) SELECT HD_UNIT, HD_SIZE, HD_SIZE - HD_FREESPACE FROM #HD DROP TABLE #HD; RETURN; GO

Mise en place dans l'agent SQL Server serveur d'une routine journalière de scrutation à 5h du matin

USE [msdb] GO EXEC msdb.dbo.sp_add_job @job_name=N'Scrutation espace disque', @enabled=1, @notify_level_eventlog=0, @notify_level_email=2, @notify_level_netsend=2, @notify_level_page=2, @delete_level=0, @category_name=N'Data Collector', @owner_login_name=N'SA'; EXEC msdb.dbo.sp_add_jobserver @job_name=N'Scrutation espace disque', @server_name = N'ServerSQL[\instance]'; EXEC msdb.dbo.sp_add_jobstep @job_name=N'Scrutation espace disque', @step_name=N'Rapporte l''état du volume du disque', @step_id=1, @cmdexec_success_code=0, @on_success_action=1, @on_fail_action=2, @retry_attempts=0, @retry_interval=0, @os_run_priority=0, @subsystem=N'TSQL', @command=N'EXEC S_SYS.P_AUDIT_SPACE_DISK;', @database_name=N'msdb', @flags=0; EXEC msdb.dbo.sp_update_job @job_name=N'Scrutation espace disque', @enabled=1, @start_step_id=1, @notify_level_eventlog=0, @notify_level_email=2, @notify_level_netsend=2, @notify_level_page=2, @delete_level=0, @description=N'', @category_name=N'Data Collector', @owner_login_name=N'ServerSQL[\instance]', @notify_email_operator_name=N'', @notify_netsend_operator_name=N'', @notify_page_operator_name=N''; EXEC msdb.dbo.sp_add_jobschedule @job_name=N'Scrutation espace disque', @name=N'Planification espace disque', @enabled=1,

Page 15: Faq SQL Server

SQL Server - La FAQ

- 15 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

@freq_type=4, @freq_interval=1, @freq_subday_type=1, @freq_subday_interval=0, @freq_relative_interval=0, @freq_recurrence_factor=1, @active_start_date=20090312, @active_end_date=99991231, @active_start_time=50000, @active_end_time=235959; GO

Vous devez remplacer "ServerSQL[\instance]" par le nom de votre serveur et SA par le compte de connexion souslequel cette routine doit tourner.

Création d'un déclencheur pour envoi par mail d'une alerte immédiate

-- trigger pour envoi d'un mail CREATE TRIGGER E_I_TSP ON S_SYS.T_A_TRACE_SPACE_DISK_TSP FOR INSERT AS BEGIN IF EXISTS(SELECT * FROM inserted AS i INNER JOIN S_SYS.T_A_DISK_DSK AS D ON i.DSK_UNIT = D.DSK_UNIT WHERE (CAST(TSP_USED_MO AS FLOAT) / CAST(TSP_SIZE_MO AS FLOAT) ) * 100 > DSK_ALERT_PC master..sp_send_dbmail @profile_name = 'profile_name', @recipients = 'mail_destinataire1;mail_destinataire2;mail_destinataire3;...', @subject = 'Alerte automatique : quota d''espace libre de disque en dessous de la valeur fixée', @body = 'Au moins un des disques que vous suivez via la procédure cyclique S_SYS.P_AUDIT_SPACE_DISK a atteint un quota d''espace disque inférieur au seuil d''alerte fixé.', @body_format = 'TEXT', @importance = 'High', @query = 'SELECT D.DSK_UNIT AS UNITE, TSP_SIZE_MO AS TAILLE_MO, TSP_USED_MO AS ESPACE_UTILISE_MO, (CAST(TSP_USED_MO AS FLOAT) / CAST(TSP_SIZE_MO AS FLOAT) ) * 100 AS OCCUPATION_POURCENT, DSK_ALERT_PC AS TAUX_ALERTE_POURCENT, CASE WHEN (CAST(TSP_USED_MO AS FLOAT) / CAST(TSP_SIZE_MO AS FLOAT) ) * 100 > DSK_ALERT_PC THEN ''CRITIQUE !'' ELSE ''normal'' END AS ETAT FROM S_SYS.T_A_TRACE_SPACE_DISK_TSP AS T INNER JOIN S_SYS.T_A_DISK_DSK AS D ON T.DSK_UNIT = D.DSK_UNIT WHERE TSP_DATETIME = (SELECT MAX(TSP_DATETIME) FROM S_SYS.T_A_TRACE_SPACE_DISK_TSP) ORDER BY 1 ', @execute_query_database = 'msdb', @attach_query_result_as_file = 0, @query_result_header = 1; END GO

Page 16: Faq SQL Server

SQL Server - La FAQ

- 16 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

Dans ce code, vous devez spécifier l'un des profil mail que vous avez mis en place lors de l'activation dedb_mail à la place de "profile_name" de même vous devez spécifier les emails des destinataires à la place de"mail_destinataire1;mail_destinataire2;mail_destinataire3;..."

Exemple

Alimentons la table des disques avec nos disques :

INSERT INTO S_SYS.T_A_DISK_DSK VALUES ('C', 70); INSERT INTO S_SYS.T_A_DISK_DSK VALUES ('D', 50);

Nous surveillons deux disques C et D et voulons êtres alertés lorsque C dépasse un taux d'occupation de 70% et lorsqueD dépasse un taux d'occupation de 50%.

Page 17: Faq SQL Server

SQL Server - La FAQ

- 17 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

Sommaire > Consulter la taille des objects de la base de données

Comment connaître la taille occupée par une base de données ?

Auteurs : Wolo Laurent ,

Pour connaîttre la taille des objects d'une base de données,Ms SQL Server metà votre disposition une procedure stockée:

sp_spaceused [[@objname =] 'objname'] <br/>[,[@updateusage =] 'updateusage']<br/>

Où objname est le nom de la table dont on veut calculer lataille et updateusage un varchar(5) qui peut prendre 2 valeurs (false,true).updateusage, fixé à true permet à MS SQL Serveur de recalculer la taille despages de données.Ainsi, pour connaîttre la taille d'une base de données, on utilise la proceduresans indiquer le nom de l'object.Exemple :Pour connaîttre la taille de la base de donnée DB_ESSAI, on :

USE DB_ESSAIGOEXEC sp_spaceused GO

Comment connaître la taille occupée par une table d'une base de données.

Auteurs : Wolo Laurent ,

Microsoft SQL server met à votre disposition une procédure stockée sp_spaceusedpour déterminer la taille d'une base de données et des tables de la base de données.Exemple:A. Informations sur l'espace occupé par une tableCet exemple présente la quantité d'espace alloué (réservé) à la table titles, l'espace utilisé par les données, l'espace utilisépar le ou les index et l'espace inutilisé réservé par les objets de base de données.

USE pubsEXEC sp_spaceused 'titles'

B. Informations sur l'espace mis à jour occupé par toute une base de donnéesCet exemple récapitule l'espace utilisé dans la base de données courante et utilise le paramètre facultatif @updateusage.

USE pubs

Page 18: Faq SQL Server

SQL Server - La FAQ

- 18 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

sp_spaceused @updateusage = 'TRUE'

Comment connaître l'espace occupé par les index d'une base de données ou d'une table ?

Auteurs : Wolo Laurent ,

USE db_essaiEXEC sp_spaceused 'mon_objet'

Comment connaître la taille des fichiers mdf et ldf d'une base de données ?

Auteurs : Wolo Laurent , Fabien Celaia ,

use myDBGOSELECT 8 * SUM(CONVERT(DEC(15),SIZE)) as Taillemdf FROM dbo.sysfilesWHERE (status64 = 0)GO

use myDBGOSELECT 8 * SUM(CONVERT(DEC(15),SIZE)) as Tailleldf FROM dbo.sysfilesWHERE (status64 != 0)GO

Le résultat est donné en Ko. En fait, vous avez le résultat en nombre de page de données de 8Ko.

Page 19: Faq SQL Server

SQL Server - La FAQ

- 19 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

Sommaire > Administration de la base de données

Page 20: Faq SQL Server

SQL Server - La FAQ

- 20 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

Sommaire > Administration de la base de données > Editions de SQL Serveur

Combien d'éditions existe-t-il pour MS SQL Server 2000 ?

Auteurs : Wolo Laurent ,

Editions Systèmes d'exploitations compatiblesEdition Professionnelle et Edition standard Windows 2003 Server

Windows 2000 ServerWindows 2000 DataCenterWindows 2000 Avanced ServerWindows NT 4.0 Server Professional EditionWindows NT 4.0 Server

Edition Personnelle Windows XP ProfessionelleWindows 2003 ServerWindows 2000 ServerWindows 2000 DataCenterWindows 2000 Avanced ServerWindows 2000 ProfessionelleWindows NT 4.0 Server Professional EditionWindows NT 4.0 ServerWindows NT 4.0 Server WorkStationWindows 98

Edition Dévéloppeur Windows XP ProfessionelleWindows 2003 ServerWindows 2000 ServerWindows 2000 DataCenterWindows 2000 Avanced ServerWindows 2000 ProfessionelleWindows NT 4.0 Server Professional EditionWindows NT 4.0 ServerWindows NT 4.0 Server WorkStation

Edition Windows CE Windows CE

Combien d'éditions existe-t-il pour MS SQL Server 2005 ?

Auteurs : Fabien Celaia ,

• Express• Workgroup• Standard• Enterprise

Pour les détails :

Comparaison des fonctionnalités dans SQL Server 2005

Combien d'éditions existe-t-il pour MS SQL Server 2008 ?

Auteurs : Fabien Celaia ,

• SQL Server 2008 Entreprise

Page 21: Faq SQL Server

SQL Server - La FAQ

- 21 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

• SQL Server 2008 Standard• SQL Server 2008 Workgroup• SQL Server 2008 Web• SQL Server 2008 Developer• SQL Server 2008 Express (gratuite)• SQL Server 2008 Compact 3.5 (gratuite)

Notes de l'éditeur quant aux fonctionalités liées aux éditions

Comment déterminer la version de SQL Server installé ?

Auteurs : Morsi ,

SELECT SERVERPROPERTY('ProductLevel')

SELECT @@VERSION

SELECT SERVERPROPERTY('ProductVersion')

Comment connaître le nom de l'instance de SQL Server installée ?

Auteurs : Wolo Laurent , Fabien Celaia ,

select case WHEN convert(sysname, serverproperty('InstanceName')) IS NULL THEN 'INSTANCE PAR DEFAUT'ELSEconvert(sysname, serverproperty('InstanceName'))END AS INSTANCE_NAME

Page 22: Faq SQL Server

SQL Server - La FAQ

- 22 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

Sommaire > Administration de la base de données > Utilisateurs et connexions

Comment connaître le nom de l'utilisateur connecté au serveur?

Auteurs : Wolo Laurent ,

SQL Serveur fournit quatre fonctions permettants de connaître l'utilisateur connecté au serveur pour la session encours. Exemple:

DECLARE @usr char(30)SET @usr = userSELECT 'L''utilisateur courant est : ' + @usrGO--Ou SELECT 'L''utilisateur courant est : ' + SUSER_NAME()GO--Ou encore SELECT 'L''utilisateur courant est : ' + SESSION_USERGO--Nous n'allons pas oublier la fonction Current_userSELECT 'L''utilisateur courant est : ' + CURRENT_USER

Comment obtenir le nombre d'utilisateurs connectés à une base de données ?

Auteurs : Wolo Laurent ,

USE MaBaseGOSELECT COUNT(*) FROM master..sysprocessesWHERE dbid=db_id()GO

ou

SELECT COUNT(*) FROM master..sysprocessesWHERE dbid=db_id('MabaseDeDonnée')

Pour la base courante ce sera alors :

SELECT COUNT(*) FROM master..sysprocessesWHERE dbid=db_id()

Je n'arrive pas à créer un utilisateur, le système me dit : user already exist ?

Auteurs : Wolo Laurent ,

Il faut supprimer l'utilisateur et le recréer:

exec sp_dropuser 'utilisateur' -- drop le user

Page 23: Faq SQL Server

SQL Server - La FAQ

- 23 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

exec sp_adduser 'utilateur','login' -- recrée utilisateur et l'associe à login

Quelle requête retourne les processus en train de consommer ?

Auteurs : Fabien Celaia ,

create proc sp__cpu as /* * Auteur : Fabien Celaia * Date : 11/01/2002 * Desc : Affiche les processus utilisateurs en cours de traitement * Parm : - */ SELECT convert(char(4), spid) Spid, convert(char(4), blocked) Blk, convert(char(4), cpu) CPU, left(loginame,15) 'Users', left(hostname, 15) 'Host', left(db_name(dbid),15) DB, convert(char(20), cmd) Command, convert(char(12), program_name) Program , convert(char(10), status) Status FROM master..sysprocesses WHERE spid <> @@spid AND status not in ( 'BACKGROUND', 'sleeping') ORDER BY cpu DESC GO GRANT execute on sp__cpu to public GO

Afficher la liste des utilisateurs d'une base spécifique ou de la base courante

Auteurs : Fabien Celaia ,

CREATE PROC sp__dbuser (@db varchar(30)=NULL) AS BEGIN /* * Auteur : Fabien Celaia * Date : 3.3.2002 * Desc : Affiche la lsite des utilisateurs de la base courante ou de la base passée en paramètre * Parm : @db = nom de la base (optionel) * Return : Nombre d'utilisateurs * -1 si la base n'existe pas */ set nocount on

declare @i int if @db is null select @db=db_name() else if not exists(select name from master..sysdatabases where name = @db) begin Print 'La base '+@db+' n''existe pas dans le serveur '+ @@servername return -1 end

select @db 'Base' print ''

Page 24: Faq SQL Server

SQL Server - La FAQ

- 24 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

/* Nombre d'utilisateurs */ select @i=count(spid) from master..sysprocesses where dbid = db_id(@db) and status <> 'BACKGROUND'

if @i = 0 begin print '' print 'Cette base est inutilisée' print '' end else begin /* Liste des utilisateurs */ declare @snum varchar(4) select @snum = convert(varchar(4), @i) print '' print @snum+' utilisateur(s) trouvés dans la base '+@db+', serveur '+ @@servername print '' select spid, loginame Utilisateur , cmd, program_name from master..sysprocesses where dbid = db_id(@db) and status <> 'BACKGROUND'

/* Message informationel pour l'utilisateur courant */ if exists (select * from master..sysprocesses where spid=@@spid and dbid=db_id(@db)) begin print '' print 'FYI : VOUS êtes actuellement connectés à la base '+@db+', serveur '+@@servername print '' end end return @i end go GRANT execute on sp__dbuser to public go

Comment extirper un DDL complet pour un utilisateur donné ?

Auteurs : Fabien Celaia ,

Create PROC sp_ddluser (@login varchar(30)) as BEGIN /* Auteur : Fabien Celaia * Date : 6.6.05 * Desc : Extraction du DDL d'un utilisateur spécifique permettant sa recréation multi-serveurs * IParm : @login (obligatoire) : l'utilisateur à extraire * OParm : 0 = succès * -1 = l'utilisateur n'existe pas */

if not exists (select * from sysusers where name = @login) begin PRINT 'L''utilisateur '+@login+'n''existe pas dans la base '+db_name()+' du serveur '+@@servername return -1 end

if not exists (select * from master..syslogins where name = @login) begin /* Login inexistant => création */ select 'exec sp_addlogin '+ @login+ ', MotDePasse' end

SELECT 'EXEC SP_DROPUSER '+@login

Page 25: Faq SQL Server

SQL Server - La FAQ

- 25 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

SELECT 'EXEC SP_ADDUSER '+@login+', '+ @login

/* membres de groupes */ select 'GRANT ROLE '+ g.name +' TO '''+u.name+'''' from sysmembers m inner join sysusers u on m.memberuid = u.uid inner join sysusers g on m.groupuid=g.uid where u.uid > 2 and u.name = @login

/*Droits*/ select case p.protecttype when 206 then 'REVOKE' else 'GRANT ' end +

case p.action when 26 then 'REFERENCES' when 178 then 'CREATE FUNCTION' when 193 then 'SELECT' when 195 then 'INSERT' when 196 then 'DELETE' when 197 then 'UPDATE' when 198 then 'CREATE TABLE' when 203 then 'CREATE DATABASE' when 207 then 'CREATE VIEW' when 222 then 'CREATE PROCEDURE' when 224 then 'EXECUTE' when 228 then 'BACKUP DATABASE' when 233 then 'CREATE DEFAULT' when 235 then 'BACKUP LOG' when 236 then 'CREATE RULE' end + ' ON ' + o.name + case when p.action < 200 then case when p.protecttype = 206 then ' FROM ' else ' TO ' END +u.name else '' end +

case when p.protecttype = 204 then ' WITH GRANT OPTION' else '' end

from sysprotects p inner join sysusers u on u.uid=p.uid inner join sysobjects o on o.id=p.id where p.columns = 0x01 OR p.columns is null and u.name = @login order by o.name

end

Comment afficher les utilisateurs actifs d'une base particulière ?

Auteurs : Fabien Celaia ,

create proc sp__dbuser (@db varchar(30)=NULL) as begin /* * Auteur : Fabien Celaia * Date : 10.8.2005 * Desc : Liste les utilisateurs actifs dans la base de données courante OU la base passée en paramètre * IParm : @db = Nom de la base (optionnel) * Retour : Nombre d'utilisateurs connectés à la base * -1 si la base passée en paramètre n'existe pas

Page 26: Faq SQL Server

SQL Server - La FAQ

- 26 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

*/ set nocount on

declare @i int if @db is null select @db=db_name() else if not exists(select name from master..sysdatabases where name = @db) begin Print 'La base '+@db+' n''existe pas sur le serveur SQL '+@@servername return -1 end

select @db 'Base de données' print ''

/* Number of users */ select @i=count(spid) from master..sysprocesses where dbid = db_id(@db) and status <> 'background'

if @i = 0 begin print '' print 'Cette base est actuellement inutilisée' print '' end else begin /* List of the users */ declare @snum varchar(4) select @snum = convert(varchar(4), @i) print '' print @snum+' utilisateurs(s) actifs dans la base '+@db+' du serveur '+ @@servername print '' select spid, nt_username Utilisateur , cmd, program_name Programme from master..sysprocesses where dbid = db_id(@db) and status <> 'background'

/* Informational warning if the current user is in the database */ if exists (select * from master..sysprocesses where spid=@@spid and dbid=db_id(@db)) begin print '' print 'FYI: VOUS êtes actuellement connectés sur la base '+@db+' du serveur '+ @@servername print '' end end return @i end

Comment changer temporairement un mot de passe que l'on ne connaît pas ?

Auteurs : Fabien Celaia ,

1) Changer de mot de passe après l'avoir sauvé

select password, name into old_login from master..sysxlogins exec sp_password NULL, NouveauMotDePasse, MonLogin

2) Revenir à l'ancien

exec sp_configure updates,1 reconfigure with override

Page 27: Faq SQL Server

SQL Server - La FAQ

- 27 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

update master..sysxlogins set password=O.password from old_login O, sysxlogins L where L.name=O.name and O.name='MonUtilisateur'

drop table old_login

exec sp_configure updates,0

lien : Modifier temporairement un mot de passe inconnu

Comment connaître la dernière date de modification du mot de passe des logins ?

Auteurs : Fabien Celaia ,

select name loginname, updatedate from master..syslogins where loginname is not null

Comment configurer une base de données en mode utilisateur unique ?

Auteurs : Frédéric Brouard ,

ALTER DATABASE MABASESET SINGLE USER WITH ROLLBACK IMMEDIATE

Quel est le type de connexion le plus sûr ?

Auteurs : Fabien Celaia ,

Il y a deux types de connexion avec Micrososft SQL Server.

• le mode authentification Windows : il permet de laisser au système la tâche d'authentifier le client. Avantage : lemot de passe ne passe pas au travers des paquets TDS et ne peut donc être "sniffé".

• le mode authentification SQL avec un mot de passe et un login propre au SQL server, sans lien avec le systèmed'exploitation. Avantage : une distiction claire et nette entre les droits sur la base et ceux sur le systèmed'exploitation.

En terme de choix, on ne peut spécifier que l'authentification Windows (1) ou l'authentification mixte (1 + 2).

Page 28: Faq SQL Server

SQL Server - La FAQ

- 28 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

Sommaire > Administration de la base de données > Connexions au serveur

Comment fixer la durée d'attente de libération d'un verrou sur un object de la base de données ?

Auteurs : Wolo Laurent ,

SET LOCK_TIMEOUT permet à une application de définir le délai maximal pendant lequelune instruction doit attendre en cas de ressource bloquée. Si l'attente d'une instructiondépasse la valeur du paramètre LOCK_TIMEOUT, l'instruction bloquée est automatiquementannulée, et un message d'erreur renvoyé à l'application.Cette valeur est fixée à -1 au début d'une connexion.

--Fixe la valeur du lock_timeout à 1,8 secondeSET LOCK_TIMEOUT 1800

Pour connaître la valeur courante, on utilise la variable @@LOCK_TIMEOUT

--Consulter la valeur du lock timeoutSELECT @@LOCK_TIMEOUT AS LOCK_TIMEOUT

Je n'arrive pas à me connecter à une base de données de mon serveur depuis un programme client

Auteurs : Wolo Laurent ,

Si vous n'arrivez pas à vous connecter à une base de données de votre serveur, procedez comme ci-dessous.

• Si vous utilisez le nom de la machine comme source de données, vérifiez que votre réseaupossède un serveur de nom de domaine.Dans le cas contraire, utilisez l'adresse IP publique de votre serveur de base de données.

• Attention, il arrive que vous vous connectez sous windows avec un utilisateur qu possède moins de droitspour modifier les données de la base de données de ce serveur.

• Vérifiez que vous utilisez le bon type d'autentification SQL Serveur pour votre chaîne de connexion• Vérifiez que votre serveur ne se trouve pas derrière un serveur proxy.• Vérifier que votre serveur ne se trouve pas derrière un Firewall.

Comment se connecter à un serveur SQL qui se trouve derrière un proxy ?

Auteurs : Wolo Laurent ,

Pour se connecter à un serveur SQL Serveur qui tourne derrière un serveur proxy,Ouvrez l'utilitaire Server Network UtilityDans l'onglet général, cochez la case enable Winsock proxypuis saisissez l'adresse du serveur proxy et son port d'écoute.

Comment se connecter à un serveur se trouvant derrière un pare-feu ?

Auteurs : Wolo Laurent ,

Pour se connecter à un serveur dans ces conditions, Configurez un numero de port (1433) par défaut puis demandez àvotre administrateur réseau de libérer le trafique de ce port sur son firewall

Page 29: Faq SQL Server

SQL Server - La FAQ

- 29 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

il est déconseillé d'ouvrir une brèche dans le firewall si MS-SQL utilise le port par défaut.reconfigurer le port avant tout.

Quelle procédure stockée permet de limiter le nombre de connexions simultanées ?

Auteurs : drahu , Fabien Celaia ,

sp_configure connections, nRECONFIGURE WITH OVERRIDE--n est le nombre de connexions souhaitées.

Mon serveur ne démarre pas à cause du méssage : Echecd'ouverture d'une session a empêché le démarrage d'un service.

Auteurs : Wolo Laurent ,

Ce méssage intervient lorsque le compte configuré pour démarrer le service MSSQLSERVER échoue dans le démarraged'une session Windows. Allez-y dans le Gestionnaire des Services, Cliquez sur le service MSSQLSERVER, puis changerle compte de démarrage du service. NB: Il est plus simple d'utiliser le compte LocalSystem.

Comment connaître le type d'authentification installée sur le serveur ?

Auteurs : Wolo Laurent ,

select CASEWHEN convert(sysname, serverproperty('Edition')) IS NULL THEN 'ERREUR'WHEN convert(sysname, serverproperty('Edition'))=0 THEN 'SECURITE INTEGREE'WHEN convert(sysname, serverproperty('Edition'))=1 THEN 'SECURITE NON INTEGREE'END AS AUTHENTIFICATION

Comment resoudre le problème "Délai d'attente expiré" lorsqu'on tente de se connecter au serveur ?

Auteurs : Wolo Laurent ,

Il s'agit d'un problème lié au DNS

• Utiliser l'adresse IP\Instance du serveur à la place de NomServeur\Instance• Dans la fenêtre de configuration IP du protocole TCP/IP de votre carte réseau, ajouter l'adresse du DNS

primaire, en utilisant celui de votre contôleur de domaine.

Déconnectez les utilisateurs d'une base de données

Auteurs : Frédéric Brouard , Fabien Celaia ,

Cette commande, possible depuis MS-SQL2005, tue les connexions en cours (y.c. rollback) et garde l'unique connexionen cours sur la base.

ALTER DATABASE 'MaBase' SET SINGLE_USER WITH ROLLBACK IMMEDIATE

Page 30: Faq SQL Server

SQL Server - La FAQ

- 30 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

Pour le retour à un accès normal :

ALTER DATABASE 'MaBase' SET MULTI_USER

Autrement, il reste toujours la possibilité du kill via curseur

CREATE PROC sp_killuser (@MaBase varchar(30)=NULL)AS BEGINDeclare @SQL_Text nvarchar(20)

declare Process_cur CURSOR FOR select convert(varchar(5), spid) from master..sysprocesses where dbid = db_id(coalesce(@MaBase,db_name()) and spid <> @@spid

Declare @spid as varchar(4)

OPEN Process_cur

FETCH NEXT FROM Process_cur INTO @spid

WHILE (@@FETCH_STATUS = 0) begin set @SQL_Text = 'KILL '+ @spid exec sp_executesql @T FETCH NEXT FROM Process_cur into @spid; end

CLOSE Process_curDEALLOCATE Process_cur END GO

Comment démarrer un serveur si la base tempdb est corrompue

Auteurs : Fabien Celaia ,

Démarrez le serveur avec l'option -T3608.

Ce traceflag permet de ne démarrer le serveur qu'avec la base master. Notez cependant que sans la base tempdb,quasiment aucune procédure stockée n'est utilisable.

Page 31: Faq SQL Server

SQL Server - La FAQ

- 31 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

Sommaire > Administration de la base de données > Performances

Comment réindexer une base ?

Auteurs : HULK ,

La gestion des index par SQL Server peut entraîner la fragmentation de ceux-ci et une dégradation des performances.Si le volume d'informations de votre base évolue beaucoup, il est nécessaire de réindexer votre base. Plus votre basechange, plus les index perdent en efficacité, il faut donc les recréer. On peut reconstruire les index avec la commandeDBCC REINDEX.

CREATE PROCEDURE REINDEXATION ASDECLARE @table_name sysnameDECLARE @TSQL nvarchar(4000)DECLARE @Err intDECLARE @Mess varchar(400)SET @Mess = 'Début réindexation'RAISERROR(@Mess, 10, 1) WITH LOGDECLARE table_list CURSOR FAST_FORWARD FOR SELECT name FROM sysobjects WHERE type = 'u'OPEN table_listFETCH NEXT FROM table_list INTO @table_nameWHILE @@fetch_status = 0 BEGIN SET @TSQL = N'DBCC DBREINDEX(' + @table_name + N')' EXECUTE sp_executesql @TSQL SET @Err = @@error IF (@Err != 0) BEGIN SET @Mess = 'Echec réindexation table ' + @table_name + ' suite erreur ' + CONVERT(varchar, @Err) RAISERROR(@Mess, 16, 1) WITH LOG END FETCH NEXT FROM table_list INTO @table_name ENDCLOSE table_listDEALLOCATE table_listSET @Mess = 'Fin réindexation'RAISERROR(@Mess, 10, 1) WITH LOGGO

Extensions uniformes ou extensions mixtes ?

Auteurs : Frédéric Brouard ,

SQL Server stocke les pages des fichier de données (tables, index, blobs...) dans des blocs de 8 pages appelés"extents" (extensions en français). Autant une page ne peut appartenir qu'à un seul objet, autant une extension peutcomporter des pages de différents objets. Est-il possible de force la mise en place d'extension ne contenant qu'un seulet même type d'objet ? La réponse est oui, mais n'est pas sans conséquences !

Les fichiers de données des bases MS SQL Server, sont constitués de pages de 8 Ko organisées par blocs contigus de8 appelées extensions. A l'intérieur d'une page ne figure que les information d'un seul et même objet (ligne de table,ligne d'index ou blob). En revanche et par défaut, une extensions peut contenir des pages abritant différents objets. Onappelle cela une extension mixte (mixed extent). Bien entendu au sein d'une même base, il est possible que certainesextension soient uniformes.

Dans certains cas, il y aurait intérêt à forcer le moteur de stockage à utiliser uniquement des extensions uniformes.

Page 32: Faq SQL Server

SQL Server - La FAQ

- 32 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

Ces cas sont rares mais intéressants :• le cas de la VLDB ayant essentiellement de très grosse table ;• le cas de tempdb si l'on a pensé à la répartir sur autant de gros fichier qu'il y a de CPU.

Pour ce faire, il faut utiliser le drapeau de trace 1118.

Voici un petit script qui montre l'effet de la mise en place de ce paramétrage :

CREATE DATABASE DB_TEST_EXTENT; GO USE DB_TEST_EXTENT; GO CREATE TABLE dbo.T_LONGUE_LIGNE_1_LGL (LGL_ID int identity, LGL_DATA char(8000) default 'blabla'); GO WHILE NOT EXISTS(SELECT * FROM dbo.T_LONGUE_LIGNE_1_LGL WHERE LGL_ID = 8) INSERT INTO dbo.T_LONGUE_LIGNE_1_LGL DEFAULT VALUES; GO DBCC TRACEON(1118); GO CREATE TABLE dbo.T_LONGUE_LIGNE_2_LGL (LGL_ID int identity, LGL_DATA char(8000) default 'blabla'); GO WHILE NOT EXISTS(SELECT * FROM dbo.T_LONGUE_LIGNE_2_LGL WHERE LGL_ID = 8) INSERT INTO dbo.T_LONGUE_LIGNE_2_LGL DEFAULT VALUES; GO DBCC EXTENTINFO(DB_TEST_EXTENT, 'dbo.T_LONGUE_LIGNE_1_LGL', -1); DBCC EXTENTINFO(DB_TEST_EXTENT, 'dbo.T_LONGUE_LIGNE_2_LGL', -1);

Et le résultat :file_id page_id pg_alloc ext_size object_id index_id partition_number partition_id iam_chain_type pfs_bytes ----------- ----------- ----------- ----------- ----------- ----------- ---------------- -------------------- -------------------- ------------------ 1 21 1 1 2105058535 0 1 72057594038779904 In-row data 0x6400000000000000 1 55 1 1 2105058535 0 1 72057594038779904 In-row data 0x6400000000000000 1 77 1 1 2105058535 0 1 72057594038779904 In-row data 0x6400000000000000 1 78 1 1 2105058535 0 1 72057594038779904 In-row data 0x6400000000000000 1 79 1 1 2105058535 0 1 72057594038779904 In-row data 0x6400000000000000 1 80 1 1 2105058535 0 1 72057594038779904 In-row data 0x6400000000000000 1 89 1 1 2105058535 0 1 72057594038779904 In-row data 0x6400000000000000 1 90 1 1 2105058535 0 1 72057594038779904 In-row data 0x6400000000000000

Page 33: Faq SQL Server

SQL Server - La FAQ

- 33 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

file_id page_id pg_alloc ext_size object_id index_id partition_number partition_id iam_chain_type pfs_bytes ----------- ----------- ----------- ----------- ----------- ----------- ---------------- -------------------- -------------------- ------------------ 1 176 8 8 2137058649 0 1 72057594038845440 In-row data 0x4444444444444444

Comme on le voit, ces deux tables contiennent les mêmes données. L'une a donné lieu à la description de 8 pages dansla même extension, l'autre la description globale des 8 pages dans l'extension uniforme.

Bien tester les effets de ce paramétrage, car le remède peut s'avérer dans certainescirconstances, pire que le mal.

Réglage du paramètre

En exécutant :

DBCC TRACEON(1118);

Vous forcez la session en cours à générer des extensions uniformes. Cela peut être intéressant par exemple si vous voulezinsérer un lot important de lignes dans une table sans générer d'extensions mixtes. Par exemple lors de la création d'unebase de données, pour l'alimentation du référentiel.

DBCC TRACEON(1118, -1);

Vous forcez le moteur pour toutes les sessions à venir à générer des extensions uniforme.

DBCC TRACEOFF(1118) ;DBCC TRACEOFF(1118, -1) ;

Vous revenez au comportement normal du moteur de stockage.

Page 34: Faq SQL Server

SQL Server - La FAQ

- 34 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

Sommaire > Administration de la base de données > Sauvegardes et restauration

Comment sauvegarder une base de données

Auteurs : Fabien Celaia ,

Via la commande backup

backup database MaBase to DISK=N'c:\temp\MonFichier.bak'

lien : Déplacement, sauvegardes et restauration de bases sous MS-SQL Server

Comment restaurer une base de données depuis un fichier .bak ?

Auteurs : Fabien Celaia ,

Via la commande restore, en ayant au préalable supprimé toutes les connexions existantes sur la base qui sera écrasée

restore database MaBase from DISK=N'c:\temp\MonFichier.bak'

lien : Déplacement, sauvegardes et restauration de bases sous MS-SQL Server

Comment faire une copie de ma base de données ?

Auteurs : Fabien Celaia ,

via commandes backup/restore

backup database MaBase to DISK=N'c:\temp\Mabase.bak'restore database MaCopie from DISK=N'c:\temp\Mabase.bak'

lien : Déplacement, sauvegardes et restauration de bases sous MS-SQL Server

Comment savoir si je suis en mode recouvrement de type FULL ?

Auteurs : Frédéric Brouard ,

SELECT DATABASEPROPERTYEX(DB_NAME(), 'Recovery')

Comment configurer une base de données en mode FULL RECOVERY ?

Auteurs : Frédéric Brouard ,

Page 35: Faq SQL Server

SQL Server - La FAQ

- 35 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

ALTER DATABASE MABASE SET RECOVERY FULL

Comment connaîte le jeu de caractère et le tri configuré sur son serveur ?

Auteurs : Fabien Celaia ,

sp_helpsort

Comment faire un export complet d'une base ( structure avecclés, procédures etc...) y.c. des données qui sont dans les tables.

Auteurs : Rudi Bruchez ,

Il y a des outils qui génèrent le DDL des objets, et les inserts.

Il y a des outils de diff de base qui sont payants (Red Gate SQL Compare et Data Compare), http://www.sqldelta.com/,http://www.sqlscriptsafe.com/, ...

Il y a des outils gratuits :

• http://www.sqldbtools.com/• http://www.codeproject.com/cs/database/DBScriptSafe.asp• http://www.codeproject.com/database/InsertGeneratorPack.asp

dont des scripts en Perl, Python et Ruby faits par votre serviteur :

• http://www.babaluga.com/doku.php/sql_server/code/index• http://www.babaluga.com/doku.php/programmation/comparaison_python-ruby

Et de Microsoft :

• Visual Studio 2005 Team Edition for Database Professionals

Comment retrouver la date de la dernière restauration d'une base ?

Auteurs : Wolo Laurent , Fabien Celaia , Rudi Bruchez ,

Si vous avez exécuté cette restauration via un job de Microsoft SQL Server, vous pouvez rechercher l'information viala base système msdb

USE VotreBaseGOSELECT destination_database_name, restore_date, b.database_name, physical_name, backup_start_dateFROM msdb.dbo.RestoreHistory h INNER JOIN msdb.dbo.BackupSet b ON h.backup_set_id = b.backup_set_id INNER JOIN msdb.dbo.BackupFile f ON f.backup_set_id = b.backup_set_id

Page 36: Faq SQL Server

SQL Server - La FAQ

- 36 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

WHERE b.database_name = db_name()GO

Si par contre vous avez effectué a restauration via la ligne de commande ou l'assistant interactif, ne vous restera plusqu'à aller rechercher dans les journaux

Comment restaurer une base de données depuis des fichiers .mdb et .ldb ?

Auteurs : Fabien Celaia ,

Ces fichiers sont cex d'une base de données qui a été détachée d'un serveur par l'ordre sp_detache_db.

Pour les rattacher à votre serveur SQL, utilisez la procédure stockée sp_attach_db

EXEC sp_attach_db @dbname ='AdventureWorks', @filename1 = 'D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\AdventureWorks_Data.mdf', @filename2 = 'D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\AdventureWorks_Log.ldf'

lien : Déplacement, sauvegardes et restauration de bases sous MS-SQL Server

lien : Attacher une base de données dont le journal de transaction est manquant

Sauvegarder toutes les bases de données d'un serveur d'un seul coup

Auteurs : Frédéric Brouard ,

Voici une procédure destinée à opérer une sauvegarde globales de toutes les bases d'un serveur. Différentes options sontpossible comme de sauvegarder aussi les bases systèmes ou utiliser une unité de sauvegarde (device).

CREATE PROCEDURE dbo.P_SAVE @FILE_PATH NVARCHAR(256), -- chemin pour stockage des fichiers de sauvegarde @FILE_EXT NVARCHAR(3) = 'BAK', -- extension pour les fichiers de sauvegarde @FILE_NAME NVARCHAR(128) = 'DB_SAVE', -- nom générique des fichiers de sauvegarde @FILE_DATE BIT = 1, -- incorporer la date dans le nom des fichiers @FILE_HOUR BIT = 1, -- incorporer l'heure dans le nom des fichiers @ONLY_USER_DB BIT = 0, -- ne sauvegarder que les bases utilisateur (pas les bases systèmes) @TO_DEVICE BIT = 1, -- créer une unité de sauvegarde (device) pour y inclure toutes les sauvegardes @CLEAN_DEVICE BIT = 1 -- purger l'unité de sauvegarde (device) des sauvegrades qu'elle contient AS -- ATTENTION : les noms des bases de données doivent repecter la norme ISO (pas de caractères illicites) -- dans le cas contraire prévoir les crochet dans le SQL dynamique IF @FILE_PATH IS NULL OR @FILE_EXT IS NULL OR @FILE_NAME IS NULL BEGIN SET @FILE_PATH = COALESCE(@FILE_PATH, '?'); SET @FILE_EXT = COALESCE(@FILE_EXT, '?'); SET @FILE_NAME = COALESCE(@FILE_NAME, '?'); RAISERROR ('Un des paramètres de la procédure est manquant. Chemin : %s - Nom fichier : %s - Extension : %s', 16, 1) RETURN END; -- la variable @PATH se termine t-elle par un "\" ?, si non, l'ajouter IF SUBSTRING(REVERSE(@FILE_PATH), 1, 1) <> '\' SET @FILE_PATH = @FILE_PATH + '\'; -- l'extension ne doit pas avoir de point

Page 37: Faq SQL Server

SQL Server - La FAQ

- 37 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

SET @FILE_EXT = REPLACE(@FILE_EXT, '.', ''); -- le répertoire doit exister. S'il n'existe pas on le créé. -- utilisation de xp_cmdshell DECLARE @SHOW_OPTIONS BIT, @CMDSHELL BIT; SELECT @SHOW_OPTIONS = CAST(value_in_use AS BIT) FROM sys.configurations WHERE name = 'show advanced options' SELECT @CMDSHELL = CAST(value_in_use AS BIT) FROM sys.configurations WHERE name = 'xp_cmdshell' IF @CMDSHELL = 0 BEGIN IF @SHOW_OPTIONS = 0 EXEC sp_configure 'show advanced options', 1; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE; IF @SHOW_OPTIONS = 0 EXEC sp_configure 'show advanced options', 0; RECONFIGURE; END -- création du répertoire EXEC ('xp_cmdshell ''MKDIR "' + @FILE_PATH+'"'''); IF @CMDSHELL = 0 BEGIN EXEC sp_configure 'xp_cmdshell', 0; IF @SHOW_OPTIONS = 0 EXEC sp_configure 'show advanced options', 0; RECONFIGURE; END; -- variables de travail DECLARE @DATE NVARCHAR(9), @HOUR NVARCHAR(7), @DEVICE_NAME NVARCHAR(128), @DEVICE_FILE NVARCHAR(512), @FILE_SAVE NVARCHAR(512), @SQL VARCHAR(max); -- conversion en chaine date et heure au format ISO court IF @FILE_DATE = 1 SET @DATE = REPLACE(CONVERT(NCHAR(10), CURRENT_TIMESTAMP, 121), '-', ''); IF @FILE_HOUR = 1 SET @HOUR = SUBSTRING(REPLACE(CONVERT(NCHAR(25), CURRENT_TIMESTAMP, 121), ':', ''), 12, 6); -- la sauvegarde se fait sur un device. Il faut le créer. IF @TO_DEVICE = 1 BEGIN SET @DEVICE_NAME = @FILE_NAME + COALESCE('_' + @DATE,'') + COALESCE('_' + @HOUR, ''); SET @DEVICE_FILE = @FILE_PATH + @DEVICE_NAME + '.' +@FILE_EXT; END; IF @TO_DEVICE = 1 AND @CLEAN_DEVICE = 1 -- création d'un "device" (unité de sauvegarde) en fait un super fichier qui va contenir toutes les sauvegardes IF EXISTS (SELECT * FROM sys.backup_devices WHERE name = @DEVICE_NAME) EXEC sp_dropdevice @DEVICE_NAME; IF NOT EXISTS(SELECT * FROM sys.backup_devices WHERE name = @DEVICE_NAME) EXEC sp_addumpdevice 'DISK', @DEVICE_NAME, @DEVICE_FILE; -- génération de la commande SQL pour la liste des bases à sauvegarder SET @SQL = ''; SELECT @SQL = @SQL + 'BACKUP DATABASE ' + name +' TO ' + -- vers device ou fichiers CASE WHEN @TO_DEVICE = 1

Page 38: Faq SQL Server

SQL Server - La FAQ

- 38 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

THEN @DEVICE_NAME ELSE 'DISK = ''' + @FILE_PATH + @FILE_NAME + '_' + name + COALESCE('_' + @DATE,'') + COALESCE('_' + @HOUR, '') + COALESCE('.' + @FILE_EXT, '') + '''' END + -- si device alors purger ou non CASE WHEN @TO_DEVICE = 1 AND N = 1 AND @CLEAN_DEVICE = 1 THEN ' WITH FORMAT, INIT' ELSE '' END + ';' + CHAR(10) + CHAR(13) FROM (SELECT name, ROW_NUMBER() OVER(ORDER BY database_id) AS N FROM sys.databases WHERE state = 0 AND source_database_id IS NULL AND (owner_sid <> 0x01 OR @ONLY_USER_DB <> 1) AND name <> 'tempdb' ) AS T; EXEC (@SQL); GO

Exemple d'utilisation :P_SAVE 'C:\! test sauve', 'bkp', 'SAUVEGARDE_SQL_SERVER', 1, 1, 0, 1, 0 -- @FILE_PATH @FILE_EXT @FILE_NAME @FILE_DATE @FILE_HOUR @ONLY_USER_DB @TO_DEVICE @CLEAN_DEVICE

Comment savoir si un plan de maintenance s'est correctement exécuté ?

Auteurs : elsuket ,

Une requête simple dans la base de données système MSDB nous donne la réponse ... Valable sous SQL Server 2000et ultérieur

SELECT plan_name, database_name, activity, start_time, end_time, CASE LEN(CAST(duration / 3600 AS VARCHAR(4))) WHEN 1 THEN '0' + CAST(duration / 3600 AS VARCHAR(4)) ELSE CAST(duration / 3600 AS VARCHAR(4)) END + ':' + CASE LEN(CAST(duration / 60 % 60 AS VARCHAR(2))) WHEN 1 THEN '0' + CAST(duration / 60 % 60 AS VARCHAR(2)) ELSE CAST(duration / 60 % 60 AS VARCHAR(2)) END + ':' + CASE LEN(CAST(duration % 60 AS VARCHAR(2))) WHEN 1 THEN '0' + CAST(duration % 60 AS VARCHAR(2)) ELSE CAST(duration % 60 AS VARCHAR(2)) END Durée FROM msdb.dbo.sysdbmaintplan_history WHERE succeeded = 0 -- 0 : échec | 1 : réussite -- AND start_time BETWEEN '20090907' AND '20090908' ORDER BY database_name, start_time

Il est dès lors facile de placer cette requête dans un DataSet sous Reporting Services ou dans une application WinFormspour pouvoir s'afficher l'état des plans de maintenance qui doivent avoir lieu sur une instance de SQL Server.

Page 39: Faq SQL Server

SQL Server - La FAQ

- 39 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

Sommaire > Trucs et Astuces en T-SQL

Page 40: Faq SQL Server

SQL Server - La FAQ

- 40 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

Sommaire > Trucs et Astuces en T-SQL > Fonctions

Comment manipuler le type DATE dans SQL-Server ?

Auteurs : Fabien Celaia ,

Toutes les fonctions sont disponibles à cette addresse : Fonctions temporelles

Comment crypter une chaîne de caractère en T-SQL ?

Auteurs : Fabien Celaia ,

Utiliser la fonction encrypt()

Comment comparer une chaîne encryptée à un paramètre

Auteurs : Fabien Celaia ,

select * from MaTable where ChampMotDePasseCrypte=encrypt(@MaChaineNonCryptee)

Comment tester si deux dates sont dans la même semaine ?

Auteurs : Fabien Celaia ,

Vous pouvez utiliser la fonction DatePart en usant de la commande SET DATEFIRST pour controller le premier jourde la semaine.

SELECT CASE WHEN DatePart( week, @Date1 ) = DatePart( week, @Date2) THEN 1 ELSE 0END

Comment connaître le nom de l'application qui a démarré la session ?

Auteurs : Wolo Laurent ,

APP_NAME renvoie le nom de l'application pour la session en cours si un nom a été défini par l'application.Exemple :L'exemple suivant vérifie si l'application cliente qui a initié ce traitement est une session de l'Analyseur de requêtes SQL.

DECLARE @CurrentApp varchar(35)SET @CurrentApp = APP_NAME()IF (@CurrentApp <> 'MS SQL Query Analyzer')

Page 41: Faq SQL Server

SQL Server - La FAQ

- 41 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

PRINT 'ce processus n'a pas été démarré par une cession de Query Analyzer.'

Comment connaître le nom de la station de travail ?

Auteurs : Wolo Laurent ,

Il peut être important de connaître le nom de la station de travail qui à executer une instructiond'insertion de données par exemple. Pour cela, nous faisons appel à la fonction HOST_NAME()Exemple :

CREATE TABLE Orders(OrderID INT PRIMARY KEY, CustomerID NCHAR(5) REFERENCES Customers(CustomerID), Workstation NCHAR(30) NOT NULL DEFAULT HOST_NAME(), OrderDate DATETIME NOT NULL, ShipDate DATETIME NULL, ShipperID INT NULL REFERENCES Shippers(ShipperID))

Comment calculer le nombre de jours qu'il y a dans le mois en cours,sachant que la date du jour m'est donnée par la variable @date.

Auteurs : Rudi Bruchez ,

SELECT DAY(DATEADD(d, -DAY(DATEADD(m,1,@Date)),DATEADD(m,1,@date))) AS DernierJourDuMois

Comment rechercher une chaîne de caractère dans toutes les tables ?

Auteurs : Fabien Celaia ,

Petite procédure stockée permettant le scannage des colonnes susceptibles de contenir le champ.

create proc [dbo].[fc_trouvetout] (@cherche as varchar(2000)) as /* Auteur : Fabien Celaia * Date : 16.10.2007 */begin

declare @tb varchar(100), @co varchar(100), @sql nvarchar(500)

select o.name TBL, c.name COL, 0 NBRE into #Result from sysobjects o inner join syscolumns c on c.id=o.id inner join systypes t on t.xtype=c.xtype where c.length >= datalength (@cherche) and t.name like '%char%' and o.type='U'

declare cur cursor for select TBL, COL from #result -- for update

open cur

FETCH NEXT FROM cur INTO @tb, @co

Page 42: Faq SQL Server

SQL Server - La FAQ

- 42 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

WHILE @@FETCH_STATUS = 0 BEGIN

set @sql = 'declare @i int select @i=count(*) from '+@tb +' where '+@co+' like ''%'+@cherche+''' if @i > 0 update #result set NBRE=@i where COL='''+@co+''' AND TBL = '''+@tb+''''

exec sp_executesql @sql

FETCH NEXT FROM cur INTO @tb, @co END

close cur deallocate cur select * from #Result where NBRE>0 drop table #Result end

Attention : selon la volumétrie de la base, la recherche peut être extrêmement longue et coûteuse.

Quelle est la différence entre fonctions et procédures ?

Auteurs : Frédéric Brouard ,

Quelles sont les différences majeures entre une fonction SQL dite UDF (User Defined Function) et une procédure ?

Une fonction (ou UDF, user Define Fonction) est un programme destiné à fournir en sortie, une valeur scalaire ou unetable (SELECT).

Les fonctions scalaires ne peuvent pas contenir :• de transaction (BEGIN TRANSACTION, COMMIT, ROLLBACK,• de sql dynamique (EXEC ('...')• d'ordre de mise à jour (INSERT, UPDATE, DELETE, MERGE)• d'ordre DDL (CREATE, ALTER, DROP), DCL (GRANT REVOKE)• un appel à une procédure (EXEC P...)• l'utilisation d'un cursor (DECLARE CURSOR, FETCH...)• de commande de débogage comme PRINT

Une fonction table peut contenir des ordres de mise à jour, mais ces commandes ne peuvent porter qu'uniquement surla table en sortie.

Une procédure se créée par CREATE PROCEDURE et ses E/S sont :• des paramètres input et output• un éventuel jeu de résultat (voir même plusieurs)• une valeur de retour (code d'erreur)

Elle peut contenir tout code SQL, y compris :• transaction• mise à jour• SQL dynamique• cursor• commande DDL

Page 43: Faq SQL Server

SQL Server - La FAQ

- 43 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

Bien entendu, vous pouvez créer vos procédures dans différents schémas SQL que vous aurez préalablement créés.

Fonction de découpage à césure multiple

Auteurs : Frédéric Brouard ,

Voici un problème complexe, comment "parser" une phrase avec, non pas un caractères de césure, mais un ensemble ?Cette fonction répond à cette demande en fournissant en sortie une table...

Cette fonction permet de découper une phrase selon de multiples caractère de césure.

En entrée :@PHRASE : la phrase à découper @PARSEC : les caractères de césure

En sortie, une table comprenant :colonne 1 : POS la position du mot dans la phrase colonne 2 : MOT le mot colonne 3 : CHR le caractère de césure

CREATE FUNCTION dbo.F_MULTIPARSE(@PHRASE VARCHAR(max), @PARSEC VARCHAR(256)) RETURNS @T TABLE (POS INT, MOT VARCHAR(128), CHR CHAR(1)) AS /****************************************************************************** * Fonction table de découpage à césure multiple * ******************************************************************************* * Fred. Brouard - http://SQLPro.developpez.com - www.sqlspot.com - 2009-04-17 * ******************************************************************************/ BEGIN -- effets de bord IF @PHRASE IS NULL RETURN; IF COALESCE(@PARSEC, '') = '' BEGIN INSERT INTO @T VALUES (1, @PHRASE, NULL); RETURN; END; -- variables locales DECLARE @C CHAR(1), -- lettre analysée @MOT VARCHAR(128), -- mot découpé @I INT, -- boucle sur phrase @J INT, -- boucle sur caractère de césure @JMIN INT, -- premier caractère de césure dans phrase @IC INT, @M INT; SELECT @I = 1, @M = 1; -- boucle sur phrase WHILE @I <= LEN(@PHRASE) BEGIN SET @J = 1; SET @JMIN = NULL; -- boucle sur la liste des caractères de césure WHILE @J <= LEN(@PARSEC) BEGIN SET @C = SUBSTRING(@PARSEC, @J, 1); SET @IC = CHARINDEX(@C, @PHRASE) IF @IC > 0 SET @JMIN = CASE WHEN @JMIN < @IC THEN @JMIN ELSE @IC END; SET @J = @J + 1

Page 44: Faq SQL Server

SQL Server - La FAQ

- 44 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

En sortie, une table comprenant : END; -- récupération de l emplacement de la césure la plus proche IF @JMIN IS NOT NULL BEGIN SET @C = SUBSTRING(@PHRASE, @JMIN, 1); SET @MOT = SUBSTRING(@PHRASE, 1, @JMIN - 1); SET @PHRASE = SUBSTRING(@PHRASE, @JMIN + 1, LEN(@PHRASE) - @JMIN); IF @MOT <> '' INSERT INTO @T VALUES (@M, LTRIM(@MOT), @C); SET @M = @M + 1; END SET @I = @I + 1; END -- insertion du dernier mot IF @PHRASE <> '' INSERT INTO @T VALUES (@M, LTRIM(@PHRASE), NULL); RETURN END GO

Exemple :

SELECT * FROM dbo.F_MULTIPARSE('toto, tata-titi', '-,')

POS MOT CHR ----------- -------------------- ---- 1 toto , 2 tata - 3 titi NULL

Si vous voulez découper avec le caractère espace (blanc) il ne faut pas le placer en fin du paramètre @PARSEC sinonil sera ignoré du fait du type VARCHAR. Si vous ne voulez parser que sur le blanc, rajouter à la suite du blanc uncaractère non imprimable (ASCII inférieur à 20). Par exemple CHAR(8).

Calcul en SQL de la date de Pâques

Auteurs : Frédéric Brouard ,

Juste une petite fonction SQL pour calculer la date de pâques et toutes les dates qui en découlent (Lundi de Pâques,Ascension, Pentecôte et Lundi de Pentecôte).

L'algorithme utilisé pour ce calcul est celui d'Oudin.

-- fonction de calcul de la date de pâques CREATE FUNCTION dbo.F_CALCULE_PAQUES (@AN INT) RETURNS DATE /****************************************************************************** * fonction table de calcul de la date de pâques * ******************************************************************************* * Fred. Brouard - http://SQLPro.developpez.com - www.sqlspot.com - 2009-03-20 * ******************************************************************************/ AS BEGIN DECLARE @G INT, @C INT, @C4 INT, @E INT, @H INT, @K INT, @P INT, @Q INT, @I INT, @B INT, @J1 INT, @J2 INT, @R INT; SELECT @G = @AN % 19, @C = @AN / 100, @B = (@AN / 4) + @AN; SELECT @C4 = @C / 4, @E = ((8 * @C) + 13) / 25;

Page 45: Faq SQL Server

SQL Server - La FAQ

- 45 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

SELECT @H = ((19 * @G) + @C - @C4 - @E + 15) % 30; SELECT @K = @H / 28, @P = 29 / (@H + 1), @Q = (21 - @G) / 11; SELECT @I = (((@K * @P * @Q) - 1 ) * @K) + @H; SELECT @J1 = @B + @I + 2 + @C4 - @C; SELECT @J2 = @J1 % 7; SELECT @R = 28 + @I - @J2; RETURN DATEADD(day, @R - 1, CAST(CAST(@AN AS CHAR(4)) +'0301' AS DATE)); END GO

Utilisation :SELECT dbo.F_CALCULE_PAQUES (2009);

Les autres dates des jours fériés mobiles sont calculées d'après la date de Pâque comme suit :• Lundi de pâques = Pâques + 1• Pentecôte = Pâques + 50• Lundi de Pentecôte = Pâques + 51• Ascension = Pâques 40 (jeudi)

Exemple d'utilisation :

WITH T AS (SELECT DISTINCT dbo.F_CALCULE_PAQUES(2009) AS P ), D AS (SELECT P, 'Pâques' AS NOM FROM T UNION ALL SELECT DATEADD(day, 1, P), 'Lundi de Pâques' FROM T UNION ALL SELECT DATEADD(day, 40, P), 'Ascension' FROM T UNION ALL SELECT DATEADD(day, 50, P), 'Pentecôte' FROM T UNION ALL SELECT DATEADD(day, 51, P), 'Lundi de Pentecôte' FROM T) SELECT * FROM D;

P NOM ---------- ------------------ 2009-04-12 Pâques 2009-04-13 Lundi de Pâques 2009-05-22 Ascension 2009-06-01 Pentecôte 2009-06-02 Lundi de Pentecôte

Page 46: Faq SQL Server

SQL Server - La FAQ

- 46 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

Sommaire > Trucs et Astuces en T-SQL > Limiter le jeu de résultat

Comment limiter le nombre de lignes retounées par une commande SELECT ?

Auteurs : Wolo Laurent , Fabien Celaia ,

Pour limiter le nombre de ligne retourné par une commande Select, MS SQL Serveur fournit la commende TOP, C'estun équivalent de la commande Limit de MySQLExemple:

--Retouner 100 lignes d'une table T_ClientSELECT TOP 100 *FROM t_client

OU

SET ROWCOUNT 100GOSELECT * FROM t_clientGOSET ROWCOUNT 0GO

Comment implémenter la fonction LIMIT de MySQL en SQLServer ?

Auteurs : Wolo Laurent ,

Le SGBD MySQL fournit une fonctionalité intéressante dans les SELECT : LIMIT.

SELECT * FROM MATABLE LIMIT 10, 30

Affiche 30 lignes à partir de l'enregistrement 10. Voici une solution pour implémenter cette fonctionalité en T-SQL :

SELECT * FROM ( SELECT TOP 30 Field1, Field2 FROM ( SELECT TOP 10 Field1, Field2 FROM matable ORDER BY monchamp asc ) AS tbl1 ORDER BY monchamp desc ) AS tbl2 ORDER BY monchamp asc

et une petite fonction php pour généraliser, a améliorer selon vos besoins :

function getLimitMSSQL($start, $nbrows, $fields, $table, $where, $orderfield, $sort = 'asc') { $top = $start + $nbrows ; if ( $sort == 'asc' ) { $asc = 'asc' ; $desc = 'desc' ; } else { $asc = 'desc' ; $desc = 'asc' ; } $sql = '' ; $sql = "SELECT * FROM (

Page 47: Faq SQL Server

SQL Server - La FAQ

- 47 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

SELECT TOP $nbrows $fields from ( SELECT TOP $top $fields FROM $table $where ORDER BY $orderfield $asc ) tbl1 ORDER BY $orderfield $desc ) as tbl2 order by $orderfield $asc " ; return $sql ; }

Comment connaître le nombre d'enregistrements retournéspar une requête SELECT, UPDATE, INSERT , DELETE ?

Auteurs : Fabien Celaia ,

En interrogeant la variable globale @@rowcount, directement après l'appel de la requête

Comment supprimer la ligne informationnelle du total de lignes impactées ?

Auteurs : Fabien Celaia ,

set nocount on

Comment réactiver la ligne informationnelle du total de lignes impactées ?

Auteurs : Fabien Celaia ,

set nocount off

Comment ne traiter que les n premières lignes d'un buffer ?

Auteurs : Fabien Celaia ,

set rowcount n

Comment retraiter toutes les lignes après un set rowcount n ?

Auteurs : Fabien Celaia ,

Set rowcount 0

Comment récupérer le résultat d'une requete dynamique ?

Auteurs : HULK ,

Si la requête dynamique ne retourne qu'une seule valeur

Page 48: Faq SQL Server

SQL Server - La FAQ

- 48 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

CREATE PROCEDURE RecupVariable ASDECLARE @VAR AS VARCHAR(10)SET @VAR = (SELECT champ FROM Table WHERE ..) PRINT @VAR

Si elle retourne plusieurs valeurs ou plusieurs lignes, passer par une table de travail

CREATE PROCEDURE RecupVariable @PARAM INTASDECLARE @VAR AS VARCHAR(10), @QUERY AS VARCHAR(150)SET @QUERY = 'SELECT champ1 INTO TableTempo FROM Table WHERE champ2 = ' + CAST(@PARAM AS VARCHAR(5))EXEC(@QUERY) SET @VAR = (SELECT Champ1 FROM TableTempo)DROP TABLE TableTempoPRINT @VAR

Comment puis je récupérer une liste / un tableau en sql

Auteurs : Rudi Bruchez ,

deux solutions :

• un grand varchar avec un délimiteur, que l'on parse dans une procédure stockée, par exemple à l'aide d'unefonction qui retourne une table.

• une structure XML que l'on envoie dans un grand varchar, ou un TEXT, et que l'on convertit en table dans uneprocédure stockée avec OPENXML.

Pour un XML du genre:

<Elements> <Element> <Key/> <Value/> </Element> </Elements>

Coder comme ceci

DECLARE @idoc intDECLARE @tField TABLE (FieldName varchar(100), Value varchar(100))

EXEC master.dbo.sp_xml_preparedocument @idoc OUTPUT, @KeyValue

INSERT INTO @tField (FieldName, Value)SELECT FieldName, ValueFROM OPENXML(@idoc, '/Elements/Element', 2) WITH (FieldName varchar(100) 'Key', Value varchar(100))

.. ou sans passer par une variable table, directement dans un JOIN.

Page 49: Faq SQL Server

SQL Server - La FAQ

- 49 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

En étant conscient que les performances du OPENXML peuvent poser problème sur un serveur très sollicité. A tester.

lien : Exemple

Comment générer un fichier image (.JPG, .GIF) à partir d'un champ varbinary ?

Auteurs : davidou2001 ,

Voici le code pour réaliser ceci

-- Le fichier binaire DECLARE @s varbinary(2048) SET @s = 0x47494...code hexa du fichier DECLARE @o int DECLARE @r int EXEC sp_oacreate 'adodb.stream', @o output EXEC sp_oasetproperty @o, 'type', 2 EXEC sp_oamethod @o, 'open' EXEC sp_oamethod @o, 'writetext', NULL, @s EXEC sp_oacreate 'adodb.stream', @r output EXEC sp_oasetproperty @r, 'type', 1 EXEC sp_oamethod @r, 'open' EXEC sp_oasetproperty @o, 'position', 2 EXEC sp_oamethod @o, 'copyto', NULL, @r EXEC sp_oamethod @r, 'savetofile', NULL, @basedir, 2

On peut utiliser la primitive READTEXT pour obtenir le code hexa d'une colonne image, par exemple.

Les jointures ANSI sont-elle similaires aux jointures faites via conditions ?

Auteurs : Frédéric Brouard ,

SQL Server n'est pas compatible avec la norme SQL sur la jointure externe avec *=. Il ne donne pas les mêmes résultats...

CREATE TABLE T1 (C1 INT) INSERT INTO T1 VALUES (1)INSERT INTO T1 VALUES (0)INSERT INTO T1 VALUES (1) CREATE TABLE T2 (C2 INT) INSERT INTO T2 VALUES (2)INSERT INTO T2 VALUES (0)INSERT INTO T2 VALUES (2) CREATE TABLE T3 (C3 INT) INSERT INTO T3 VALUES (3)INSERT INTO T3 VALUES (0)INSERT INTO T3 VALUES (3) SELECT *FROM T1 LEFT OUTER JOIN T2 ON T1.C1 = T2.C2 LEFT OUTER JOIN T3 ON T1.C1 = T3.C3

Page 50: Faq SQL Server

SQL Server - La FAQ

- 50 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

C1 C2 C3 ----------- ----------- ----------- 1 NULL NULL0 0 01 NULL NULL SELECT *FROM T1, T2, T3WHERE C1 *= C2 AND C1 *= C3 C1 C2 C3 ----------- ----------- ----------- 1 NULL NULL0 0 01 NULL NULL -- exact ! SELECT *FROM T1 LEFT OUTER JOIN T2 ON T1.C1 = T2.C2 LEFT OUTER JOIN T3 ON T2.C2 = T3.C3 C1 C2 C3 ----------- ----------- ----------- 1 NULL NULL0 0 01 NULL NULL SELECT *FROM T1, T2, T3WHERE C1 *= C2 AND C2 *= C3 -- Serveur : Msg 301, Niveau 16, État 1, Ligne 1-- La requête comporte une requête de jointure externe qui n'est pas autorisée.-- SQL Server ne sait pas faire des jointures externes en cascade... SELECT *FROM T1 INNER JOIN (SELECT * FROM T2) AS T ON T1.C1 = T.C2 RIGHT OUTER JOIN T3 ON T.C2 = T3.C3 C1 C2 C3 ----------- ----------- ----------- NULL NULL 30 0 0NULL NULL 3 SELECT *FROM T1, (SELECT * FROM T2) AS T, T3WHERE C1 = C2 AND C2 =* C3 -- Serveur : Msg 303, Niveau 16, État 1, Ligne 1-- La table 'T2' est un membre interne d'une clause de jointure externe. Cela n'est pas autorisé si la table participe aussi à une clause JOIN régulière.-- SQL Server ne sait pas faire des jointures externes en cascade... SELECT *FROM T1 RIGHT OUTER JOIN T2 ON T1.C1 = T2.C2 RIGHT OUTER JOIN T3 ON T1.C1 = T3.C3

Page 51: Faq SQL Server

SQL Server - La FAQ

- 51 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

C1 C2 C3 ----------- ----------- ----------- NULL NULL 30 0 0NULL NULL 3 SELECT *FROM T1, T2, T3WHERE C1 =* C2 AND C1 =* C3 C1 C2 C3 ----------- ----------- ----------- NULL 2 3NULL 2 0NULL 2 3NULL 0 30 0 0NULL 0 3NULL 2 3NULL 2 0NULL 2 3 -- résultat totalement faux !!!

N'oubliez pas que avant que la norme SQL ne statut en 1992 sur les jointures externes chaque éditeur de SGBD étaitllibre de faire à sa sauce... Cette interprétation de la jointure externe date de l'époque Sybase...

Depuis 2005 une telle syntaxe est heureusement interdite !

Arbres intervallaires : procédure de déplacement d'un sous arbre

Auteurs : Frédéric Brouard ,

Dans cet article sur les arbres intervallaires, je n'ai pas mentionné comment déplacer un sous arbre modélisé parintervalle. Voici comment procéder...

Cette procédure exemple (sous forme de primitive) permet de déplacer un sous arbre en le faisant devenir un fils ainéou cadet, un grand frère ou un petit frère et même un père par rapport à l'élément ciblé.

/****************************************************************************** -- création d'une procédure de déplacement d'un sous arbre ******************************************************************************/ CREATE PROCEDURE dbo.P_MOVE_TRE @id int, -- Ident de l'élément déplacé @id_parent int, -- Ancêtre de destination @mode char(2), -- FG : Grand Frère, PF : Petit Frère, FA : Fils ainé, FC : Fils cadet, P : Père, etc @recurs bit -- La descendance est déplacé aussi AS /****************************************************************************** * PROCÉDURE DÉPLACEMENT D'UN SOUS ARBRE DANS UN ARBRE MODÉLISÉ PAR INTERVALLE * ******************************************************************************* * Frédéric Brouard - SQLPro - http://www.sqlspot.com - 2004-06-10 * ******************************************************************************* * PARAMÈTRES : * * @id clef de l'élément à déplacer (racine du sous arbre) * * @id_parent parent du point de déplacement (ancrage) * * @mode parentèle au point d'ancrage. Valeurs possibles : * * GF : Frère (grand) * * PF : Frère (petit) *

Page 52: Faq SQL Server

SQL Server - La FAQ

- 52 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

* FA : Fils ainé * * FC : Fils cadet * * P : Père * * @recurs si 1 déplacement de tout le sous arbre, * * si 0 déplacement de l'élément seul * ******************************************************************************/ DECLARE @OK int, @bdmax int, -- limite supérieure droite de l'arborescence @deltab int, -- Delta de borne @bgd int, -- Infos sur le déplacé @bdd int, @nivd int, @bgp int, -- Infos sur le parent @bdp int, @nivp int -- Mode silencieux SET NOCOUNT ON; -- contrôle d'exécution IF @mode IS NULL BEGIN RAISERROR ('Déplacement impossible sans mode ! (TABLE dbo.T_NOMENCLATURE_PIECES_NMC)', 16, 1) RETURN END IF @recurs IS NULL BEGIN RAISERROR ('Déplacement impossible sans type ! (TABLE dbo.T_NOMENCLATURE_PIECES_NMC)', 16, 1) RETURN END IF @id IS NULL BEGIN RAISERROR ('Déplacement impossible sans précision de l''élément ! (TABLE dbo.T_NOMENCLATURE_PIECES_NMC)', 16, 1) RETURN END IF @id_parent IS NULL BEGIN RAISERROR ('Déplacement impossible sans précision du destinataire ! (TABLE dbo.T_NOMENCLATURE_PIECES_NMC)', 16, 1) RETURN END IF @id = @id_parent BEGIN RAISERROR ('Déplacement impossible , origine et destination identique ! (TABLE dbo.T_NOMENCLATURE_PIECES_NMC)', 16, 1) RETURN END SET @mode = UPPER(@mode) IF NOT( @mode = 'GF' OR @mode = 'PF' OR @mode = 'FC' OR @mode = 'FA' ) -- OR @mode = 'P' -- PBT: à vérifier ! BEGIN RAISERROR ('Déplacement impossible, mode inconnu ! (TABLE dbo.T_NOMENCLATURE_PIECES_NMC)', 16, 1) RETURN END -- démarrage transaction ------------------- SET TRANSACTION ISOLATION LEVEL SERIALIZABLE BEGIN TRANSACTION MOVE_NMC

Page 53: Faq SQL Server

SQL Server - La FAQ

- 53 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

-- L'élément existe toujours ? SELECT @OK = count(*) FROM dbo.T_NOMENCLATURE_PIECES_NMC WHERE NMC_ID = @id IF @OK IS NULL OR @OK = 0 BEGIN RAISERROR ('Déplacement impossible, l''élément n''existe pas ! (TABLE dbo.T_NOMENCLATURE_PIECES_NMC)', 16, 1) GOTO LBL_ERROR RETURN END -- Le parent existe toujours ? SELECT @OK = count(*) FROM dbo.T_NOMENCLATURE_PIECES_NMC WHERE NMC_ID = @id_parent IF @OK IS NULL OR @OK = 0 BEGIN RAISERROR ('Déplacement impossible, le parent n''existe pas ! (TABLE dbo.T_NOMENCLATURE_PIECES_NMC)', 16, 1) GOTO LBL_ERROR RETURN END -- On récupère la borne supérieure max de l'ensemble SELECT @bdmax = max(NMC_BD) FROM dbo.T_NOMENCLATURE_PIECES_NMC IF @bdmax IS NULL OR @bdmax = 0 BEGIN RAISERROR ('Déplacement impossible, la borne BD est nulle ! (TABLE dbo.T_NOMENCLATURE_PIECES_NMC)', 16, 1) GOTO LBL_ERROR RETURN END -- On a un élément : on récupère ses caractéristiques SELECT @bgd = NMC_BG, @bdd = NMC_BD, @nivd = NMC_NIVEAU FROM dbo.T_NOMENCLATURE_PIECES_NMC WHERE NMC_ID = @id IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END SET @deltab = @bdmax + 1 - @bgd -- DEBUT de l'opération proprement dite... -- Opération récursive ? IF @recurs = 0 BEGIN -- Seul l'élément doit être déplacé -- déplacement de l'élément seul en fin de liste UPDATE dbo.T_NOMENCLATURE_PIECES_NMC SET NMC_BG = NMC_BG + @deltab, NMC_BD = NMC_BD + @deltab WHERE NMC_ID = @id IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END -- remontée de ses descendants dans la hiérarchie UPDATE dbo.T_NOMENCLATURE_PIECES_NMC SET NMC_BG = NMC_BG - 1, NMC_BD = NMC_BD - 1, NMC_NIVEAU = NMC_NIVEAU - 1 WHERE NMC_BG > @bgd AND NMC_BD < @bdd IF @@ERROR <> 0 BEGIN

Page 54: Faq SQL Server

SQL Server - La FAQ

- 54 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

GOTO LBL_ERROR RETURN END -- rééquilibrage de l'arbre UPDATE dbo.T_NOMENCLATURE_PIECES_NMC SET NMC_BG = NMC_BG - 2 WHERE NMC_BG > @bdd AND NMC_BG < @bdmax IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END -- UPDATE dbo.T_NOMENCLATURE_PIECES_NMC SET NMC_BD = NMC_BD - 2 WHERE NMC_BD > @bdd AND NMC_BD <= @bdmax IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END -- Mise en place de l'élement deplacé -- On récupère d'abord les caractéristiques du parent SELECT @bgp = NMC_BG, @bdp = NMC_BD, @nivp = NMC_NIVEAU FROM dbo.T_NOMENCLATURE_PIECES_NMC WHERE NMC_ID = @id_parent IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END -- Grand frère IF @mode = 'GF' BEGIN -- Limite sup. UPDATE dbo.T_NOMENCLATURE_PIECES_NMC SET NMC_BD = NMC_BD + 2 WHERE NMC_BD >= @bdp AND NMC_BD <= @bdmax IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END -- Limite inf. UPDATE dbo.T_NOMENCLATURE_PIECES_NMC SET NMC_BG = NMC_BG + 2 WHERE NMC_BG >= @bgp AND NMC_BG < @bdmax IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END UPDATE dbo.T_NOMENCLATURE_PIECES_NMC SET NMC_BG = @bgp, NMC_BD = @bgp + 1, NMC_NIVEAU = @nivp WHERE NMC_ID = @id IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END END

Page 55: Faq SQL Server

SQL Server - La FAQ

- 55 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

-- Petit Frère IF @mode = 'PF' BEGIN -- Limite sup. UPDATE dbo.T_NOMENCLATURE_PIECES_NMC SET NMC_BD = NMC_BD + 2 WHERE NMC_BD > @bdp AND NMC_BD <= @bdmax IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END -- Limite inf. UPDATE dbo.T_NOMENCLATURE_PIECES_NMC SET NMC_BG = NMC_BG + 2 WHERE NMC_BG > @bdp AND NMC_BG < @bdmax IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END UPDATE dbo.T_NOMENCLATURE_PIECES_NMC SET NMC_BG = @bdp + 1, NMC_BD = @bdp + 2, NMC_NIVEAU = @nivp WHERE NMC_ID = @id IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END END -- Fils cadet IF @mode = 'FC' BEGIN -- Limite sup. UPDATE dbo.T_NOMENCLATURE_PIECES_NMC SET NMC_BD = NMC_BD + 2 WHERE NMC_BD >= @bdp AND NMC_BD <= @bdmax IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END -- Limite inf. UPDATE dbo.T_NOMENCLATURE_PIECES_NMC SET NMC_BG = NMC_BG + 2 WHERE NMC_BG > @bdp AND NMC_BG < @bdmax IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END UPDATE dbo.T_NOMENCLATURE_PIECES_NMC SET NMC_BG = @bdp, NMC_BD = @bdp + 1, NMC_NIVEAU = @nivp + 1 WHERE NMC_ID = @id IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN

Page 56: Faq SQL Server

SQL Server - La FAQ

- 56 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

END END -- Fils ainé IF @mode = 'FA' BEGIN -- Limite sup. UPDATE dbo.T_NOMENCLATURE_PIECES_NMC SET NMC_BD = NMC_BD + 2 WHERE NMC_BD > @bgp AND NMC_BD <= @bdmax IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END -- Limite inf. UPDATE dbo.T_NOMENCLATURE_PIECES_NMC SET NMC_BG = NMC_BG + 2 WHERE NMC_BG > @bgp AND NMC_BG < @bdmax IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END UPDATE dbo.T_NOMENCLATURE_PIECES_NMC SET NMC_BG = @bgp + 1, NMC_BD = @bgp + 2, NMC_NIVEAU = @nivp + 1 WHERE NMC_ID = @id IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END END END ELSE BEGIN -- L'élément et sa descendance doivent être déplacés -- déplacement de l'élément et de sa descendance en fin de liste -- Le niveau sera réactualisé ultérieurement UPDATE dbo.T_NOMENCLATURE_PIECES_NMC SET NMC_BG = NMC_BG + @deltab, NMC_BD = NMC_BD + @deltab, NMC_NIVEAU = NMC_NIVEAU - @nivd WHERE NMC_BG >= @bgd AND NMC_BD <= @bdd IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END -- rétablissement des bornes -- Calcul du Delta SET @deltab = @bdd - @bgd + 1 -- UPDATE dbo.T_NOMENCLATURE_PIECES_NMC SET NMC_BD = NMC_BD - @deltab WHERE NMC_BD > @bdd AND NMC_BG <= @bdmax IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END

Page 57: Faq SQL Server

SQL Server - La FAQ

- 57 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

-- UPDATE dbo.T_NOMENCLATURE_PIECES_NMC SET NMC_BG = NMC_BG - @deltab WHERE NMC_BG > @bdd AND NMC_BG < @bdmax IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END -- On récupère d'abord les caractéristiques du parent SELECT @bgp = NMC_BG, @bdp = NMC_BD, @nivp = NMC_NIVEAU FROM dbo.T_NOMENCLATURE_PIECES_NMC WHERE NMC_ID = @id_parent IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END -- Mise en place de l'élement deplacé -- Grand frère IF @mode = 'GF' BEGIN -- Limite sup. UPDATE dbo.T_NOMENCLATURE_PIECES_NMC SET NMC_BD = NMC_BD + @deltab WHERE NMC_BD > @bgp AND NMC_BD <= @bdmax IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END -- Limite inf. UPDATE dbo.T_NOMENCLATURE_PIECES_NMC SET NMC_BG = NMC_BG + @deltab WHERE NMC_BG >= @bgp AND NMC_BG < @bdmax IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END -- Recadrage de la liste d'éléments déplacés SET @deltab = @bdmax - @bgp + 1 UPDATE dbo.T_NOMENCLATURE_PIECES_NMC SET NMC_BG = NMC_BG - @deltab, NMC_BD = NMC_BD - @deltab, NMC_NIVEAU = NMC_NIVEAU + @nivp WHERE NMC_BG > @bdmax IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END END -- Petit Frère IF @mode = 'PF' BEGIN -- Limite sup. UPDATE dbo.T_NOMENCLATURE_PIECES_NMC SET NMC_BD = NMC_BD + @deltab WHERE NMC_BD > @bdp AND NMC_BD <= @bdmax IF @@ERROR <> 0 BEGIN

Page 58: Faq SQL Server

SQL Server - La FAQ

- 58 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

GOTO LBL_ERROR RETURN END -- Limite inf. UPDATE dbo.T_NOMENCLATURE_PIECES_NMC SET NMC_BG = NMC_BG + @deltab WHERE NMC_BG > @bdp AND NMC_BG < @bdmax IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END -- Recadrage de la liste d'éléments déplacés SET @deltab = @bdmax - @bdp UPDATE dbo.T_NOMENCLATURE_PIECES_NMC SET NMC_BG = NMC_BG - @deltab, NMC_BD = NMC_BD - @deltab, NMC_NIVEAU = NMC_NIVEAU + @nivp WHERE NMC_BG > @bdmax IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END END -- Fils cadet IF @mode = 'FC' BEGIN -- Limite sup. UPDATE dbo.T_NOMENCLATURE_PIECES_NMC SET NMC_BD = NMC_BD + @deltab WHERE NMC_BD >= @bdp AND NMC_BD <= @bdmax IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END -- Limite inf. UPDATE dbo.T_NOMENCLATURE_PIECES_NMC SET NMC_BG = NMC_BG + @deltab WHERE NMC_BG > @bdp AND NMC_BG < @bdmax IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END -- Recadrage de la liste d'éléments déplacés SET @deltab = @bdmax - @bdp + 1 UPDATE dbo.T_NOMENCLATURE_PIECES_NMC SET NMC_BG = NMC_BG - @deltab, NMC_BD = NMC_BD - @deltab, NMC_NIVEAU = NMC_NIVEAU + @nivp + 1 WHERE NMC_BG > @bdmax IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END END -- Fils ainé IF @mode = 'FA' BEGIN

Page 59: Faq SQL Server

SQL Server - La FAQ

- 59 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

-- Limite sup. UPDATE dbo.T_NOMENCLATURE_PIECES_NMC SET NMC_BD = NMC_BD + @deltab WHERE NMC_BD > @bgp AND NMC_BD <= @bdmax IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END -- Limite inf. UPDATE dbo.T_NOMENCLATURE_PIECES_NMC SET NMC_BG = NMC_BG + @deltab WHERE NMC_BG > @bgp AND NMC_BG < @bdmax IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END -- Recadrage de la liste d'éléments déplacés SET @deltab = @bdmax - @bgp UPDATE dbo.T_NOMENCLATURE_PIECES_NMC SET NMC_BG = NMC_BG - @deltab, NMC_BD = NMC_BD - @deltab, NMC_NIVEAU = NMC_NIVEAU + @nivp + 1 WHERE NMC_BG > @bdmax IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END END END COMMIT TRANSACTION MOVE_NMC GOTO LBL_FINAL RETURN LBL_ERROR: ROLLBACK TRANSACTION MOVE_NMC LBL_FINAL: SET TRANSACTION ISOLATION LEVEL READ COMMITTED GO

Cette procédure opère dans la table décrite ci dessous :CREATE TABLE dbo.dbo.T_NOMENCLATURE_PIECES_NMC ( NMC_ID T_N_ID IDENTITY NOT NULL PRIMARY KEY, NMC_BG T_N_INT_POS NOT NULL , NMC_BD T_N_INT_POS NOT NULL , NMC_NIVEAU T_N_INT NOT NULL , ... )

Pour l'adapter à votre table spécifique, il suffit de remplacer les noms de la tables et des différentes colonnes, afin del'adpater à votre cas.

Exemple d'exécution :EXEC dbo.P_MOVE_TRE 45, 108, 'FA', 1

Page 60: Faq SQL Server

SQL Server - La FAQ

- 60 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

Bon amusement !

Arbres intervallaires : procédure de dérécursivation

Auteurs : Frédéric Brouard ,

Dans cet article sur les arbres intervallaires, je n'ai pas mentionné comment effectuer la transformation d'une tablemodélisée par auto référence en une table en mode intervallaire. Voici comment procéder...

La procédure ci dessous utilise du code SQL dynamique pour intégrer les données à transformer dans des tables pseudotemporaires pour ensuite les reverser dans la table d'origine. Il convient de créer préalablement les colonnes nécessairepour recevoir les bornes gauches et droite.

/****************************************************************************** -- création d'une procédure de calcul des bornes des intervalles de l'arbre ******************************************************************************/ -- la procédure P_DERECURSIVE_TREE existe t-elle dans la base ? -- Si oui, la supprimer ! IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = 'dbo' AND ROUTINE_NAME = 'P_DERECURSIVE_TREE' AND ROUTINE_TYPE = 'PROCEDURE') DROP PROCEDURE P_DERECURSIVE_TREE GO -- création de la fonction P_EXPLORE_DIR CREATE PROCEDURE dbo.P_DERECURSIVE_TREE @TABLE_SCHEMA sysname, @TABLE_NAME sysname, @COL_ID sysname, @COL_ID_PERE sysname, @COL_BG sysname, @COL_BD sysname AS /****************************************************************************** * PROCÉDURE DE CALCUL D'UN ARBRE INTERVALLAIRE ACTUELLEMENT EN AUTO RÉFÉRENCE * ******************************************************************************* * Frédéric Brouard - SQLPro - http://www.sqlspot.com - 2004-06-10 * ******************************************************************************* * PARAMÈTRES : * * @TABLE_SCHEMA schéma SQL de la table (en principe dbo) * * @TABLE_NAME nom de la table * * @COL_ID nom de la colonne colonne clef primaire * * @COL_ID_PERE nom de la col. clef étrangère en auto réf. à la clef prim. * * @COL_BG nom de la colonne borne gauche * * @COL_BD nom de la colonne borne droite * ******************************************************************************/ DECLARE @SQL NVARCHAR(4000) -- la table TMP_TREE_SQLPro existe t-elle dans la base B_DATASAPIENS_OS_FILE -- pour l'utilisateur courant ? Si oui, la virer ! IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'TMP_TREE_SQLPro') BEGIN SET @SQL = 'DROP TABLE dbo.TMP_TREE_SQLPro' EXEC (@SQL) END -- on créé la table TMP_TREE_SQLPro pour stocker temporairement les identifiants

Page 61: Faq SQL Server

SQL Server - La FAQ

- 61 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

-- et autorelations de la table à traiter CREATE TABLE dbo.TMP_TREE_SQLPro (CLEF INT NOT NULL, CLEF_REF INT); -- la table TMP_STACK_SQLPro existe t-elle dans la base B_DATASAPIENS_OS_FILE -- pour l'utilisateur courant ? Si oui, la virer ! IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'TMP_STACK_SQLPro') BEGIN SET @SQL = 'DROP TABLE dbo.TMP_STACK_SQLPro' EXEC (@SQL) END -- on créé la table TMP_STACK_SQLPro pour gérer une pile afin de dérécursiver l'arbre CREATE TABLE dbo.TMP_STACK_SQLPro (PILE INTEGER NOT NULL, CLEF CHAR(10) NOT NULL, GAUCHE INTEGER, DROITE INTEGER); -- on y insère les valeurs dedans SET @SQL = 'INSERT INTO dbo.TMP_TREE_SQLPro SELECT ' + @COL_ID + ', ' + @COL_ID_PERE + ' FROM ' + @TABLE_SCHEMA + '.' + @TABLE_NAME EXECUTE (@SQL) -- variables locales DECLARE @COMPTEUR INTEGER; DECLARE @MAX_CPTR INTEGER; DECLARE @POINTEUR INTEGER; -- initialisation SET @COMPTEUR = 2; SET @MAX_CPTR = 2 * (SELECT COUNT(*) FROM TMP_TREE_SQLPro); SET @POINTEUR = 1; -- insertion de la racine de l'arbre dans la pile INSERT INTO TMP_STACK_SQLPro SELECT 1, CLEF, 1, NULL FROM dbo.TMP_TREE_SQLPro WHERE CLEF_REF IS NULL; -- et on supprime la référence à la racine DELETE FROM dbo.TMP_TREE_SQLPro WHERE CLEF_REF IS NULL; -- tant que l'on a pas traité toute l'enveloppe intervallaire WHILE @COMPTEUR <= (@MAX_CPTR) BEGIN -- s'il existe des lignes à traiter IF EXISTS (SELECT * FROM dbo.TMP_STACK_SQLPro AS S INNER JOIN dbo.TMP_TREE_SQLPro AS T ON S.CLEF = T.CLEF_REF WHERE S.PILE = @POINTEUR) BEGIN -- empile tant que la ligne analysée a des fils (calcul de la borne gauche) INSERT INTO dbo.TMP_STACK_SQLPro SELECT @POINTEUR + 1, MIN(T.CLEF), @COMPTEUR, NULL FROM dbo.TMP_STACK_SQLPro AS S INNER JOIN dbo.TMP_TREE_SQLPro AS T ON S.CLEF = T.CLEF_REF

Page 62: Faq SQL Server

SQL Server - La FAQ

- 62 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

WHERE S.PILE = @POINTEUR; -- supprime la ligne analysée DELETE FROM dbo.TMP_TREE_SQLPro WHERE CLEF = (SELECT CLEF FROM dbo.TMP_STACK_SQLPro WHERE PILE = @POINTEUR + 1); -- incrémente compteur et pointeur SET @COMPTEUR = @COMPTEUR + 1; SET @POINTEUR = @POINTEUR + 1; END ELSE BEGIN -- dépile parce que que la ligne analysée n'a plus de fils (calcul de la borne droite) UPDATE dbo.TMP_STACK_SQLPro SET DROITE = @COMPTEUR, PILE = - PILE -- pops the Stack WHERE PILE = @POINTEUR -- incrémente compteur et décrémente pointeur SET @COMPTEUR = @COMPTEUR + 1; SET @POINTEUR = @POINTEUR - 1; END; END; -- met à jour la table cible avec ces calculs SET @SQL = ' UPDATE ' + @TABLE_SCHEMA + '.' + @TABLE_NAME + ' SET ' + @COL_BG + ' = S.GAUCHE, ' + @COL_BD + ' = S.DROITE' + ' FROM dbo.TMP_STACK_SQLPro S INNER JOIN ' + @TABLE_NAME + ' T ON S.CLEF = T.'+@COL_ID EXEC (@SQL) -- suppression des tables pseudo temporaires IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'TMP_TREE_SQLPro') BEGIN SET @SQL = 'DROP TABLE dbo.TMP_TREE_SQLPro' EXEC (@SQL) END IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'TMP_STACK_SQLPro') BEGIN SET @SQL = 'DROP TABLE dbo.TMP_STACK_SQLPro' EXEC (@SQL) END GO

Voici maintenant comment utiliser cette procédure à traver un exemple...

CREATE TABLE dbo.FAMILLE (FAM_ID INTEGER, FAM_LIB VARCHAR(16), FAM_PERE INTEGER) GO INSERT INTO dbo.FAMILLE (FAM_ID, FAM_LIB, FAM_PERE) VALUES (0, 'Transport', NULL) INSERT INTO dbo.FAMILLE (FAM_ID, FAM_LIB, FAM_PERE) VALUES (1, 'Terrestre', 0) INSERT INTO dbo.FAMILLE (FAM_ID, FAM_LIB, FAM_PERE) VALUES (2, 'Marin', 0) INSERT INTO dbo.FAMILLE (FAM_ID, FAM_LIB, FAM_PERE) VALUES (3, 'Aérien', 0) INSERT INTO dbo.FAMILLE (FAM_ID, FAM_LIB, FAM_PERE) VALUES (4, 'Voiture', 1)

Page 63: Faq SQL Server

SQL Server - La FAQ

- 63 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

INSERT INTO dbo.FAMILLE (FAM_ID, FAM_LIB, FAM_PERE) VALUES (5, 'Camion', 1) INSERT INTO dbo.FAMILLE (FAM_ID, FAM_LIB, FAM_PERE) VALUES (6, 'Moto', 1) INSERT INTO dbo.FAMILLE (FAM_ID, FAM_LIB, FAM_PERE) VALUES (7, 'Vélo', 1) INSERT INTO dbo.FAMILLE (FAM_ID, FAM_LIB, FAM_PERE) VALUES (8, 'Hélico', 3) INSERT INTO dbo.FAMILLE (FAM_ID, FAM_LIB, FAM_PERE) VALUES (9, 'Avion', 3) INSERT INTO dbo.FAMILLE (FAM_ID, FAM_LIB, FAM_PERE) VALUES (10, 'ULM', 3) INSERT INTO dbo.FAMILLE (FAM_ID, FAM_LIB, FAM_PERE) VALUES (11, 'Fusée', 3) INSERT INTO dbo.FAMILLE (FAM_ID, FAM_LIB, FAM_PERE) VALUES (12, 'Parachute', 3) INSERT INTO dbo.FAMILLE (FAM_ID, FAM_LIB, FAM_PERE) VALUES (13, 'Planeur', 3) INSERT INTO dbo.FAMILLE (FAM_ID, FAM_LIB, FAM_PERE) VALUES (14, 'Voilier', 2) INSERT INTO dbo.FAMILLE (FAM_ID, FAM_LIB, FAM_PERE) VALUES (15, 'Paquebot', 2) INSERT INTO dbo.FAMILLE (FAM_ID, FAM_LIB, FAM_PERE) VALUES (16, 'Planche à voile', 2) INSERT INTO dbo.FAMILLE (FAM_ID, FAM_LIB, FAM_PERE) VALUES (17, 'Trail', 6) INSERT INTO dbo.FAMILLE (FAM_ID, FAM_LIB, FAM_PERE) VALUES (18, 'Side-car', 6) INSERT INTO dbo.FAMILLE (FAM_ID, FAM_LIB, FAM_PERE) VALUES (19, 'Civil', 9) INSERT INTO dbo.FAMILLE (FAM_ID, FAM_LIB, FAM_PERE) VALUES (20, 'Tourisme', 9) INSERT INTO dbo.FAMILLE (FAM_ID, FAM_LIB, FAM_PERE) VALUES (21, 'Militaire', 9) GO /****************************************************************************** -- transformation du mode auto référence en mode intervallaire ******************************************************************************/ -- modification de la table d'origine pour ajout des bornes gauches et droite : ALTER TABLE dbo.FAMILLE ADD FAM_BG INT; ALTER TABLE dbo.FAMILLE ADD FAM_BD INT; GO -- exécution de la transformation EXEC dbo.P_DERECURSIVE_TREE 'dbo', 'FAMILLE', 'FAM_ID', 'FAM_PERE', 'FAM_BG', 'FAM_BD' GO -- indexation CREATE INDEX X_FAM_RECURINTERVAL ON dbo.FAMILLE (FAM_BG, FAM_BD) WITH FILLFACTOR = 90; /****************************************************************************** -- ajout du niveau ******************************************************************************/ -- modification de la table d'origine pour ajout du niveau : ALTER TABLE dbo.FAMILLE ADD FAM_NIVEAU INT; GO -- mise à jour du niveau : UPDATE dbo.FAMILLE SET FAM_NIVEAU = N FROM dbo.FAMILLE AS F INNER JOIN (SELECT *, (SELECT COUNT(*) FROM dbo.FAMILLE AS Tin WHERE Tin.FAM_BG < Tout.FAM_BG AND Tin.FAM_BD > Tout.FAM_BD) AS N FROM dbo.FAMILLE AS Tout) AS FN ON F.FAM_ID = FN.FAM_ID; -- vérification : SELECT * FROM dbo.FAMILLE;

Page 64: Faq SQL Server

SQL Server - La FAQ

- 64 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

CQFD !

Comment récupérer par la suite la valeur du ROWCOUNT correspondant au réglageet non @@ROWCOUNT qui correspond au nombre d'élément réellement traités ?

Auteurs : Frédéric Brouard ,

SET ROWCOUNT 3 CREATE TABLE #T (OPT NVARCHAR(128), VAL SQL_VARIANT);INSERT INTO #T EXEC ('DBCC USEROPTIONS');SELECT VAL FROM #T WHERE OPT = 'rowcount'; VAL--------------------3

Cependant à partir de 2005 l'utilisation de TOP n ne pose pas de problème vu que vous pouvez faire un TOP @N

Page 65: Faq SQL Server

SQL Server - La FAQ

- 65 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

Sommaire > Trucs et Astuces en T-SQL > Validation des données

Comment vérifier qu'une valeur entrée est une date valide ?

Auteurs : Wolo Laurent ,

Pour vérifier qu'une valeur entrée est une date, nous utilisons la fonction IsDate Exemple :

DECLARE @datestring varchar(8)SET @datestring = '12/21/98'SELECT ISDATE(@datestring)

Comment vérifier si la valeur entrée est numérique ?

Auteurs : Wolo Laurent ,

Pour vérifier qu'une valeur entrée est numerique, nous utilisons la fonction IsNumericExemple :Cet exemple renvoie 1 car la colonne zip comprend des valeurs numériques valides.

USE pubsSELECT ISNUMERIC(zip) FROM authorsGO

Est-il possible d'annuler une mise à jour dans une table ?

Auteurs : Frédéric Brouard ,

Si vous n'avez pas la moindre sauvegarde complète et si vous n'êtes pas dans un mode de recouvrement de type FULLc'est impossible.

Si vous avez fait une sauvegarde complète et êtes dans le mode de recouvrement de type FULL, c'est possible.

Pour cela il vous faut :

• notez l'heure de survenance de l'incident• placez la base en mode utilisateur unique (ALTER DATABASE ... SET SINGLE USER WITH ROLLBACK

IMMEDIATE)• sauvegarder le journal des trannsactions• restaurer la complète en mode NORECOVERY• restaurer le JT en mode RECOVERY avec un STOPAT calculé sur l'heure de survenance de l'incident moins 1

minutes.

La seul chose que vous pouvez faire si la ma noeuvre ci dessus est impossible, c'est d'utiliser un outil comme log explorerde Lumigent ou encore celui de Redgate Software pour "voir" le journal de transaction. Mais pour des raisons deparadoxe temporel il est strictement impossible d'annuler un transaction finalisée.

Ce sont des choses qu'il faut prévoir AVANT !

Page 66: Faq SQL Server

SQL Server - La FAQ

- 66 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

N'oubliez jamais que les données sont un patrimoine important de l'entreprise... Dans le service informatique, lesdonnées sont le capital LE PLUS IMPORTANT... ce que les informaticiens ont tendance à oublier !

Comment annuler une transaction dès la première erreur ?

Auteurs : maitrebn ,

En mettant

SET XACT_ABORT ON

lien : Sur MSDN

Quelques requêtes SQL Server pour connaître la qualité de vos index

Auteurs : Frédéric Brouard ,

Voici quelques requêtes qui vous permettrons de noter la qualité de vos index, mais aussi d'effacer ceux inutilisés.

1. Index faiblement utilisésselect OBJECT_NAME(IUS.object_id), I.name, IUS.user_seeks, IUS.user_scans, IUS.user_lookups, IUS.user_updates, IUS.user_seeks + IUS.user_scans + IUS.user_lookups AS Total_use, T.user_seeks + T.user_scans + T.user_lookups AS Table_use, (CAST(IUS.user_seeks + IUS.user_scans + IUS.user_lookups AS FLOAT) / NULLIF(CAST(T.user_seeks + T.user_scans + T.user_lookups AS FLOAT), 0)) * 100 AS efficacite_percent from sys.dm_db_index_usage_stats AS IUS INNER JOIN sys.indexes AS I ON IUS.object_id = I.object_id AND IUS.index_id = I.index_id INNER JOIN sys.dm_db_index_usage_stats AS T ON IUS.object_id = T.object_id AND T.index_id IN (0, 1) where IUS.database_id = DB_ID() AND I.name NOT IN (SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS) ORDER BY efficacite_percent

Cette requête mesure l'efficacité d'un index par rapport à l'utilisation de la table et donne un pourcentage. plus cepourcentage est élevé, et plus cet index est utilisé au détriment de la table.

Les index dont la mesure d'efficacité tend vers zéro sont à supprimer.

A noter les index sous-jacents aux contraintes SQL (PRIMARY KEY et UNIQUE) ne sont pas scrutés.

Cette requête n'a d'intérêt que sur un serveur en exploitation n'ayant pas été récemmentarrêté.

2. Cette requête génère un script SQL de suppression des index inutilesselect 'DROP INDEX [' + I.name +'] ON [' + SCHEMA_NAME(o.schema_id) + '].['+ OBJECT_NAME(IUS.object_id) +'];' from sys.dm_db_index_usage_stats AS IUS INNER JOIN sys.objects AS o

Page 67: Faq SQL Server

SQL Server - La FAQ

- 67 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

2. Cette requête génère un script SQL de suppression des index inutiles ON IUS.object_id = o.object_id INNER JOIN sys.indexes AS I ON IUS.object_id = I.object_id AND IUS.index_id = I.index_id where database_id = DB_ID() AND user_seeks + user_scans + user_lookups = 0 AND I.name NOT IN (SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS)

Cette requête permet de générer un script de suppression des index inutilisés. De la même façon cette requête ne prendspas en compte les index sous-jacents aux contraintes (clefs primaires et unicité).

Cette requête n'a d'intérêt que sur un serveur en exploitation n'ayant pas été récemmentarrêté.

3. Contraintes d'intégrité non indexéesWITH T_IDX AS (SELECT TABLE_SCHEMA, TABLE_NAME, i.name AS INDEX_NAME, c.name AS COLUMN_NAME, key_ordinal AS ORDINAL_POSITION FROM sys.indexes AS i INNER JOIN sys.objects AS o ON i.object_id = o.object_id INNER JOIN sys.schemas AS s ON o.schema_id = s.schema_id INNER JOIN INFORMATION_SCHEMA.TABLES AS T ON s.name = T.TABLE_SCHEMA AND o.name = TABLE_NAME INNER JOIN sys.index_columns AS ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id INNER JOIN sys.columns AS c ON i.object_id = c.object_id AND ic.column_id = c.column_id WHERE is_included_column = 0), T_CFK AS (SELECT TC.TABLE_SCHEMA, TC.TABLE_NAME, TC.CONSTRAINT_NAME, COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU ON TC.TABLE_SCHEMA = KCU.TABLE_SCHEMA AND TC.TABLE_NAME = KCU.TABLE_NAME AND TC.CONSTRAINT_NAME = KCU.CONSTRAINT_NAME WHERE CONSTRAINT_TYPE = 'FOREIGN KEY') SELECT T_CFK.TABLE_SCHEMA, T_CFK.TABLE_NAME, T_CFK.CONSTRAINT_NAME FROM T_CFK EXCEPT SELECT T_CFK.TABLE_SCHEMA, T_CFK.TABLE_NAME, T_CFK.CONSTRAINT_NAME FROM T_IDX INNER JOIN T_CFK ON T_IDX.TABLE_SCHEMA = T_CFK.TABLE_SCHEMA AND T_IDX.TABLE_NAME = T_CFK.TABLE_NAME AND T_IDX.COLUMN_NAME = T_CFK.COLUMN_NAME WHERE (SELECT COUNT(*) FROM T_IDX AS X WHERE X.TABLE_SCHEMA = T_CFK.TABLE_SCHEMA AND X.TABLE_NAME = T_CFK.TABLE_NAME AND X.COLUMN_NAME = T_CFK.COLUMN_NAME GROUP BY INDEX_NAME) = (SELECT COUNT(*) FROM T_IDX AS K WHERE K.TABLE_SCHEMA = T_CFK.TABLE_SCHEMA AND K.TABLE_NAME = T_CFK.TABLE_NAME AND K.COLUMN_NAME = T_CFK.COLUMN_NAME GROUP BY INDEX_NAME);

Page 68: Faq SQL Server

SQL Server - La FAQ

- 68 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

Cette requête donne les contrainte d'intégrité référentielles n'ayant pas d'index correspondant (quelque soit l'ordredes colonnes).

Page 69: Faq SQL Server

SQL Server - La FAQ

- 69 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

Sommaire > Trucs et Astuces en T-SQL > Programmation des bases de données

Comment désactiver et réactiver un déclencheur ?

Auteurs : Wolo Laurent ,

MS SQL Serveur, à partir de la version 2000, prévoit une option dans l'instructionALTER TABLE qui permet de désactiver et réactiver un déclencheur.Exemple :L'exemple suivant utilise l'option DISABLE TRIGGER de l'instruction ALTER TABLE pourdésactiver le déclencheur et permettre une insertion qui devrait normalement entraîner une violation du déclencheur.Le déclencheur est ensuite réactivé à l'aide de l'option ENABLE TRIGGER.

CREATE TABLE trig_example (id INT, name VARCHAR(10),salary MONEY)go-- Creation du déclencheurCREATE TRIGGER trig1 ON trig_example FOR INSERTas IF (SELECT COUNT(*) FROM INSERTEDWHERE salary > 100000) > 0BEGINprint "TRIG1 Error: Vous tentez d'inserer un salaire > $100,000"ROLLBACK TRANSACTIONENDGO-- Tentative d'insertion d'une valeur qui viole la contrainte.INSERT INTO trig_example VALUES (1,'Pat Smith',100001)GO-- Nous allons maintenant désactiver le déclencheur.ALTER TABLE trig_example DISABLE TRIGGER trig1GO-- Nous allons inserer une valeur qui normalement viole le déclencheurINSERT INTO trig_example VALUES (2,'Chuck Jones',100001)GO-- Réactivation du déclencheurALTER TABLE trig_example ENABLE TRIGGER trig1GO-- Et l'on teste si notre déclencheur est réactivé.INSERT INTO trig_example VALUES (3,'Mary Booth',100001)GO

Comment désactiver et réactiver une contrainte ?

Auteurs : Wolo Laurent ,

MS SQL Serveur, à partir de la version 2000, prévoit une option dans l'instructionALTER TABLE qui permet de désactiver et réactiver un déclencheur.Exemple :L'exemple suivant désactive la contrainte définissant les salaires pouvant être inclusdans les données. L'option WITH NOCHECK CONSTRAINT est utilisée avec ALTER TABLE pourdésactiver la contrainte et permettre une insertion qui devrait normalement entraînerune violation de la contrainte. WITH CHECK CONSTRAINT réactive la contrainte.

CREATE TABLE cnst_example (id INT NOT NULL, name VARCHAR(10) NOT NULL,

Page 70: Faq SQL Server

SQL Server - La FAQ

- 70 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

salary MONEY NOT NULL CONSTRAINT salary_cap CHECK (salary < 100000))-- Nous commençons par inserer deux lignesINSERT INTO cnst_example VALUES (1,'Joe Brown',65000)INSERT INTO cnst_example VALUES (2,'Mary Smith',75000)

-- Ensuite, nous tentons de violer notre contrainte checkINSERT INTO cnst_example VALUES (3,'Pat Jones',105000)-- Nous désactivons la contrainte puis nous relançonsALTER TABLE cnst_example NOCHECK CONSTRAINT salary_capINSERT INTO cnst_example VALUES (3,'Pat Jones',105000)-- Nous réactivons notre contrainte puis violant la requête.ALTER TABLE cnst_example CHECK CONSTRAINT salary_capINSERT INTO cnst_example VALUES (4,'Eric James',110000)

Comment tester qu'une colonne a été modifiée dans un trigger Insert ou Update ?

Auteurs : Wolo Laurent ,

Dans un trigger Insert ou Update uniquement, vous pouvez faire usage,de la clause IF UPDATE(Colonne1) pour tester si une colone a été modifié par un insert ou un update.Noter que vous pouvez étendre la construction sur plusieurs colonnes en utilisant des opérateurs AND,ORExemple :

--Soit une table T_Table dont la définition est la suivante:CREATE TABLE T_TABLE1(TAB_ID INT NOT NULL PRIMARY KEY,TAB_VAL NUMERIC(32) NOT NULL)GO--Nous initialisons la tableINSERT INTO T_TABLE1 VALUES(1,500)INSERT INTO T_TABLE1 VALUES(2,1500)INSERT INTO T_TABLE1 VALUES(3,2000)INSERT INTO T_TABLE1 VALUES(4,1800)GO--Supposant que nous vonlons interdire l'ajout et la modification des valeurs dans cette table--Nous créons un déclencheur a cet effet.CREATE TRIGGER TG_NO_ADD_UPDATE ON T_TABLE1FOR INSERT,UPDATEASIF UPDATE(TAB_ID)RAISERROR ('Interdiction formelle d''ajouter ou modifier les données de cette tables', 16, 10)go--Tentative d'ajout d'une ligneINSERT INTO T_TABLE1 VALUES(5,600)GO--Cette instruction est refoulée !!!

Comment récuperer la date système dans une fonction utilisateur ?

Auteurs : Fabien Celaia ,

SQL server interdit l'utilisation de la fonction getdate() dans une fonction utilisateur.Pour contourner cette dificulté,nous créons une vue qui renvoie la date courante

Page 71: Faq SQL Server

SQL Server - La FAQ

- 71 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

CREATE VIEW V_DateHeure_Courante AS SELECT CURRENT_TIMESTAMP AS DateHeure_Courante

Sélectionner cette date dans votre fonction.

SELECT DateHeure_Courante FROM V_DateHeure_Courante

Comment débugger une procédure stockée ?

Auteurs : Wolo Laurent ,

Dans l'analyseur de requête, ouvrir une connexion sur le serveur où se trouve la procédure et executer :

exec sp_sdidebug 'legacy_on'

Fermer la fenêtre de droite pour conserver la même connexion, puis dans l'explorateur d'objet, faire clic droit sur laprocédure stockée puis Débogage

Comment savoir si un ordre SQL s'est bien déroulé ?

Auteurs : Fabien Celaia ,

En interrogeant la variable globale @@error, directement après l'appel de la requête : 0=succès, sinon no d'erreur

Comment retrouver le libellé d'un message d'erreur par rapport à son n° ?

Auteurs : Fabien Celaia ,

SELECT description FROM master..sysmessages WHERE langid=@@langid AND error= VotreNoDErreur

Comment requêter sur 2 tables de deux bases différentes ?

Auteurs : Fabien Celaia ,

Il y a de nombreuses manières plus ou moins implicites de déterminer une table

• NomDeTable• NomDuSchema.NomDeTable• NomDeLaBase.NomDuSchema.NomDeTable• NomDeLaBase..NomDeLaTable• NomDuServeurNomDeLaBase.NomDuSchema.NomDeTable

Si l'on souhaite, dans le cas extrême, lier 2 tables de 2 bases distinctes, situées chacune sur un serveur distinct, il faudradonc utiliser la nomenclature complète, en prenant soin au préalable de déterminer le serveur distant/lié

Page 72: Faq SQL Server

SQL Server - La FAQ

- 72 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

ExempleSELECT P.Nom, P.Prenom, L.NomLocaliteFROM Personnes P INNER JOIN ServeurDistant.BaseDistante..Localites LON P.CodeLocalite=L.IDLocalite

Comment faire une jointure référentielle ?

Auteurs : Frédéric Brouard ,

Cette fonction permet de réaliser la jointure d'une table fille avec sa table mère liée par l'intégrité référentielle.

CREATE FUNCTION dbo.F_SCRIPT_REF_JOIN (@SHEMA_MERE SYSNAME, @TABLE_MERE SYSNAME, @ALIAS_LEFT SYSNAME, @SHEMA_FILLE SYSNAME, @TABLE_FILLE SYSNAME, @ALIAS_RIGHT SYSNAME) RETURNS VARCHAR(max) AS /****************************************************************************** * fonction de calculs de jointure référentielle * ******************************************************************************* * Fred. Brouard - http://SQLPro.developpez.com - www.sqlspot.com - 2009-04-10 * ******************************************************************************* * Cette fonction calcule la jointure référentielle entre deux tables, l'une * * mère l'autre fille * ******************************************************************************/ BEGIN DECLARE @OUT VARCHAR(max); SET @OUT = ''; SELECT @OUT = @OUT + @ALIAS_LEFT +'.' + COL_MERE +' = ' + @ALIAS_RIGHT + '.' + COL_FILLE + ' AND ' FROM (SELECT KCU_PRIMARY.COLUMN_NAME AS COL_MERE, KCU_FOREIGN.COLUMN_NAME AS COL_FILLE FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC_PRIMARY ON RC.UNIQUE_CONSTRAINT_SCHEMA = TC_PRIMARY.CONSTRAINT_SCHEMA AND RC.UNIQUE_CONSTRAINT_NAME = TC_PRIMARY.CONSTRAINT_NAME INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC_FOREIGN ON RC.CONSTRAINT_SCHEMA = TC_FOREIGN.CONSTRAINT_SCHEMA AND RC.CONSTRAINT_NAME = TC_FOREIGN.CONSTRAINT_NAME INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU_PRIMARY ON TC_PRIMARY.CONSTRAINT_SCHEMA = KCU_PRIMARY.CONSTRAINT_SCHEMA AND TC_PRIMARY.CONSTRAINT_NAME = KCU_PRIMARY.CONSTRAINT_NAME INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU_FOREIGN ON TC_FOREIGN.CONSTRAINT_SCHEMA = KCU_FOREIGN.CONSTRAINT_SCHEMA AND TC_FOREIGN.CONSTRAINT_NAME = KCU_FOREIGN.CONSTRAINT_NAME WHERE TC_PRIMARY.TABLE_SCHEMA = @SHEMA_MERE AND TC_PRIMARY.TABLE_NAME = @TABLE_MERE AND TC_FOREIGN.TABLE_SCHEMA = @SHEMA_FILLE AND TC_FOREIGN.TABLE_NAME = @TABLE_FILLE AND KCU_PRIMARY.ORDINAL_POSITION = KCU_FOREIGN.ORDINAL_POSITION ) AS T; IF LEN(@OUT) > 4 SET @OUT = SUBSTRING(@OUT, 1, LEN(@OUT) - 4); RETURN @OUT; END

Page 73: Faq SQL Server

SQL Server - La FAQ

- 73 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

GO

Comment faire une auto jointure ?

Auteurs : Frédéric Brouard ,

Il s'agit de joindre la table sur un clone de cette même table (par exemple avec un des pseudo table inserted ou deleted)c'est à dire de clef à clef.

CREATE FUNCTION dbo.F_SCRIPT_SELF_JOIN (@SHEMA SYSNAME, @TABLE SYSNAME, @ALIAS_LEFT SYSNAME, @ALIAS_RIGHT SYSNAME) RETURNS VARCHAR(max) AS /****************************************************************************** * fonction de calcul d'auto jointure * ******************************************************************************* * Fred. Brouard - http://SQLPro.developpez.com - www.sqlspot.com - 2009-04-10 * ******************************************************************************* * Cette fonction calcule la jointure naturelle de deux tables, * ******************************************************************************/ BEGIN DECLARE @OUT VARCHAR(max); SET @OUT = ''; SELECT @OUT = @OUT + @ALIAS_LEFT +'.' + COLUMN_NAME +' = ' + @ALIAS_RIGHT + '.' + COLUMN_NAME + ' AND ' FROM (SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC ON KCU.CONSTRAINT_SCHEMA = TC.CONSTRAINT_SCHEMA AND KCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME WHERE TC.TABLE_SCHEMA = @SHEMA AND TC.TABLE_NAME = @TABLE AND CONSTRAINT_TYPE = 'PRIMARY KEY') AS T; IF LEN(@OUT) > 4 SET @OUT = SUBSTRING(@OUT, 1, LEN(@OUT) - 4); RETURN @OUT; END GO

Comment faire une jointure naturelle ?

Auteurs : Frédéric Brouard ,

Effectuer la jointure naturelle, c'est joindre les deux tables sur les colonnes ayant même nom. Rappelons que dans unsystème d'information, les informations doivent avoir un nom unique (norme AFNOR).

CREATE FUNCTION dbo.F_SCRIPT_NATURAL_JOIN (@SHEMA_LEFT SYSNAME, @TABLE_LEFT SYSNAME, @ALIAS_LEFT SYSNAME, @SHEMA_RIGHT SYSNAME, @TABLE_RIGHT SYSNAME, @ALIAS_RIGHT SYSNAME) RETURNS VARCHAR(max) AS /****************************************************************************** * fonction de calcul de jointure naturelle * ******************************************************************************* * Fred. Brouard - http://SQLPro.developpez.com - www.sqlspot.com - 2009-04-10 * ******************************************************************************* * Cette fonction calcule la jointure naturelle de deux tables, * ******************************************************************************/ BEGIN

Page 74: Faq SQL Server

SQL Server - La FAQ

- 74 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

DECLARE @OUT VARCHAR(max); SET @OUT = ''; SELECT @OUT = @OUT + @ALIAS_LEFT +'.' + COLUMN_NAME +' = ' + @ALIAS_RIGHT + '.' + COLUMN_NAME + ' AND ' FROM (SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @SHEMA_LEFT AND TABLE_NAME = @TABLE_LEFT INTERSECT SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @SHEMA_RIGHT AND TABLE_NAME = @TABLE_RIGHT) AS T; IF LEN(@OUT) > 4 SET @OUT = SUBSTRING(@OUT, 1, LEN(@OUT) - 4); RETURN @OUT; END GO

Page 75: Faq SQL Server

SQL Server - La FAQ

- 75 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

Sommaire > Trucs et Astuces en T-SQL > Champs auto-incrémentés

Comment insérer une valeur implicite dans un champs auto-incrémenté ?

Auteurs : Wolo Laurent ,

SET IDENTITY_INSERT Autorise l'insertion de valeurs explicites dans la colonne d'identité d'une table. Exemple :

SET IDENTITY_INSERT products ONGOINSERT INTO products (id, product)VALUES(3, 'garden shovel').GOSET IDENTITY_INSERT product OFFGO

Cette façon de faire va à l'encontre du comportement même de l'identity et ne devrait êtreutilisée qu'exceptionnellement.

Comment connaître la valeur récente inserée dans un champs auto-incrémenté ?

Auteurs : Wolo Laurent ,

Il suffit de consulter la valeur de la variable de sessions @@IDENTITY juste après l'insertion, faire :

Select @@Identity as Dernière_Valeur_AutoIncrémenté

Utiliser la fonction IDENT_CURRENT pour Renvoie la dernière valeur d'identité généréepour une table spécifiée dans n'importe quelles sessions et portée.

SELECT IDENT_CURRENT('t_produit')

Comment remettre à zéro la valeur d'un compteur autoincrémenté ?

Auteurs : Wolo Laurent ,

Vous pouvez supprimer la table puis la recréer.Mais, je préfère supprimer les données de la table puis redéfinir la valeur de l'auto-incrément par :

DBCC CHECKIDENT ('MaTable', RESEED, 1)

Page 76: Faq SQL Server

SQL Server - La FAQ

- 76 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

Sommaire > Utilisation des utilitaires

Comment savoir si l'exécution d'un utilitaire (bcp, isql, osql) s'est bien déroulé ?

Auteurs : Fabien Celaia ,

En interrogeant la variable système %ERRORLEVEL%, directement après l'appel de l'exécutable. 0 = succès, sinon 1

Comment faire pour lire le journal de transaction ?

Auteurs : Fabien Celaia ,

use MaBaseGOSELECT * FROM ::fn_dblog(null, null)GO

ou

DBCC LOG('MaBase')

ou encore via d'autres outils plus conviviaux mais payants (ex: Log Explorer de Lumigent)

Comment importer des données de Excel vers SQL Server

Auteurs : Rudi Bruchez ,

Microsoft a rédigé un document listant plusieurs solutions

lien : Document Microsoft

Que deviennent mes jobs DTS avec Microsoft SQL Server 2005 ?

Auteurs : Fabien Celaia ,

La base msdb, contenant tous les jobs, est reprise telle quelle lors de la migration.

Compte tenu que le workflow a été totalement revu, il est vivement conseillé de réécrire tous les jobs DTS en packageSSIS.

Comment savoir si une transaction est restée ouverte dans ma base ?

Auteurs : Fabien Celaia ,

Grâce à la commande

dbcc opentran

Page 77: Faq SQL Server

SQL Server - La FAQ

- 77 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

Les symptômes d'une transaction restée ouverte ou d'une réplication mal calibrée sont une croissance excessive dujournal de transactions de la base.

À quoi sert Service Broker ?

Auteurs : Frédéric Brouard ,

L'objet de Service Broker, intégré à partir de SQL Server 2005, est de fournir un outil de messagerie de base de donnéespermettant de gérer des flux de données entre serveurs SQL de manière asynchrone, sérialisé et transactionnés.

L'utilisation de Service Broker est assez vaste et repose sur le principe des bases de données distribuées...

Au niveau politique, le but de Service Broker est de replacer le PC au centre de l'entreprise. Les serveurs ayant tendanceà grossir tellement que le mot PC (Personal Computer) devient obsolète et les serveurs d'aujourd'hui ressemble de plusen plus aux mainframes d'antan.

Au niveau technique, Service Broker est constitué d'un ensemble d'outils basé sur un principe de Service HTTP et defiles d'attente de message. On aura compris que Service Broker permet de véhiculer des informations entres serveursSQL quelque soit la distance (sur la couche http d'Internet).

Quelques exemples :• Informatique départementalisée : un serveur de base de données par services (RH, comptabilité, commercial,

production...) communiquant leurs informations communes via Service Broker.• Répartition de charge, lissage de traitements : une batterie de serveurs SQL consomment des messages et les

traitent.• Fiabilisation de système : chaque machine de production (chaîne de fabrication de vaccins humains) est

doté d'un serveur SQL qui empile ses message et les envois à un serveur central pour consolidation. En casd'indisponibilité du serveur cible, comme en cas de panne de réseau, le système continu à produire en touteindépendance.

L'aspect asynchrone se traduit par le fait que le message est placé en file d'attente, ce qui permet au programme decontinuer son travail sans attendre la réponse et évite ainsi les goulets d'étranglement. En fait le message sera traité parService Broker qui assure un véritable service de messagerie, avec la sécurité en plus !

Exemple d'utilisation du Service Broker

Auteurs : Frédéric Brouard ,

Voyons comment cela fonctionne avec un simple petit exemple que vous pouvez reproduire chez vous...

/******************************************************************** * exemple basique du "service broker" (base de données distribuées) * * Frédéric Brouard - SQLPro - http://www.sqlspot.com - 2009-02-12 * * * * un échange de message au sein de la même base pour montrer * * l'aspect transactionnel et asynchrone de la chose * ********************************************************************/ /******************************************************* -- ETAPE n°0 : création de notre base d'essais *******************************************************/ USE master; GO

Page 78: Faq SQL Server

SQL Server - La FAQ

- 78 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

IF EXISTS (SELECT * FROM sys.databases WHERE name = 'TEST_SB_1') DROP DATABASE TEST_SB_1; GO CREATE DATABASE TEST_SB_1; GO USE TEST_SB_1; GO /******************************************************* -- ETAPE n°1 : mise en place des objets de travail *******************************************************/ -- création des files d'attentes CREATE QUEUE Q_1; CREATE QUEUE Q_2; -- création des services et initiation de la conversation CREATE SERVICE SRV_1 ON QUEUE Q_1 ([DEFAULT]); CREATE SERVICE SRV_2 ON QUEUE Q_2 ([DEFAULT]); -- quelques options : -- AUTHORIZATION owner_name :: permet de créer le service pour un autre user SQL -- ( contract_name | [DEFAULT] [ ,...n ] ) :: permet de définir des contrats associés au service /********************************************* -- ETAPE n°2 : expédition *********************************************/ -- envoie d'un message identifié par un GUID DECLARE @UID UNIQUEIDENTIFIER; BEGIN DIALOG @UID FROM SERVICE SRV_1 TO SERVICE 'SRV_2'; SEND ON CONVERSATION @UID ('Bonjour monde'); -- message lancé -- interrogation de la file d'attente côté reception (en fait une table d'un type particulier) SELECT * FROM Q_2; -- ? Q_2 est vide... pourquoi ? -- constatons que Q_1 est aussi vide SELECT * FROM Q_1; -- ou le message est-il bloqué ? SELECT * FROM sys.transmission_queue; -- le message est là, mais ... SELECT transmission_status FROM sys.transmission_queue; --=> Par défaut on ne peut pas transmettre en clair ! Il faut crypter -- création d'une clef de cryptage pour la base CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'P@ssw0rd!'; -- envoi d'un 2eme message DECLARE @UID UNIQUEIDENTIFIER; BEGIN DIALOG @UID FROM SERVICE SRV_1 TO SERVICE 'SRV_2';

Page 79: Faq SQL Server

SQL Server - La FAQ

- 79 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

-- quelques options : -- LIFETIME = <durée en sec> par défaut 2 milliards de secondes (en fait maxint, soit 68 ans) -- WITH ENCRYPTION = { ON | OFF } par défaut ON SEND ON CONVERSATION @UID ('Bonjour monde 2'); -- 2eme message envoyé -- pour mettre fin à la conversation -- END CONVERSATION @UID -- est-il dans la file ? SELECT * FROM Q_2; /********************************************* * ETAPE n°3 : du côté du destinataire *********************************************/ -- voyons le message DECLARE @MSG VARBINARY(MAX); DECLARE @HDL UNIQUEIDENTIFIER; -- lecture du message SELECT TOP(1) @MSG = message_body, @HDL = conversation_handle FROM Q_2; -- utilisation du message PRINT 'Le message transmis est : ' + CAST (@MSG AS VARCHAR(MAX)); -- le message est toujours dans la file. Il n'a pas été "dépilé" SELECT * FROM Q_2; /********************************************* => ETAPE n°4 : acquittement *********************************************/ -- consommons le message DECLARE @HDL UNIQUEIDENTIFIER; -- lecture desctructrice RECEIVE TOP(1) @HDL = conversation_handle FROM Q_2; --=> Receive : nouvel ordre Transact SQL comparable au SELECT, mais : LECTURE UNIQUE (DESTRUCTRICE) ! -- en fait dépile le message de la pile consititué par la table Q_2 ou le place dans un statut "lu", -- en fonction des paramètres de rétention définit lors de la création de la queue -- le message n'est plus dans la file. Il a été "consommé" SELECT * FROM Q_2; -- envoi de l'acquittement SEND ON CONVERSATION @HDL ('OK : Bien reçu !'); -- arrêt de la conversation côté destinataire END CONVERSATION @HDL; -- Combien de messages dans Q1 ? SELECT * FROM Q_1; --=> le message envoyé en retour et le message indiquant la fin du dialogue : -- message_type_name "EndDialog" (XML schéma du Service Broker MS) /********************************************* * ETAPE n°5 : réception de l'acquittement *********************************************/ -- lecture du message d'acquittement

Page 80: Faq SQL Server

SQL Server - La FAQ

- 80 -Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://sqlserver.developpez.com/faq/

DECLARE @MSG VARBINARY(max); DECLARE @HDL UNIQUEIDENTIFIER; RECEIVE TOP(1) @MSG = message_body, @HDL = conversation_handle FROM Q_1; -- le message est reçut et son "enveloppe" détruite -- affichage du message d'acuittement côté expéditeur PRINT 'Le message est : ' + CAST (@MSG AS VARCHAR (max)); -- fin de la conversation côté expéditeur END CONVERSATION @HDL; /********************************************* * Le service broker est-il activé ? *********************************************/ --voir l'état des bases pour SELECT name, service_broker_guid, is_broker_enabled FROM sys.databases; -- modification du service broker pour la base ALTER DATABASE TEST_SB_1 SET disable_broker; -- pour réactiver : ALTER DATABASE TEST_SB_1 SET enable_broker;

Il nous faudrait encore parler des CONTRACT, des ROUTE et de bien d'autres objets que l'on trouve dans cet outil,mais là c'est une autre affaire...