IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Et si nous aussi, nous avions une FAQ ? [FAQ]


Sujet :

MS SQL Server

  1. #1
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut Et si nous aussi, nous avions une FAQ ?
    Bonjour à tous.

    Nous avons l'ambition de fournir aux visiteurs une FAQ sur Microsoft SQL-Server.

    Pour cela, votre concours est indispensable tant pour poser les questions que les réponses. Pour participer, rien de plus simple, il vous suffit d'ajouter à cette enfilade une question et la réponse que vous souhaitez ajouter à la FAQ.

    Merci beaucoup !

    Une petite contribution de votre part suffira à enrichir un ensemble qui deviendra sans doute un lien incourtounable pour tous les visiteurs qui travaille sous SQL-Server.

    Cordialement,
    Le responsable SGBD.

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Un exemple que vous êtes invité à corriger ou compléter au besoin :

    Q : Comment verrouiller l'enregistrement d'une table ?

    R : SQL Server gère tout seul les verrous, càd qu'il place des verrous adaptés à l'opération en cours sur tel enregistrement. A l'ouverture d'un recordset "updatable", SQL place un verrou "intent update" qui dit que cet enregistrement va sans doute subbir une mise à jour. Quand la mise à jour est effectivement effectuée, un verrou "update" est placé sur l'enregistrement, qui fait que seule la transaction en cours (à qui appartient le verrou) pourra effectuer une modification de l'état de cet enregistrement, que celui-ci ne peut pas être supprimmé tant que le verrou n'a pas été levé, etc.
    Donc en général, la gestion des verrous ne nous concerne pas et est du fait du SGBD. Si la gestion de SQL ne convient pas, il est possible de verrouiller un enregistrement via la commande suivante :
    SELECT lacolonne FROM latable WITH (ROWLOCK)
    Le verrou au niveau le plus fin est "rowlock".
    Voir BOL ("holdlock").

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 298
    Points : 484
    Points
    484
    Par défaut
    Bon allez, je me lance... Je vous laisse corriger et/ou compléter

    Q. Comment implémenter la fonction LIMIT de MySQL en SQLServer

    R. Le SGBD MySQL fournit une fonctionalité intéressante dans les SELECT : LIMIT.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM MATABLE LIMIT 10, 30
    Affiche 30 lignes à partir de l'enregistrement 10.

    Voici une solution pour implémenter cette fonctionalité en SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT * FROM (
             SELECT TOP $start Field1, Field2 FROM (
             SELECT TOP ($start+$nbrows) 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, a améliorer selon vos besoins :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    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 (
                               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 ;
    }

  4. #4
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    merci

  5. #5
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    2 questions/réponses c'est pas suffisant

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 298
    Points : 484
    Points
    484
    Par défaut
    Bon je vais essayer de faire avancer le schmilimilibilikmililibilik......

    Q. Comment lister l'ensemble des triggers d'une base de données SQL Server

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    SELECT
        dbo.sysobjects.name,
        dbo.sysobjects.xtype, 
        dbo.syscomments.text,
        dbo.sysusers.name,
        dbo.sysobjects.crdate
     
    FROM
        dbo.sysobjects
    INNER JOIN dbo.syscomments
        ON dbo.syscomments.id = dbo.sysobjects.id
    INNER JOIN dbo.sysusers
        ON dbo.sysobjects.uid = dbo.sysusers.uid
    WHERE
        xtype = 'TR'

  7. #7
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Les sources sont également les bienvenues

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 862
    Points : 53 015
    Points
    53 015
    Billets dans le blog
    6
    Par défaut
    En principe pour lister les triggers, la vue suivante suffit :
    SELECT * FROM INFORMATION_SCHEMA.ROUTINES
    Sauf que ça marche pas !!!

    A +

  9. #9
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Citation Envoyé par SQLpro
    Sauf que ça marche pas !!!
    c'est balaud... comment peut-on faire alors ?

  10. #10
    Membre averti
    Avatar de mohamed
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2002
    Messages : 217
    Points : 393
    Points
    393
    Par défaut
    Q: Comment connaître les utilisateurs connecté sur la base en cours?
    R:

  11. #11
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 298
    Points : 484
    Points
    484
    Par défaut
    Citation Envoyé par orafrance
    Citation Envoyé par SQLpro
    Sauf que ça marche pas !!!
    c'est balaud... comment peut-on faire alors ?
    Ma petite requête fonctionne, je viens de la re-tester. On peut faire comme ça

  12. #12
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 298
    Points : 484
    Points
    484
    Par défaut
    Q. Comment grouper des données par Trimestre ?

    R. Il est facile de grouper des données par jour, semaines, mois, années. Mais existe-t-il un moyen simple de faire un GROUP BY trimestre ?
    Une solution consiste à utiliser la fonction datename() de T-SQL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT list_fields, datename(qq, 'champ_de_type_date') Trimestre
    FROM MyTable
    GROUP BY datename(qq, 'champ_de_type_date')
    Quelques exemple d'utilisation de datename :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select Getdate(), datename(qq, getdate()) Trimestre,datename(month, getdate()) Mois,
    datename(weekday, getdate()) JourDeLasemaine, datename(week, getdate())  Semaine,
    datename(dayofyear, getdate()) Jour
    Retourne :
    Date Trimestre Mois JourDeLaSemaine Semaine Jour
    2005-06-02 12:20:04.093 2 juin jeudi 23 153

    La doc :
    http://msdn.microsoft.com/library/de...da-db_1dph.asp

  13. #13
    Membre averti
    Avatar de mohamed
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2002
    Messages : 217
    Points : 393
    Points
    393
    Par défaut
    Q:Je n'arrive pas à créer un utilisateur,le système me dit: "user already exist"

    R: il faut droper l'utilisateur et le recréer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    exec sp_dropuser 'utilisateur' -- drop le user
    exec sp_adduser 'utilateur','login' -- recrée utilisateur et l'associe à login

  14. #14
    Membre habitué
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    420
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2004
    Messages : 420
    Points : 174
    Points
    174
    Par défaut
    Q : Je n'arrive pas à utiliser la fonction getdate() dans une fonction utilisateur

    R : SQL server interdit l'utilisation de la fonction getdate() dans une fonction utilisateur.

    Créer une vue qui renvoie la date courante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE VIEW V_DateHeure_Courante
    AS
    SELECT CURRENT_TIMESTAMP AS DateHeure_Courante
    Sélectionner cette date dans votre fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DateHeure_Courante from V_DateHeure_Courante

  15. #15
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 298
    Points : 484
    Points
    484
    Par défaut
    Q. Quelle est la requête qui permet de savoir quelles colonnes d'une table servent de clé primaire ?

    Il existe une procédure stockée pour cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXEC sp_pkeys @table_name='MaTable'

  16. #16
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 224
    Points : 19 567
    Points
    19 567
    Billets dans le blog
    25
    Par défaut
    Pour commencer...

    Quelle requête retourne les processus en train de consommer ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    create proc sp__cpu as
    /*
    * Auteur : Fabien Celaia
    * Date   : 11/01/2002
    * Desc   : Affiche les processus utilisateurs en cours de traitement
    * Parm   : -
    */
     
    SELECT
    	  convert(char(4), spid) Spid, 
    	  convert(char(4), blocked) Blk,
    	  convert(char(4), cpu) CPU,
              left(loginame,15) 'Users',
    	  left(hostname, 15) 'Host', 
              left(db_name(dbid),15) DB,
              convert(char(20), cmd) Command, 
    	  convert(char(12), program_name) Program ,
    	  convert(char(10), status) Status 
    FROM master..sysprocesses
    WHERE  spid <> @@spid 
    AND status not in ( 'BACKGROUND', 'sleeping')
    ORDER BY cpu DESC
    GO
    GRANT execute on sp__cpu to public
    GO

    Afficher la liste des utilisateurs d'une base spécifique ou de la base courante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    CREATE PROC sp__dbuser (@db varchar(30)=NULL)
    AS
    BEGIN
    /*
    * Auteur : Fabien Celaia
    * Date   : 3.3.2002
    * Desc   : Affiche la lsite des utilisateurs de la base courante ou de la base passée en paramètre 
    * Parm   : @db = nom de la base (optionel) 
    * Return : Nombre d'utilisateurs
    *          -1 si la base n'existe pas
    */
    set nocount on 
     
    declare @i int
    if @db is null
    	select @db=db_name()
    else
    	if not exists(select name from master..sysdatabases where name = @db)
    		begin
    		Print 'La base '+@db+' n''existe pas dans le serveur '+ @@servername
    		return -1
    		end
     
    select @db 'Base'
    print ''
     
    /* Nombre d'utilisateurs */
    select @i=count(spid)  from master..sysprocesses where dbid = db_id(@db) and status <> 'BACKGROUND'
     
    if @i = 0
    	begin
    	print ''
    	print 'Cette base est inutilisée'
    	print ''
    	end
    else
    	begin 
    	/* Liste des utilisateurs */
    	declare @snum varchar(4)
    	select @snum = convert(varchar(4), @i)
    	print ''
    	print @snum+' utilisateur(s) trouvés dans la base '+@db+', serveur '+ @@servername
    	print ''
    	select spid, loginame Utilisateur , cmd, program_name from master..sysprocesses 
    	where dbid = db_id(@db) and status <> 'BACKGROUND'
     
    	/* Message informationel pour l'utilisateur courant */
    	if exists (select * from master..sysprocesses where spid=@@spid and dbid=db_id(@db))
    		begin
    		print ''
    		print 'FYI : VOUS êtes actuellement connectés à la base  '+@db+', serveur '+@@servername
    		print ''
    		end
    	end
    return @i
    end
    go
    GRANT execute on sp__dbuser to public
    go

  17. #17
    Membre chevronné Avatar de Oluha
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 183
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 183
    Points : 1 967
    Points
    1 967
    Par défaut
    Comment débugger une procédure stockée ?

    Dans l'analyseur de requête, ouvrir une connexion sur le serveur où se trouve la procédure et executer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exec sp_sdidebug 'legacy_on'
    Fermer la fenêtre de droite pour conserver la même connexion, puis dans l'explorateur d'objet, faire clic droit sur la procédure stockée puis Débogage

  18. #18
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 224
    Points : 19 567
    Points
    19 567
    Billets dans le blog
    25
    Par défaut
    Comment extirper un DDL complet pour un utilisateur donné ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    Create  PROC sp_ddluser (@login varchar(30))
    as
    BEGIN
    /* Auteur : Fabien Celaia
     * Date   : 6.6.05
     * Desc   : Extraction du DDL d'un utilisateur spécifique permettant sa recréation multi-serveurs 
     * IParm  : @login (obligatoire) : l'utilisateur à extraire
     * OParm  : 0 = succès
     *	   -1 = l'utilisateur n'existe pas
     */
     
     
    if not exists (select * from sysusers where name = @login)
    	begin
    	PRINT 'L''utilisateur '+@login+'n''existe pas dans la base '+db_name()+' du serveur '+@@servername
    	return -1
    	end
     
    if not exists (select * from master..syslogins where name = @login)
    	begin
    	/* Login inexistant => création */
    	select 'exec sp_addlogin '+ @login+ ', MotDePasse'
    	end
     
    SELECT 'EXEC SP_DROPUSER '+@login
    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

  19. #19
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    excellent

  20. #20
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    il nous faut au moins 60 questions/réponses pour ouvrir la rubrique

    A votre bon coeur

Discussions similaires

  1. Merci de nous aider à créer des ressources (FAQ et sources)
    Par Community Management dans le forum Evolutions du club
    Réponses: 29
    Dernier message: 19/10/2015, 00h35
  2. Aidez nous à relire et corriger les FAQ JavaScript
    Par vermine dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 05/05/2013, 11h52
  3. Réponses: 0
    Dernier message: 24/07/2010, 16h17
  4. Quel SGBD nous conseillez-vous pour une application Web ?
    Par doppler dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 07/03/2007, 15h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo