Vous êtes sur la page 1sur 80

SQL Server - La FAQ

Date de publication : 28.9.2005 Dernire mise jour : 24.5.2009

Question / rponses tout ce que vous avez toujours voulu savoir sur Microsoft SQL Server sans jamais oser le demander

Ont contribu cette FAQ :

Fabien Celaia - Morsi - Wolo Laurent - Rudi Bruchez Maitrebn - devdev - drahu - HULK - spidetra - Frdric Brouard - davidou2001 - Ylarvor - elsuket - maitrebn -

SQL Server - La FAQ

1. Consulter les informations de schma (23) ...............................................................................................................................4 2. Consulter la taille des objects de la base de donnes (4) ....................................................................................................... 17 3. Administration de la base de donnes (39) .............................................................................................................................19 3.1. Editions de SQL Serveur (5) ..........................................................................................................................................20 3.2. Utilisateurs et connexions (11) .......................................................................................................................................22 3.3. Connexions au serveur (10) ............................................................................................................................................28 3.4. Performances (2) .............................................................................................................................................................31 3.5. Sauvegardes et restauration (11) .................................................................................................................................... 34 4. Trucs et Astuces en T-SQL (44) .............................................................................................................................................39 4.1. Fonctions (11) ................................................................................................................................................................. 40 4.2. Limiter le jeu de rsultat (14) ........................................................................................................................................ 46 4.3. Validation des donnes (5) .............................................................................................................................................65 4.4. Programmation des bases de donnes (11) .................................................................................................................... 69 4.5. Champs auto-incrments (3) .........................................................................................................................................75 5. Utilisation des utilitaires (7) ....................................................................................................................................................76

-3Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

Sommaire > Consulter les informations de schma Comment obtenir la liste des tables d'une base de donne ?
Auteurs : Wolo Laurent , Fabien Celaia , Vous avez beaucoups de possibilits pour connatre la liste des tables d'une base de donnes. Nous vous recommandons d'utiliser les vues d'informations de schma.

SELECT table_name FROM information_schema.tables WHERE table_type='BASE TABLE'

Vous pouvez aussi passer par la procedure stocke sp_tables ou encore passez par les tables systmes.

SELECT name FROM sysobjects WHERE type='U'

Comment connatre la liste des colonnes d'une table ?


Auteurs : Wolo Laurent , Fabien Celaia , Comme pour la liste des bases de donnes d'un serveur, SQL Server offre trois possibilits 1-La consultation des vues d'informations de schema

SELECT COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='MA_TABLE'

2-L'utilisation de la procdure stocke sp_columns

EXEC sp_columns 'Nom_de_table'

3-L'utilisation des tables systmes.

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.usertype WHERE c.id=object_id('VotreTable') ORDER BY c.colid

4-L'utilisation de la procdure stocke sp_help

-4Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

EXEC sp_help NomTable

Comment lister l'ensemble des vues d'une base de donnes SQL Server ?
Auteurs : Wolo Laurent , La liste des vues d'une base de donnes de SQL-Server est accessible grce une requte sur les tables systmes : 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 donnes SQL Server ?
Auteurs : Wolo Laurent , La liste des fonctions dfinies par l'utilisateur de SQL-Server est accessible grce une requte sur les tables systmes : sysobjects, syscomments et sysusers.

SELECT name FROM sysobjects WHERE type='FN'

Comment lister l'ensemble des procdures stockes d'une base de donnes SQL Server ?
Auteurs : Wolo Laurent , La liste des procdures stockes de SQL-Server est accessible grce une requte sur les tables systmes : sysobjects, syscomments et sysusers.

SELECT name FROM sysobjects WHERE type='P'

On peut galement utiliser la mthode des vues d'informations de schema

SELECT * FROM INFORMATION_SCHEMA.ROUTINES

-5Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

Ou encore, utiliser la procedure stocke : sp_stored_procedures

Comment lister l'ensemble des dclencheurs d'une base de donnes SQL Server ?
Auteurs : spidetra , La liste des triggers de SQL-Server est accessible grce une requte sur les tables systmes : sysobjects, syscomments et sysusers.

SELECT o.name, o.xtype, c.text, 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'

u.name,

o.crdate

Quelle est la requte qui permet de savoir quelles colonnes d'une table servent de cl primaire ?
Auteurs : Fabien Celaia , Il existe une procdure stocke 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'

-6Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

order by table_name, ordinal_position

Comment rcuprer la valeur par dfaut d'un champs d'une table ?


Auteurs : Fabien Celaia ,
select cdefault from syscolumns where id = object_id('VotreTable') and name = 'VotreColonne'

Quel est le nombre de ligne de chacune des tables d'une base de donnes ?
Auteurs : Wolo Laurent ,
Select O.Name as Table_Name, I.Rows as Rows_Count FROM sysobjects O join sysindexes I ON O.id=I.id Where O.xtype='U'

Comment connatre le nom de la base de donnes en cours ?


Auteurs : Wolo Laurent , Fabien Celaia , Pour connatre le nom de la base de donne en cours, vous pouvez utiliser la fonction DB_NAME(). Base de donne en cours
SELECT DB_NAME() AS BASE_DE_DONNEES_EN_COURS

Comment afficher la liste des bases de donnes d'un serveur ?


Auteurs : Wolo Laurent , Vous avez trois mthodes au choix: 1- L'utilisation des vues d'informations de schema, Exemple : VUE D'INFORMATIONS DE SCHEMA
SELECT CATALOG_NAME FROM INFORMATION_SCHEMA.SCHEMATA Go

2-La consultation des tables systemes bien que non recommande pour des raisons de portabilit Exemple: TABLES SYSTEMES
USE master Go SELECT name as BaseDedonneeDuServeur FROM sysdatabases Go

-7Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

3-L'utilisation de la procedure stocke sp_databases Exemple: PROCEDURE STOCKEE SYSTEME


EXEC sp_databases go

Comment changer le type de donnes d'une colonne ?


Auteurs : Wolo Laurent , Pour changer le type de donnes d'une colonne, MS SQL Serveur fournit la clause Alter Column Exemple ferait l'affaire:

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

Vous pouvez galement proceder comme ceci: Demmarrer une transaction srialise; Crer une nouvelle table avec le nouveau type de donnes telle que souhaite; Importer les donnes 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 TRANSACTION SET TRANSACTION ISOLATION LEVEL SERIALIZABLE --Crer une table temporaire ayant mme structure que la premire CREATE 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 table IF 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 table DROP TABLE dbo.T_PERSONNE

-8Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

GO --Renommer la nouvelle table avec l'ancien nom EXECUTE sp_rename N'Tmp_T_PERSONNE', N'T_PERSONNE', 'OBJECT' GO COMMIT

Comment renommer une base de donnes ?


Auteurs : Wolo Laurent , Pour renommer une base de donnes, MS SQL Server fournit la procedure stocke sp_renamedb Exemple :

EXEC sp_renamedb('MyOldDB','MyNiewDB')

Vous pouvez galement crer une nouvelle base de donnes, importez les donnes par DTS de l'ancienne base de donnes vers la nouvelle, puis supprimer l'ancienne base de donnes.

Comment renommer une table ou un autre object de base de donnes ?


Auteurs : Wolo Laurent , Pour renommer un object d'une base de donnes, l'on peut passer par la procedure stocke 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 dsigne le nom de l'object renommer, new_name la nouvelle dsignation de l'object et et object_type l'une des valeurs du tableau ci-dessous. Valeur COLUMN BASE DE DONNEES INDEX OBJECT Description Une colonne qui doit tre renomme.. Base de donnes dfinie par l'utilisateur. Cette option est ncessaire pour renommer une base de donnes. Un index dfini par l'utilisateur. lment d'un type repris dans sysobjects. Par exemple, OBJECT peut tre utilis pour renommer les objets dont les contraintes (CHECK, FOREIGN KEY, PRIMARY/ UNIQUE KEY), des tables utilisateur, des affichages, des procdures stockes, des dclencheurs et des rgles. Type de donnes dfini par l'utilisateur ajout en excutant sp_addtype.

USERDATATYPE

Exemple : A1-Renommer une table Dans cet exemple la table customers est renomme custs.

EXEC sp_rename 'customers', 'custs'

-9Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La 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 procdure stock ?


Auteurs : Fabien Celaia , Morsi , Pour se faire plaisir

select text from dbo.syscomments, dbo.sysobjects where syscomments.id = sysobjects.id And sysobjects.xtype = 'P' AND sysobjects.name='MaProcdure'

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

sp_helptext 'MaProcdure'

Comment rcuperer un schma de base de donnes sur un serveur SQL2005 depuis une restauration d'une base de donnes en version 2000 ?
Auteurs : Wolo Laurent , Aprs restauration d'une sauvegarde d'une base de donnes SQL Serveur 2000 sur un serveur de base de donnes SQL Serveur 2005, vous ne pouvez pas acceder au schema de cette base de donnes. 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 rsoudre ce problme, il faut Changer le niveau de compatibilit EXEC sp_dbcmptlevel 'database_name', '90'; Changer le propritaire de la base de donnes sur le nouveau serveur

ALTER AUTHORIZATION ON DATABASE::database_name TO valid_login

Comment lister les contraintes de cls primaires et trangres des tables d'une base de donnes ?
Auteurs : Rudi Bruchez ,
SELECT *

- 10 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = 'matable'

Comment trouver la liste des tables dont dpend la vue ?


Auteurs : Maitrebn ,
SELECT DISTINCT NECESSAIRE.NAME FROM SYSOBJECTS AS NECESSAIRE INNER JOIN SYSDEPENDS AS DEPENDENCES ON NECESSAIRE.ID = DEPENDENCES.depid INNER JOIN SYSOBJECTS AS DEPENDANTE ON DEPENDENCES.id = DEPENDANTE.id WHERE DEPENDANTE.name='NOMDELAVUE'

Comment comparer 2 tables ?


Auteurs : Frdric Brouard , Fabien Celaia , Soit via requtage peu ais dans syscolumns (exemple pour rechercher des diffrences de type, il faudra complexifier avec outer jin et consors pour rechercher les colonnes manquantes, de trop...)

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

Soit via l'utilitaire tablediff.exe install par dfaut avec SQL Serrver 2005 dans le rpertoire COM.

Comment comparer 2 bases de donnes ?


Auteurs : Ylarvor , Automatique SQL Compare SQL Delta SQL Examiner Visual Studio for DB professional Apex SQLDiff EMS DB Comparer for SQL Server Quest Visuel Gratuit

Sybase PowerAMC

Simple Tools for MS SQL Server

- 11 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

Manuel

Script en Python ou Ruby pour gnrer les scripts des objets, et comparaison les deux rpertoires avec un outil comme winmerge

manuel : Script en Python ou Ruby : http://www.babaluga.com/doku.php/pro...on_python-ruby pour gnrer les scripts des objets, et tu compares les deux rpertoires avec un outil comme winmerge"

Comment trouver une table travers toutes les bases ?


Auteurs : Frdric Brouard , Voici une procdure 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 manire automatique


Auteurs : Frdric Brouard , Voici un ensemble de codes SQL utilisant des procdures systmes et l'agent SQL pour scruter le taux d'occupation des disques et remonter une alerte en cas de dpassement. Cration des objets dans la basez de donnes MSDB Cration des tables de suivi de l'volution de l'espace disque et de leur taux d'occupation. Notez l'utilisation du schma S_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);

- 12 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

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

Cration de la procdure de capture des donnes 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;

- 13 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La 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 journalire 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,

- 14 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La 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 sous lequel cette routine doit tourner.

Cration d'un dclencheur pour envoi par mail d'une alerte immdiate
-- 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 fixe', @body = 'Au moins un des disques que vous suivez via la procdure cyclique S_SYS.P_AUDIT_SPACE_DISK a atteint un quota d''espace disque infrieur 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

- 15 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

Dans ce code, vous devez spcifier l'un des profil mail que vous avez mis en place lors de l'activation de db_mail la place de "profile_name" de mme vous devez spcifier 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 alerts lorsque C dpasse un taux d'occupation de 70% et lorsque D dpasse un taux d'occupation de 50%.

- 16 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

Sommaire > Consulter la taille des objects de la base de donnes Comment connatre la taille occupe par une base de donnes ?
Auteurs : Wolo Laurent , Pour connattre la taille des objects d'une base de donnes, Ms SQL Server met votre disposition une procedure stocke:

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

O objname est le nom de la table dont on veut calculer la taille et updateusage un varchar(5) qui peut prendre 2 valeurs (false,true). updateusage, fix true permet MS SQL Serveur de recalculer la taille des pages de donnes. Ainsi, pour connattre la taille d'une base de donnes, on utilise la procedure sans indiquer le nom de l'object. Exemple : Pour connattre la taille de la base de donne DB_ESSAI, on :

USE DB_ESSAI GO EXEC sp_spaceused GO

Comment connatre la taille occupe par une table d'une base de donnes.
Auteurs : Wolo Laurent , Microsoft SQL server met votre disposition une procdure stocke sp_spaceused pour dterminer la taille d'une base de donnes et des tables de la base de donnes. Exemple: A. Informations sur l'espace occup par une table Cet exemple prsente la quantit d'espace allou (rserv) la table titles, l'espace utilis par les donnes, l'espace utilis par le ou les index et l'espace inutilis rserv par les objets de base de donnes.

USE pubs EXEC sp_spaceused 'titles'

B. Informations sur l'espace mis jour occup par toute une base de donnes Cet exemple rcapitule l'espace utilis dans la base de donnes courante et utilise le paramtre facultatif @updateusage.

USE pubs

- 17 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

sp_spaceused @updateusage = 'TRUE'

Comment connatre l'espace occup par les index d'une base de donnes ou d'une table ?
Auteurs : Wolo Laurent ,
USE db_essai EXEC sp_spaceused 'mon_objet'

Comment connatre la taille des fichiers mdf et ldf d'une base de donnes ?
Auteurs : Wolo Laurent , Fabien Celaia ,
use myDB GO SELECT 8 * SUM(CONVERT(DEC(15),SIZE)) as Taillemdf FROM dbo.sysfiles WHERE (status64 = 0) GO

use myDB GO SELECT 8 * SUM(CONVERT(DEC(15),SIZE)) as Tailleldf FROM dbo.sysfiles WHERE (status64 != 0) GO

Le rsultat est donn en Ko. En fait, vous avez le rsultat en nombre de page de donnes de 8Ko.

- 18 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

Sommaire > Administration de la base de donnes

- 19 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

Sommaire > Administration de la base de donnes > Editions de SQL Serveur Combien d'ditions existe-t-il pour MS SQL Server 2000 ?
Auteurs : Wolo Laurent , Editions Edition Professionnelle et Edition standard Systmes d'exploitations compatibles Windows 2003 Server Windows 2000 Server Windows 2000 DataCenter Windows 2000 Avanced Server Windows NT 4.0 Server Professional Edition Windows NT 4.0 Server Windows XP Professionelle Windows 2003 Server Windows 2000 Server Windows 2000 DataCenter Windows 2000 Avanced Server Windows 2000 Professionelle Windows NT 4.0 Server Professional Edition Windows NT 4.0 Server Windows NT 4.0 Server WorkStation Windows 98 Windows XP Professionelle Windows 2003 Server Windows 2000 Server Windows 2000 DataCenter Windows 2000 Avanced Server Windows 2000 Professionelle Windows NT 4.0 Server Professional Edition Windows NT 4.0 Server Windows NT 4.0 Server WorkStation Windows CE

Edition Personnelle

Edition Dvloppeur

Edition Windows CE

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


Auteurs : Fabien Celaia , Express Workgroup Standard Enterprise

Pour les dtails : Comparaison des fonctionnalits dans SQL Server 2005

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


Auteurs : Fabien Celaia , SQL Server 2008 Entreprise

- 20 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La 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) fonctionalits lies aux ditions

Notes de l'diteur quant aux

Comment dterminer la version de SQL Server install ?


Auteurs : Morsi ,
SELECT SERVERPROPERTY('ProductLevel') SELECT @@VERSION SELECT SERVERPROPERTY('ProductVersion')

Comment connatre le nom de l'instance de SQL Server installe ?


Auteurs : Wolo Laurent , Fabien Celaia ,
select case WHEN convert(sysname, serverproperty('InstanceName')) IS NULL THEN 'INSTANCE PAR DEFAUT' ELSE convert(sysname, serverproperty('InstanceName')) END AS INSTANCE_NAME

- 21 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

Sommaire > Administration de la base de donnes > Utilisateurs et connexions Comment connatre le nom de l'utilisateur connect au serveur?
Auteurs : Wolo Laurent , SQL Serveur fournit quatre fonctions permettants de connatre l'utilisateur connect au serveur pour la session en cours. Exemple:

DECLARE @usr char(30) SET @usr = user SELECT 'L''utilisateur courant GO --Ou SELECT 'L''utilisateur courant GO --Ou encore SELECT 'L''utilisateur courant GO --Nous n'allons pas oublier la SELECT 'L''utilisateur courant

est : ' + @usr

est : ' + SUSER_NAME()

est : ' + SESSION_USER fonction Current_user est : ' + CURRENT_USER

Comment obtenir le nombre d'utilisateurs connects une base de donnes ?


Auteurs : Wolo Laurent ,
USE MaBase GO SELECT COUNT(*) FROM master..sysprocesses WHERE dbid=db_id() GO

ou

SELECT COUNT(*) FROM master..sysprocesses WHERE dbid=db_id('MabaseDeDonne')

Pour la base courante ce sera alors :

SELECT COUNT(*) FROM master..sysprocesses WHERE dbid=db_id()

Je n'arrive pas crer un utilisateur, le systme me dit : user already exist ?


Auteurs : Wolo Laurent , Il faut supprimer l'utilisateur et le recrer:

exec sp_dropuser 'utilisateur' -- drop le user

- 22 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

exec sp_adduser 'utilateur','login' -- recre utilisateur et l'associe login

Quelle requte 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 spcifique 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 passe en paramtre * 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 ''

- 23 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La 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 inutilise' print '' end else begin /* Liste des utilisateurs */ declare @snum varchar(4) select @snum = convert(varchar(4), @i) print '' print @snum+' utilisateur(s) trouvs 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 connects 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 spcifique permettant sa recration multi-serveurs * IParm : @login (obligatoire) : l'utilisateur extraire * OParm : 0 = succs * -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 => cration */ select 'exec sp_addlogin '+ @login+ ', MotDePasse' end SELECT 'EXEC SP_DROPUSER '+@login

- 24 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La 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 particulire ?


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 donnes courante OU la base passe en paramtre * IParm : @db = Nom de la base (optionnel) * Retour : Nombre d'utilisateurs connects la base * -1 si la base passe en paramtre n'existe pas

- 25 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La 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 donnes' 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 inutilise' 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 connects sur la base '+@db+' du serveur '+ @@servername print '' end end return @i end

Comment changer temporairement un mot de passe que l'on ne connat pas ?


Auteurs : Fabien Celaia , 1) Changer de mot de passe aprs 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

- 26 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La 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 connatre la dernire 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 donnes en mode utilisateur unique ?


Auteurs : Frdric Brouard ,
ALTER DATABASE MABASE SET SINGLE USER WITH ROLLBACK IMMEDIATE

Quel est le type de connexion le plus sr ?


Auteurs : Fabien Celaia , Il y a deux types de connexion avec Micrososft SQL Server. le mode authentification Windows : il permet de laisser au systme la tche d'authentifier le client. Avantage : le mot 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 systme d'exploitation. Avantage : une distiction claire et nette entre les droits sur la base et ceux sur le systme d'exploitation.

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

- 27 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

Sommaire > Administration de la base de donnes > Connexions au serveur Comment fixer la dure d'attente de libration d'un verrou sur un object de la base de donnes ?
Auteurs : Wolo Laurent , SET LOCK_TIMEOUT permet une application de dfinir le dlai maximal pendant lequel une instruction doit attendre en cas de ressource bloque. Si l'attente d'une instruction dpasse la valeur du paramtre LOCK_TIMEOUT, l'instruction bloque est automatiquement annule, et un message d'erreur renvoy l'application. Cette valeur est fixe -1 au dbut d'une connexion.

--Fixe la valeur du lock_timeout 1,8 seconde SET LOCK_TIMEOUT 1800

Pour connatre la valeur courante, on utilise la variable @@LOCK_TIMEOUT

--Consulter la valeur du lock timeout SELECT @@LOCK_TIMEOUT AS LOCK_TIMEOUT

Je n'arrive pas me connecter une base de donnes de mon serveur depuis un programme client
Auteurs : Wolo Laurent , Si vous n'arrivez pas vous connecter une base de donnes de votre serveur, procedez comme ci-dessous. Si vous utilisez le nom de la machine comme source de donnes, vrifiez que votre rseau possde un serveur de nom de domaine. Dans le cas contraire, utilisez l'adresse IP publique de votre serveur de base de donnes. Attention, il arrive que vous vous connectez sous windows avec un utilisateur qu possde moins de droits pour modifier les donnes de la base de donnes de ce serveur. Vrifiez que vous utilisez le bon type d'autentification SQL Serveur pour votre chane de connexion Vrifiez que votre serveur ne se trouve pas derrire un serveur proxy. Vrifier que votre serveur ne se trouve pas derrire un Firewall.

Comment se connecter un serveur SQL qui se trouve derrire un proxy ?


Auteurs : Wolo Laurent , Pour se connecter un serveur SQL Serveur qui tourne derrire un serveur proxy, Ouvrez l'utilitaire Server Network Utility Dans l'onglet gnral, cochez la case enable Winsock proxy puis saisissez l'adresse du serveur proxy et son port d'coute.

Comment se connecter un serveur se trouvant derrire un pare-feu ?


Auteurs : Wolo Laurent , Pour se connecter un serveur dans ces conditions, Configurez un numero de port (1433) par dfaut puis demandez votre administrateur rseau de librer le trafique de ce port sur son firewall

- 28 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

il est dconseill d'ouvrir une brche dans le firewall si MS-SQL utilise le port par dfaut. reconfigurer le port avant tout.

Quelle procdure stocke permet de limiter le nombre de connexions simultanes ?


Auteurs : drahu , Fabien Celaia ,
sp_configure connections, n RECONFIGURE WITH OVERRIDE --n est le nombre de connexions souhaites.

Mon serveur ne dmarre pas cause du mssage : Echec d'ouverture d'une session a empch le dmarrage d'un service.
Auteurs : Wolo Laurent , Ce mssage intervient lorsque le compte configur pour dmarrer le service MSSQLSERVER choue dans le dmarrage d'une session Windows. Allez-y dans le Gestionnaire des Services, Cliquez sur le service MSSQLSERVER, puis changer le compte de dmarrage du service. NB: Il est plus simple d'utiliser le compte LocalSystem.

Comment connatre le type d'authentification installe sur le serveur ?


Auteurs : Wolo Laurent ,
select CASE WHEN 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 problme "Dlai d'attente expir" lorsqu'on tente de se connecter au serveur ?
Auteurs : Wolo Laurent , Il s'agit d'un problme li au DNS Utiliser l'adresse IP\Instance du serveur la place de NomServeur\Instance Dans la fentre de configuration IP du protocole TCP/IP de votre carte rseau, ajouter l'adresse du DNS primaire, en utilisant celui de votre contleur de domaine.

Dconnectez les utilisateurs d'une base de donnes


Auteurs : Frdric Brouard , Fabien Celaia , Cette commande, possible depuis MS-SQL2005, tue les connexions en cours (y.c. rollback) et garde l'unique connexion en cours sur la base.
ALTER DATABASE 'MaBase' SET SINGLE_USER WITH ROLLBACK IMMEDIATE

- 29 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

Pour le retour un accs 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 BEGIN Declare @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 end CLOSE Process_cur DEALLOCATE Process_cur END GO

@spid;

Comment dmarrer un serveur si la base tempdb est corrompue


Auteurs : Fabien Celaia , Dmarrez le serveur avec l'option -T3608. Ce traceflag permet de ne dmarrer le serveur qu'avec la base master. Notez cependant que sans la base tempdb, quasiment aucune procdure stocke n'est utilisable.

- 30 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

Sommaire > Administration de la base de donnes > Performances Comment rindexer une base ?
Auteurs : HULK , La gestion des index par SQL Server peut entraner la fragmentation de ceux-ci et une dgradation des performances. Si le volume d'informations de votre base volue beaucoup, il est ncessaire de rindexer votre base. Plus votre base change, plus les index perdent en efficacit, il faut donc les recrer. On peut reconstruire les index avec la commande DBCC REINDEX.

CREATE PROCEDURE REINDEXATION AS DECLARE @table_name sysname DECLARE @TSQL nvarchar(4000) DECLARE @Err int DECLARE @Mess varchar(400) SET @Mess = 'Dbut rindexation' RAISERROR(@Mess, 10, 1) WITH LOG DECLARE table_list CURSOR FAST_FORWARD FOR SELECT name FROM sysobjects WHERE type = 'u' OPEN table_list FETCH NEXT FROM table_list INTO @table_name WHILE @@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 rindexation table ' + @table_name + ' suite erreur ' + CONVERT(varchar, @Err) RAISERROR(@Mess, 16, 1) WITH LOG END FETCH NEXT FROM table_list INTO @table_name END CLOSE table_list DEALLOCATE table_list SET @Mess = 'Fin rindexation' RAISERROR(@Mess, 10, 1) WITH LOG GO

Extensions uniformes ou extensions mixtes ?


Auteurs : Frdric Brouard , SQL Server stocke les pages des fichier de donnes (tables, index, blobs...) dans des blocs de 8 pages appels "extents" (extensions en franais). Autant une page ne peut appartenir qu' un seul objet, autant une extension peut comporter des pages de diffrents objets. Est-il possible de force la mise en place d'extension ne contenant qu'un seul et mme type d'objet ? La rponse est oui, mais n'est pas sans consquences ! Les fichiers de donnes des bases MS SQL Server, sont constitus de pages de 8 Ko organises par blocs contigus de 8 appeles extensions. A l'intrieur d'une page ne figure que les information d'un seul et mme objet (ligne de table, ligne d'index ou blob). En revanche et par dfaut, une extensions peut contenir des pages abritant diffrents objets. On appelle cela une extension mixte (mixed extent). Bien entendu au sein d'une mme base, il est possible que certaines extension soient uniformes. Dans certains cas, il y aurait intrt forcer le moteur de stockage utiliser uniquement des extensions uniformes.

- 31 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

Ces cas sont rares mais intressants : le cas de la VLDB ayant essentiellement de trs grosse table ; le cas de tempdb si l'on a pens la rpartir 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 paramtrage :
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 rsultat :
file_id page_id pg_alloc ext_size object_id index_id partition_id iam_chain_type pfs_bytes ----------- ----------- ----------- ----------- ----------- ----------1 21 1 1 2105058535 0 72057594038779904 In-row data 0x6400000000000000 1 55 1 1 2105058535 0 72057594038779904 In-row data 0x6400000000000000 1 77 1 1 2105058535 0 72057594038779904 In-row data 0x6400000000000000 1 78 1 1 2105058535 0 72057594038779904 In-row data 0x6400000000000000 1 79 1 1 2105058535 0 72057594038779904 In-row data 0x6400000000000000 1 80 1 1 2105058535 0 72057594038779904 In-row data 0x6400000000000000 1 89 1 1 2105058535 0 72057594038779904 In-row data 0x6400000000000000 1 90 1 1 2105058535 0 72057594038779904 In-row data 0x6400000000000000 partition_number

---------------- -------------------- -1 1 1 1 1 1 1 1

- 32 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La 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 mmes donnes. L'une a donn lieu la description de 8 pages dans la mme extension, l'autre la description globale des 8 pages dans l'extension uniforme. Bien tester les effets de ce paramtrage, car le remde peut s'avrer dans certaines circonstances, pire que le mal. Rglage du paramtre En excutant :
DBCC TRACEON(1118);

Vous forcez la session en cours gnrer des extensions uniformes. Cela peut tre intressant par exemple si vous voulez insrer un lot important de lignes dans une table sans gnrer d'extensions mixtes. Par exemple lors de la cration d'une base de donnes, pour l'alimentation du rfrentiel.
DBCC TRACEON(1118, -1);

Vous forcez le moteur pour toutes les sessions venir gnrer des extensions uniforme.
DBCC TRACEOFF(1118) ; DBCC TRACEOFF(1118, -1) ;

Vous revenez au comportement normal du moteur de stockage.

- 33 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

Sommaire > Administration de la base de donnes > Sauvegardes et restauration Comment sauvegarder une base de donnes
Auteurs : Fabien Celaia , Via la commande backup

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

lien :

Dplacement, sauvegardes et restauration de bases sous MS-SQL Server

Comment restaurer une base de donnes depuis un fichier .bak ?


Auteurs : Fabien Celaia , Via la commande restore, en ayant au pralable supprim toutes les connexions existantes sur la base qui sera crase

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

lien :

Dplacement, sauvegardes et restauration de bases sous MS-SQL Server

Comment faire une copie de ma base de donnes ?


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 :

Dplacement, sauvegardes et restauration de bases sous MS-SQL Server

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


Auteurs : Frdric Brouard ,
SELECT DATABASEPROPERTYEX(DB_NAME(), 'Recovery')

Comment configurer une base de donnes en mode FULL RECOVERY ?


Auteurs : Frdric Brouard ,

- 34 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

ALTER DATABASE MABASE SET RECOVERY FULL

Comment connate le jeu de caractre et le tri configur sur son serveur ?


Auteurs : Fabien Celaia ,
sp_helpsort

Comment faire un export complet d'une base ( structure avec cls, procdures etc...) y.c. des donnes qui sont dans les tables.
Auteurs : Rudi Bruchez , Il y a des outils qui gnrent 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 dernire restauration d'une base ?


Auteurs : Wolo Laurent , Fabien Celaia , Rudi Bruchez , Si vous avez excut cette restauration via un job de Microsoft SQL Server, vous pouvez rechercher l'information via la base systme msdb

USE VotreBase GO SELECT destination_database_name, restore_date, b.database_name, physical_name, backup_start_date FROM 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

- 35 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La 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 plus qu' aller rechercher dans les journaux

Comment restaurer une base de donnes depuis des fichiers .mdb et .ldb ?
Auteurs : Fabien Celaia , Ces fichiers sont cex d'une base de donnes qui a t dtache d'un serveur par l'ordre sp_detache_db. Pour les rattacher votre serveur SQL, utilisez la procdure stocke 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 : lien :

Dplacement, sauvegardes et restauration de bases sous MS-SQL Server Attacher une base de donnes dont le journal de transaction est manquant

Sauvegarder toutes les bases de donnes d'un serveur d'un seul coup
Auteurs : Frdric Brouard , Voici une procdure destine oprer une sauvegarde globales de toutes les bases d'un serveur. Diffrentes options sont possible comme de sauvegarder aussi les bases systmes 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 gnrique 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 systmes) @TO_DEVICE BIT = 1, -- crer 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 donnes doivent repecter la norme ISO (pas de caractres illicites) -- dans le cas contraire prvoir 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 paramtres de la procdure 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

- 36 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

SET @FILE_EXT = REPLACE(@FILE_EXT, '.', '');

-- le rpertoire 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 -- cration du rpertoire 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 crer. 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 -- cration 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; -- gnration 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

- 37 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La 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 excut ?


Auteurs : elsuket , Une requte simple dans la base de donnes systme MSDB nous donne la rponse ... Valable sous SQL Server 2000 et ultrieur

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 Dure FROM msdb.dbo.sysdbmaintplan_history WHERE succeeded = 0 -- 0 : chec | 1 : russite -- AND start_time BETWEEN '20090907' AND '20090908' ORDER BY database_name, start_time

Il est ds lors facile de placer cette requte dans un DataSet sous Reporting Services ou dans une application WinForms pour pouvoir s'afficher l'tat des plans de maintenance qui doivent avoir lieu sur une instance de SQL Server.

- 38 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

Sommaire > Trucs et Astuces en T-SQL

- 39 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La 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 chane de caractre en T-SQL ?


Auteurs : Fabien Celaia , Utiliser la fonction encrypt()

Comment comparer une chane encrypte un paramtre


Auteurs : Fabien Celaia ,
select * from MaTable where ChampMotDePasseCrypte=encrypt(@MaChaineNonCryptee)

Comment tester si deux dates sont dans la mme semaine ?


Auteurs : Fabien Celaia , Vous pouvez utiliser la fonction DatePart en usant de la commande SET DATEFIRST pour controller le premier jour de la semaine.

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

Comment connatre le nom de l'application qui a dmarr la session ?


Auteurs : Wolo Laurent , APP_NAME renvoie le nom de l'application pour la session en cours si un nom a t dfini par l'application. Exemple : L'exemple suivant vrifie si l'application cliente qui a initi ce traitement est une session de l'Analyseur de requtes SQL.

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

- 40 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

PRINT 'ce processus n'a pas t dmarr par une cession de Query Analyzer.'

Comment connatre le nom de la station de travail ?


Auteurs : Wolo Laurent , Il peut tre important de connatre le nom de la station de travail qui executer une instruction d'insertion de donnes 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 donne 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 chane de caractre dans toutes les tables ?


Auteurs : Fabien Celaia , Petite procdure stocke 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

- 41 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La 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 volumtrie de la base, la recherche peut tre extrmement longue et coteuse.

Quelle est la diffrence entre fonctions et procdures ?


Auteurs : Frdric Brouard , Quelles sont les diffrences majeures entre une fonction SQL dite UDF (User Defined Function) et une procdure ? Une fonction (ou UDF, user Define Fonction) est un programme destin fournir en sortie, une valeur scalaire ou une table (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 procdure (EXEC P...) l'utilisation d'un cursor (DECLARE CURSOR, FETCH...) de commande de dbogage comme PRINT

Une fonction table peut contenir des ordres de mise jour, mais ces commandes ne peuvent porter qu'uniquement sur la table en sortie. Une procdure se cre par CREATE PROCEDURE et ses E/S sont : des paramtres input et output un ventuel jeu de rsultat (voir mme plusieurs) une valeur de retour (code d'erreur) Elle peut contenir tout code SQL, y compris : transaction mise jour SQL dynamique cursor commande DDL
- 42 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

Bien entendu, vous pouvez crer vos procdures dans diffrents schmas SQL que vous aurez pralablement crs.

Fonction de dcoupage csure multiple


Auteurs : Frdric Brouard , Voici un problme complexe, comment "parser" une phrase avec, non pas un caractres de csure, mais un ensemble ? Cette fonction rpond cette demande en fournissant en sortie une table... Cette fonction permet de dcouper une phrase selon de multiples caractre de csure. En entre :
@PHRASE : la phrase dcouper @PARSEC : les caractres de csure

En sortie, une table comprenant :


colonne 1 : POS la position du mot dans la phrase colonne 2 : MOT le mot colonne 3 : CHR le caractre de csure 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 dcoupage csure 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 analyse @MOT VARCHAR(128), -- mot dcoup @I INT, -- boucle sur phrase @J INT, -- boucle sur caractre de csure @JMIN INT, -- premier caractre de csure 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 caractres de csure 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

- 43 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

En sortie, une table comprenant :


END; -- rcupration de l emplacement de la csure 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 ----------1 2 3 MOT -------------------toto tata titi CHR ---, NULL

Si vous voulez dcouper avec le caractre espace (blanc) il ne faut pas le placer en fin du paramtre @PARSEC sinon il sera ignor du fait du type VARCHAR. Si vous ne voulez parser que sur le blanc, rajouter la suite du blanc un caractre non imprimable (ASCII infrieur 20). Par exemple CHAR(8).

Calcul en SQL de la date de Pques


Auteurs : Frdric Brouard , Juste une petite fonction SQL pour calculer la date de pques et toutes les dates qui en dcoulent (Lundi de Pques, Ascension, Pentecte et Lundi de Pentecte). L'algorithme utilis pour ce calcul est celui d'Oudin.
-- fonction de calcul de la date de pques CREATE FUNCTION dbo.F_CALCULE_PAQUES (@AN INT) RETURNS DATE /****************************************************************************** * fonction table de calcul de la date de pques * ******************************************************************************* * 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;

- 44 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

SELECT SELECT SELECT SELECT SELECT SELECT RETURN END GO

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

Utilisation :
SELECT dbo.F_CALCULE_PAQUES (2009);

Les autres dates des jours fris mobiles sont calcules d'aprs la date de Pque comme suit : Lundi de pques = Pques + 1 Pentecte = Pques + 50 Lundi de Pentecte = Pques + 51 Ascension = Pques 40 (jeudi) Exemple d'utilisation :
WITH T AS (SELECT DISTINCT dbo.F_CALCULE_PAQUES(2009) AS P ), D AS (SELECT P, 'Pques' AS NOM FROM T UNION ALL SELECT DATEADD(day, 1, P), 'Lundi de Pques' FROM T UNION ALL SELECT DATEADD(day, 40, P), 'Ascension' FROM T UNION ALL SELECT DATEADD(day, 50, P), 'Pentecte' FROM T UNION ALL SELECT DATEADD(day, 51, P), 'Lundi de Pentecte' FROM T) SELECT * FROM D; P ---------2009-04-12 2009-04-13 2009-05-22 2009-06-01 2009-06-02 NOM -----------------Pques Lundi de Pques Ascension Pentecte Lundi de Pentecte

- 45 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

Sommaire > Trucs et Astuces en T-SQL > Limiter le jeu de rsultat Comment limiter le nombre de lignes retounes 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'est un quivalent de la commande Limit de MySQL Exemple:

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

OU

SET ROWCOUNT 100 GO SELECT * FROM t_client GO SET ROWCOUNT 0 GO

Comment implmenter la fonction LIMIT de MySQL en SQLServer ?


Auteurs : Wolo Laurent , Le SGBD MySQL fournit une fonctionalit intressante dans les SELECT : LIMIT.

SELECT * FROM MATABLE LIMIT 10, 30

Affiche 30 lignes partir de l'enregistrement 10. Voici une solution pour implmenter 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 gnraliser, a amliorer 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 (

- 46 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La 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 connatre le nombre d'enregistrements retourns par une requte SELECT, UPDATE, INSERT , DELETE ?
Auteurs : Fabien Celaia , En interrogeant la variable globale @@rowcount, directement aprs l'appel de la requte

Comment supprimer la ligne informationnelle du total de lignes impactes ?


Auteurs : Fabien Celaia ,
set nocount on

Comment ractiver la ligne informationnelle du total de lignes impactes ?


Auteurs : Fabien Celaia ,
set nocount off

Comment ne traiter que les n premires lignes d'un buffer ?


Auteurs : Fabien Celaia ,
set rowcount n

Comment retraiter toutes les lignes aprs un set rowcount n ?


Auteurs : Fabien Celaia ,
Set rowcount 0

Comment rcuprer le rsultat d'une requete dynamique ?


Auteurs : HULK , Si la requte dynamique ne retourne qu'une seule valeur

- 47 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

CREATE PROCEDURE RecupVariable AS DECLARE @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 INT AS DECLARE @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 TableTempo PRINT @VAR

Comment puis je rcuprer une liste / un tableau en sql


Auteurs : Rudi Bruchez , deux solutions : un grand varchar avec un dlimiteur, que l'on parse dans une procdure stocke, par exemple l'aide d'une fonction 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 une procdure stocke avec OPENXML.

Pour un XML du genre:

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

Coder comme ceci

DECLARE @idoc int DECLARE @tField TABLE (FieldName varchar(100), Value varchar(100)) EXEC master.dbo.sp_xml_preparedocument @idoc OUTPUT, @KeyValue INSERT INTO @tField (FieldName, Value) SELECT FieldName, Value FROM OPENXML(@idoc, '/Elements/Element', 2) WITH (FieldName varchar(100) 'Key', Value varchar(100))

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

- 48 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

En tant conscient que les performances du OPENXML peuvent poser problme sur un serveur trs sollicit. A tester.

lien :

Exemple

Comment gnrer un fichier image (.JPG, .GIF) partir d'un champ varbinary ?
Auteurs : davidou2001 , Voici le code pour raliser 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 EXEC EXEC EXEC EXEC EXEC sp_oacreate 'adodb.stream', @r output sp_oasetproperty @r, 'type', 1 sp_oamethod @r, 'open' sp_oasetproperty @o, 'position', 2 sp_oamethod @o, 'copyto', NULL, @r 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 : Frdric Brouard , SQL Server n'est pas compatible avec la norme SQL sur la jointure externe avec *=. Il ne donne pas les mmes rsultats...

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 - 49 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

C1 ----------1 0 1

C2 ----------NULL 0 NULL

C3 ----------NULL 0 NULL

SELECT * FROM T1, T2, T3 WHERE C1 *= C2 AND C1 *= C3 C1 ----------1 0 1 -- exact ! SELECT * FROM T1 LEFT OUTER JOIN T2 ON T1.C1 = T2.C2 LEFT OUTER JOIN T3 ON T2.C2 = T3.C3 C1 ----------1 0 1 SELECT FROM WHERE AND C2 ----------NULL 0 NULL C3 ----------NULL 0 NULL C2 ----------NULL 0 NULL C3 ----------NULL 0 NULL

* T1, T2, T3 C1 *= C2 C2 *= C3

-- Serveur : Msg 301, Niveau 16, tat 1, Ligne 1 -- La requte comporte une requte de jointure externe qui n'est pas autorise. -- 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 ----------NULL 0 NULL SELECT FROM WHERE AND C2 ----------NULL 0 NULL C3 ----------3 0 3

* T1, (SELECT * FROM C1 = C2 C2 =* C3

T2) AS T, T3

-- 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 par -- 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

- 50 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

C1 ----------NULL 0 NULL SELECT FROM WHERE AND

C2 ----------NULL 0 NULL

C3 ----------3 0 3

* T1, T2, T3 C1 =* C2 C1 =* C3 C2 ----------2 2 2 0 0 0 2 2 2 C3 ----------3 0 3 3 0 3 3 0 3

C1 ----------NULL NULL NULL NULL 0 NULL NULL NULL NULL

-- rsultat totalement faux !!!

N'oubliez pas que avant que la norme SQL ne statut en 1992 sur les jointures externes chaque diteur de SGBD tait llibre de faire sa sauce... Cette interprtation de la jointure externe date de l'poque Sybase... Depuis 2005 une telle syntaxe est heureusement interdite !

Arbres intervallaires : procdure de dplacement d'un sous arbre


Auteurs : Frdric Brouard , Dans cet article sur les arbres intervallaires, je n'ai pas mentionn comment dplacer un sous arbre modlis par intervalle. Voici comment procder... Cette procdure exemple (sous forme de primitive) permet de dplacer un sous arbre en le faisant devenir un fils ain ou cadet, un grand frre ou un petit frre et mme un pre par rapport l'lment cibl.
/****************************************************************************** -- cration d'une procdure de dplacement d'un sous arbre ******************************************************************************/ CREATE PROCEDURE dbo.P_MOVE_TRE @id int, -- Ident de l'lment dplac @id_parent int, -- Anctre de destination @mode char(2), -- FG : Grand Frre, PF : Petit Frre, FA : Fils ain, FC : Fils cadet, P : Pre, etc @recurs bit -- La descendance est dplac aussi AS /****************************************************************************** * PROCDURE DPLACEMENT D'UN SOUS ARBRE DANS UN ARBRE MODLIS PAR INTERVALLE * ******************************************************************************* * Frdric Brouard SQLPro http://www.sqlspot.com 2004-06-10 * ******************************************************************************* * PARAMTRES : * * @id clef de l'lment dplacer (racine du sous arbre) * * @id_parent parent du point de dplacement (ancrage) * * @mode parentle au point d'ancrage. Valeurs possibles : * * GF : Frre (grand) * * PF : Frre (petit) *

- 51 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

* FA : Fils ain * * FC : Fils cadet * * P : Pre * * @recurs si 1 dplacement de tout le sous arbre, * * si 0 dplacement de l'lment seul * ******************************************************************************/ DECLARE @OK @bdmax @deltab @bgd @bdd @nivd @bgp @bdp @nivp int, int, -- limite suprieure droite de l'arborescence int, -- Delta de borne int, -- Infos sur le dplac int, int, int, -- Infos sur le parent int, int

-- Mode silencieux SET NOCOUNT ON; -- contrle d'excution IF @mode IS NULL BEGIN RAISERROR ('Dplacement impossible sans mode ! (TABLE dbo.T_NOMENCLATURE_PIECES_NMC)', 16, 1) RETURN END IF @recurs IS NULL BEGIN RAISERROR ('Dplacement impossible sans type ! (TABLE dbo.T_NOMENCLATURE_PIECES_NMC)', 16, 1) RETURN END IF @id IS NULL BEGIN RAISERROR ('Dplacement impossible sans prcision de l''lment ! (TABLE dbo.T_NOMENCLATURE_PIECES_NMC)', 16, 1) RETURN END IF @id_parent IS NULL BEGIN RAISERROR ('Dplacement impossible sans prcision du destinataire ! (TABLE dbo.T_NOMENCLATURE_PIECES_NMC)', 16, 1) RETURN END IF @id = @id_parent BEGIN RAISERROR ('Dplacement 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: vrifier ! BEGIN RAISERROR ('Dplacement impossible, mode inconnu ! (TABLE dbo.T_NOMENCLATURE_PIECES_NMC)', 16, 1) RETURN END

-- dmarrage transaction ------------------SET TRANSACTION ISOLATION LEVEL SERIALIZABLE BEGIN TRANSACTION MOVE_NMC

- 52 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

-- L'lment existe toujours ? SELECT @OK = count(*) FROM dbo.T_NOMENCLATURE_PIECES_NMC WHERE NMC_ID = @id IF @OK IS NULL OR @OK = 0 BEGIN RAISERROR ('Dplacement impossible, l''lment 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 ('Dplacement impossible, le parent n''existe pas ! (TABLE dbo.T_NOMENCLATURE_PIECES_NMC)', 16, 1) GOTO LBL_ERROR RETURN END -- On rcupre la borne suprieure max de l'ensemble SELECT @bdmax = max(NMC_BD) FROM dbo.T_NOMENCLATURE_PIECES_NMC IF @bdmax IS NULL OR @bdmax = 0 BEGIN RAISERROR ('Dplacement impossible, la borne BD est nulle ! (TABLE dbo.T_NOMENCLATURE_PIECES_NMC)', 16, 1) GOTO LBL_ERROR RETURN END -- On a un lment : on rcupre ses caractristiques 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'opration proprement dite... -- Opration rcursive ? IF @recurs = 0 BEGIN -- Seul l'lment doit tre dplac -- dplacement de l'lment 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 -- remonte de ses descendants dans la hirarchie 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

- 53 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

GOTO LBL_ERROR RETURN END -- rquilibrage 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 rcupre d'abord les caractristiques 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 frre 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

- 54 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

-- Petit Frre 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

- 55 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La 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'lment et sa descendance doivent tre dplacs -- dplacement de l'lment et de sa descendance en fin de liste -- Le niveau sera ractualis ultrieurement 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 -- rtablissement 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

- 56 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La 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 rcupre d'abord les caractristiques 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 frre 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'lments dplacs 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 Frre 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

- 57 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La 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'lments dplacs 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'lments dplacs 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

- 58 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La 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'lments dplacs 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 procdure opre dans la table dcrite 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 spcifique, il suffit de remplacer les noms de la tables et des diffrentes colonnes, afin de l'adpater votre cas. Exemple d'excution :
EXEC dbo.P_MOVE_TRE 45, 108, 'FA', 1

- 59 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

Bon amusement !

Arbres intervallaires : procdure de drcursivation


Auteurs : Frdric Brouard , Dans cet article sur les arbres intervallaires, je n'ai pas mentionn comment effectuer la transformation d'une table modlise par auto rfrence en une table en mode intervallaire. Voici comment procder... La procdure ci dessous utilise du code SQL dynamique pour intgrer les donnes transformer dans des tables pseudo temporaires pour ensuite les reverser dans la table d'origine. Il convient de crer pralablement les colonnes ncessaire pour recevoir les bornes gauches et droite.
/****************************************************************************** -- cration d'une procdure de calcul des bornes des intervalles de l'arbre ******************************************************************************/ -- la procdure 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 -- cration 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 /****************************************************************************** * PROCDURE DE CALCUL D'UN ARBRE INTERVALLAIRE ACTUELLEMENT EN AUTO RFRENCE * ******************************************************************************* * Frdric Brouard SQLPro http://www.sqlspot.com 2004-06-10 * ******************************************************************************* * PARAMTRES : * * @TABLE_SCHEMA schma 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 trangre en auto rf. 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

- 60 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La 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 grer une pile afin de drcursiver l'arbre CREATE TABLE dbo.TMP_STACK_SQLPro (PILE INTEGER NOT NULL, CLEF CHAR(10) NOT NULL, GAUCHE INTEGER, DROITE INTEGER); -- on y insre 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 rfrence 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 analyse 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

- 61 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

WHERE S.PILE = @POINTEUR; -- supprime la ligne analyse DELETE FROM dbo.TMP_TREE_SQLPro WHERE CLEF = (SELECT CLEF FROM dbo.TMP_STACK_SQLPro WHERE PILE = @POINTEUR + 1); -- incrmente compteur et pointeur SET @COMPTEUR = @COMPTEUR + 1; SET @POINTEUR = @POINTEUR + 1; END ELSE BEGIN -- dpile parce que que la ligne analyse 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 -- incrmente compteur et dcrmente 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 procdure traver un exemple...


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

- 62 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT GO

INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO

dbo.FAMILLE dbo.FAMILLE dbo.FAMILLE dbo.FAMILLE dbo.FAMILLE dbo.FAMILLE dbo.FAMILLE dbo.FAMILLE dbo.FAMILLE dbo.FAMILLE dbo.FAMILLE dbo.FAMILLE dbo.FAMILLE dbo.FAMILLE dbo.FAMILLE dbo.FAMILLE dbo.FAMILLE

(FAM_ID, (FAM_ID, (FAM_ID, (FAM_ID, (FAM_ID, (FAM_ID, (FAM_ID, (FAM_ID, (FAM_ID, (FAM_ID, (FAM_ID, (FAM_ID, (FAM_ID, (FAM_ID, (FAM_ID, (FAM_ID, (FAM_ID,

FAM_LIB, FAM_LIB, FAM_LIB, FAM_LIB, FAM_LIB, FAM_LIB, FAM_LIB, FAM_LIB, FAM_LIB, FAM_LIB, FAM_LIB, FAM_LIB, FAM_LIB, FAM_LIB, FAM_LIB, FAM_LIB, FAM_LIB,

FAM_PERE) FAM_PERE) FAM_PERE) FAM_PERE) FAM_PERE) FAM_PERE) FAM_PERE) FAM_PERE) FAM_PERE) FAM_PERE) FAM_PERE) FAM_PERE) FAM_PERE) FAM_PERE) FAM_PERE) FAM_PERE) FAM_PERE)

VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES

(5, 'Camion', 1) (6, 'Moto', 1) (7, 'Vlo', 1) (8, 'Hlico', 3) (9, 'Avion', 3) (10, 'ULM', 3) (11, 'Fuse', 3) (12, 'Parachute', 3) (13, 'Planeur', 3) (14, 'Voilier', 2) (15, 'Paquebot', 2) (16, 'Planche voile', 2) (17, 'Trail', 6) (18, 'Side-car', 6) (19, 'Civil', 9) (20, 'Tourisme', 9) (21, 'Militaire', 9)

/****************************************************************************** -- transformation du mode auto rfrence 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 -- excution 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; -- vrification : SELECT * FROM dbo.FAMILLE;

- 63 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

CQFD !

Comment rcuprer par la suite la valeur du ROWCOUNT correspondant au rglage et non @@ROWCOUNT qui correspond au nombre d'lment rellement traits ?
Auteurs : Frdric 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 problme vu que vous pouvez faire un TOP @N

- 64 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

Sommaire > Trucs et Astuces en T-SQL > Validation des donnes Comment vrifier qu'une valeur entre est une date valide ?
Auteurs : Wolo Laurent , Pour vrifier qu'une valeur entre est une date, nous utilisons la fonction IsDate Exemple :

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

Comment vrifier si la valeur entre est numrique ?


Auteurs : Wolo Laurent , Pour vrifier qu'une valeur entre est numerique, nous utilisons la fonction IsNumeric Exemple : Cet exemple renvoie 1 car la colonne zip comprend des valeurs numriques valides.

USE pubs SELECT ISNUMERIC(zip) FROM authors GO

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


Auteurs : Frdric Brouard , Si vous n'avez pas la moindre sauvegarde complte et si vous n'tes pas dans un mode de recouvrement de type FULL c'est impossible. Si vous avez fait une sauvegarde complte 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 complte 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 explorer de Lumigent ou encore celui de Redgate Software pour "voir" le journal de transaction. Mais pour des raisons de paradoxe temporel il est strictement impossible d'annuler un transaction finalise. Ce sont des choses qu'il faut prvoir AVANT !

- 65 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

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

Comment annuler une transaction ds la premire erreur ?


Auteurs : maitrebn , En mettant

SET XACT_ABORT ON

lien :

Sur MSDN

Quelques requtes SQL Server pour connatre la qualit de vos index


Auteurs : Frdric Brouard , Voici quelques requtes qui vous permettrons de noter la qualit de vos index, mais aussi d'effacer ceux inutiliss.

1. Index faiblement utiliss


select 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 requte mesure l'efficacit d'un index par rapport l'utilisation de la table et donne un pourcentage. plus ce pourcentage est lev, et plus cet index est utilis au dtriment de la table. Les index dont la mesure d'efficacit tend vers zro sont supprimer. A noter les index sous-jacents aux contraintes SQL (PRIMARY KEY et UNIQUE) ne sont pas scruts. Cette requte n'a d'intrt que sur un serveur en exploitation n'ayant pas t rcemment arrt. 2. Cette requte gnre un script SQL de suppression des index inutiles
select '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

- 66 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

2. Cette requte gnre 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 database_id = DB_ID() user_seeks + user_scans + user_lookups = 0 I.name NOT IN (SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS)

where AND AND

Cette requte permet de gnrer un script de suppression des index inutiliss. De la mme faon cette requte ne prends pas en compte les index sous-jacents aux contraintes (clefs primaires et unicit). Cette requte n'a d'intrt que sur un serveur en exploitation n'ayant pas t rcemment arrt. 3. Contraintes d'intgrit non indexes
WITH 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);

- 67 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

Cette requte donne les contrainte d'intgrit rfrentielles n'ayant pas d'index correspondant (quelque soit l'ordre des colonnes).

- 68 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

Sommaire > Trucs et Astuces en T-SQL > Programmation des bases de donnes Comment dsactiver et ractiver un dclencheur ?
Auteurs : Wolo Laurent , MS SQL Serveur, partir de la version 2000, prvoit une option dans l'instruction ALTER TABLE qui permet de dsactiver et ractiver un dclencheur. Exemple : L'exemple suivant utilise l'option DISABLE TRIGGER de l'instruction ALTER TABLE pour dsactiver le dclencheur et permettre une insertion qui devrait normalement entraner une violation du dclencheur. Le dclencheur est ensuite ractiv l'aide de l'option ENABLE TRIGGER.

CREATE TABLE trig_example (id INT, name VARCHAR(10), salary MONEY) go -- Creation du dclencheur CREATE TRIGGER trig1 ON trig_example FOR INSERT as IF (SELECT COUNT(*) FROM INSERTED WHERE salary > 100000) > 0 BEGIN print "TRIG1 Error: Vous tentez d'inserer un salaire > $100,000" ROLLBACK TRANSACTION END GO -- Tentative d'insertion d'une valeur qui viole la contrainte. INSERT INTO trig_example VALUES (1,'Pat Smith',100001) GO -- Nous allons maintenant dsactiver le dclencheur. ALTER TABLE trig_example DISABLE TRIGGER trig1 GO -- Nous allons inserer une valeur qui normalement viole le dclencheur INSERT INTO trig_example VALUES (2,'Chuck Jones',100001) GO -- Ractivation du dclencheur ALTER TABLE trig_example ENABLE TRIGGER trig1 GO -- Et l'on teste si notre dclencheur est ractiv. INSERT INTO trig_example VALUES (3,'Mary Booth',100001) GO

Comment dsactiver et ractiver une contrainte ?


Auteurs : Wolo Laurent , MS SQL Serveur, partir de la version 2000, prvoit une option dans l'instruction ALTER TABLE qui permet de dsactiver et ractiver un dclencheur. Exemple : L'exemple suivant dsactive la contrainte dfinissant les salaires pouvant tre inclus dans les donnes. L'option WITH NOCHECK CONSTRAINT est utilise avec ALTER TABLE pour dsactiver la contrainte et permettre une insertion qui devrait normalement entraner une violation de la contrainte. WITH CHECK CONSTRAINT ractive la contrainte.

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

- 69 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

salary MONEY NOT NULL CONSTRAINT salary_cap CHECK (salary < 100000) ) -- Nous commenons par inserer deux lignes INSERT INTO cnst_example VALUES (1,'Joe Brown',65000) INSERT INTO cnst_example VALUES (2,'Mary Smith',75000) -- Ensuite, nous tentons de violer notre contrainte check INSERT INTO cnst_example VALUES (3,'Pat Jones',105000) -- Nous dsactivons la contrainte puis nous relanons ALTER TABLE cnst_example NOCHECK CONSTRAINT salary_cap INSERT INTO cnst_example VALUES (3,'Pat Jones',105000) -- Nous ractivons notre contrainte puis violant la requte. ALTER TABLE cnst_example CHECK CONSTRAINT salary_cap INSERT INTO cnst_example VALUES (4,'Eric James',110000)

Comment tester qu'une colonne a t modifie 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 oprateurs AND,OR Exemple :

--Soit une table T_Table dont la dfinition est la suivante: CREATE TABLE T_TABLE1 ( TAB_ID INT NOT NULL PRIMARY KEY, TAB_VAL NUMERIC(32) NOT NULL ) GO --Nous initialisons la table INSERT 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 crons un dclencheur a cet effet. CREATE TRIGGER TG_NO_ADD_UPDATE ON T_TABLE1 FOR INSERT,UPDATE AS IF UPDATE(TAB_ID) RAISERROR ('Interdiction formelle d''ajouter ou modifier les donnes de cette tables', 16, 10) go --Tentative d'ajout d'une ligne INSERT INTO T_TABLE1 VALUES(5,600) GO --Cette instruction est refoule !!!

Comment rcuperer la date systme 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 crons une vue qui renvoie la date courante

- 70 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

CREATE VIEW V_DateHeure_Courante AS SELECT CURRENT_TIMESTAMP AS DateHeure_Courante

Slectionner cette date dans votre fonction.

SELECT DateHeure_Courante FROM V_DateHeure_Courante

Comment dbugger une procdure stocke ?


Auteurs : Wolo Laurent , Dans l'analyseur de requte, ouvrir une connexion sur le serveur o se trouve la procdure et executer :

exec sp_sdidebug 'legacy_on'

Fermer la fentre de droite pour conserver la mme connexion, puis dans l'explorateur d'objet, faire clic droit sur la procdure stocke puis Dbogage

Comment savoir si un ordre SQL s'est bien droul ?


Auteurs : Fabien Celaia , En interrogeant la variable globale @@error, directement aprs l'appel de la requte : 0=succs, 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 requter sur 2 tables de deux bases diffrentes ?


Auteurs : Fabien Celaia , Il y a de nombreuses manires plus ou moins implicites de dterminer une table NomDeTable NomDuSchema.NomDeTable NomDeLaBase.NomDuSchema.NomDeTable NomDeLaBase..NomDeLaTable NomDuServeurNomDeLaBase.NomDuSchema.NomDeTable

Si l'on souhaite, dans le cas extrme, lier 2 tables de 2 bases distinctes, situes chacune sur un serveur distinct, il faudra donc utiliser la nomenclature complte, en prenant soin au pralable de dterminer le serveur distant/li
- 71 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

Exemple
SELECT P.Nom, P.Prenom, L.NomLocalite FROM Personnes P INNER JOIN ServeurDistant.BaseDistante..Localites L ON P.CodeLocalite=L.IDLocalite

Comment faire une jointure rfrentielle ?


Auteurs : Frdric Brouard , Cette fonction permet de raliser la jointure d'une table fille avec sa table mre lie par l'intgrit rfrentielle.
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 rfrentielle * ******************************************************************************* * Fred. Brouard - http://SQLPro.developpez.com - www.sqlspot.com - 2009-04-10 * ******************************************************************************* * Cette fonction calcule la jointure rfrentielle entre deux tables, l'une * * mre 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

- 72 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

GO

Comment faire une auto jointure ?


Auteurs : Frdric Brouard , Il s'agit de joindre la table sur un clone de cette mme 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 : Frdric Brouard , Effectuer la jointure naturelle, c'est joindre les deux tables sur les colonnes ayant mme nom. Rappelons que dans un systme 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

- 73 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La 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

- 74 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

Sommaire > Trucs et Astuces en T-SQL > Champs auto-incrments Comment insrer une valeur implicite dans un champs auto-incrment ?
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 ON GO INSERT INTO products (id, product) VALUES(3, 'garden shovel'). GO SET IDENTITY_INSERT product OFF GO

Cette faon de faire va l'encontre du comportement mme de l'identity et ne devrait tre utilise qu'exceptionnellement.

Comment connatre la valeur rcente insere dans un champs auto-incrment ?


Auteurs : Wolo Laurent , Il suffit de consulter la valeur de la variable de sessions @@IDENTITY juste aprs l'insertion, faire :

Select @@Identity as Dernire_Valeur_AutoIncrment

Utiliser la fonction IDENT_CURRENT pour Renvoie la dernire valeur d'identit gnre pour une table spcifie dans n'importe quelles sessions et porte.

SELECT IDENT_CURRENT('t_produit')

Comment remettre zro la valeur d'un compteur autoincrment ?


Auteurs : Wolo Laurent , Vous pouvez supprimer la table puis la recrer. Mais, je prfre supprimer les donnes de la table puis redfinir la valeur de l'auto-incrment par :

DBCC CHECKIDENT ('MaTable', RESEED, 1)

- 75 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

Sommaire > Utilisation des utilitaires Comment savoir si l'excution d'un utilitaire (bcp, isql, osql) s'est bien droul ?
Auteurs : Fabien Celaia , En interrogeant la variable systme %ERRORLEVEL%, directement aprs l'appel de l'excutable. 0 = succs, sinon 1

Comment faire pour lire le journal de transaction ?


Auteurs : Fabien Celaia ,
use MaBase GO SELECT * 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 donnes de Excel vers SQL Server


Auteurs : Rudi Bruchez , Microsoft a rdig 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 rcrire tous les jobs DTS en package SSIS.

Comment savoir si une transaction est reste ouverte dans ma base ?


Auteurs : Fabien Celaia , Grce la commande
dbcc opentran

- 76 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

Les symptmes d'une transaction reste ouverte ou d'une rplication mal calibre sont une croissance excessive du journal de transactions de la base.

quoi sert Service Broker ?


Auteurs : Frdric Brouard , L'objet de Service Broker, intgr partir de SQL Server 2005, est de fournir un outil de messagerie de base de donnes permettant de grer des flux de donnes entre serveurs SQL de manire asynchrone, srialis et transactionns. L'utilisation de Service Broker est assez vaste et repose sur le principe des bases de donnes distribues... 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 obsolte et les serveurs d'aujourd'hui ressemble de plus en 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 de files d'attente de message. On aura compris que Service Broker permet de vhiculer des informations entres serveurs SQL quelque soit la distance (sur la couche http d'Internet). Quelques exemples : Informatique dpartementalise : un serveur de base de donnes par services (RH, comptabilit, commercial, production...) communiquant leurs informations communes via Service Broker. Rpartition de charge, lissage de traitements : une batterie de serveurs SQL consomment des messages et les traitent. Fiabilisation de systme : chaque machine de production (chane de fabrication de vaccins humains) est dot d'un serveur SQL qui empile ses message et les envois un serveur central pour consolidation. En cas d'indisponibilit du serveur cible, comme en cas de panne de rseau, le systme continu produire en toute indpendance. L'aspect asynchrone se traduit par le fait que le message est plac en file d'attente, ce qui permet au programme de continuer son travail sans attendre la rponse et vite ainsi les goulets d'tranglement. En fait le message sera trait par Service Broker qui assure un vritable service de messagerie, avec la scurit en plus !

Exemple d'utilisation du Service Broker


Auteurs : Frdric Brouard , Voyons comment cela fonctionne avec un simple petit exemple que vous pouvez reproduire chez vous...
/******************************************************************** * exemple basique du "service broker" (base de donnes distribues) * * Frdric Brouard - SQLPro - http://www.sqlspot.com - 2009-02-12 * * * * un change de message au sein de la mme base pour montrer * * l'aspect transactionnel et asynchrone de la chose * ********************************************************************/ /******************************************************* -- ETAPE n0 : cration de notre base d'essais *******************************************************/ USE master; GO

- 77 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La 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 n1 : mise en place des objets de travail *******************************************************/ -- cration des files d'attentes CREATE QUEUE Q_1; CREATE QUEUE Q_2; -- cration 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 crer le service pour un autre user SQL -- ( contract_name | [DEFAULT] [ ,...n ] ) :: permet de dfinir des contrats associs au service

/********************************************* -- ETAPE n2 : expdition *********************************************/ -- 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 ct 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 dfaut on ne peut pas transmettre en clair ! Il faut crypter -- cration 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';

- 78 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

-- quelques options : -- LIFETIME = <dure en sec> par dfaut 2 milliards de secondes (en fait maxint, soit 68 ans) -- WITH ENCRYPTION = { ON | OFF } par dfaut 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 n3 : du ct 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 "dpil" SELECT * FROM Q_2; /********************************************* => ETAPE n4 : 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 dpile le message de la pile consititu par la table Q_2 ou le place dans un statut "lu", -- en fonction des paramtres de rtention dfinit lors de la cration 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 reu !'); -- arrt de la conversation ct 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 schma du Service Broker MS) /********************************************* * ETAPE n5 : rception de l'acquittement *********************************************/ -- lecture du message d'acquittement

- 79 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/

SQL Server - La FAQ

DECLARE @MSG VARBINARY(max); DECLARE @HDL UNIQUEIDENTIFIER; RECEIVE TOP(1) @MSG = message_body, @HDL = conversation_handle FROM Q_1; -- le message est reut et son "enveloppe" dtruite -- affichage du message d'acuittement ct expditeur PRINT 'Le message est : ' + CAST (@MSG AS VARCHAR (max)); -- fin de la conversation ct expditeur 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 ractiver : 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...

- 80 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlserver.developpez.com/faq/