web-dev-qa-db-fra.com

Fonctionnalités cachées de SQL Server

Quelles sont les fonctionnalités cachées de SQL Server ?

Par exemple, procédures stockées système non documentées, astuces pour réaliser des tâches très utiles mais pas suffisamment documentées?


Réponses

Merci à tous pour toutes les bonnes réponses !

Procédures stockées

  • sp_msforeachtable: Exécute une commande avec '?' remplacé par chaque nom de table (v6.5 et plus)
  • sp_msforeachdb: Exécute une commande avec '?' remplacé par chaque nom de base de données (v7 et plus)
  • sp_who2: comme sp_who, mais avec beaucoup plus d'informations pour le dépannage des blocs (à partir de la v7)
  • sp_helptext: Si vous voulez le code d'une procédure stockée, affichez & UDF
  • sp_tables: renvoie une liste de toutes les tables et vues de la base de données concernée.
  • sp_stored_procedures: renvoie une liste de toutes les procédures stockées.
  • xp_sscanf: Lit les données de la chaîne dans les emplacements d'argument spécifiés par chaque argument de format.
  • xp_fixeddrives: : recherche le lecteur fixe avec le plus grand espace libre
  • sp_help: Si vous souhaitez connaître la structure, les index et les contraintes d'une table. Aussi vues et UDF. Le raccourci est Alt + F1

Extraits de code

  • Renvoyer les lignes dans un ordre aléatoire
  • Tous les objets utilisateur de la base de données par date de dernière modification
  • Date de retour seulement
  • Trouver des enregistrements dont la date se situe quelque part dans la semaine en cours.
  • Trouver des enregistrements dont la date est survenue la semaine dernière.
  • Renvoie la date du début de la semaine en cours.
  • Renvoie la date du début de la semaine dernière.
  • Voir le texte d'une procédure déployée sur un serveur
  • Supprimer toutes les connexions à la base de données
  • Checksum de table
  • Ligne Checksum
  • Déposer toutes les procédures dans une base de données
  • Re-mapper correctement les identifiants de connexion après la restauration
  • Appelez des procédures stockées à partir d'une instruction INSERT
  • Rechercher des procédures par mot-clé
  • Déposer toutes les procédures dans une base de données
  • Interrogez le journal des transactions pour une base de données par programme.

Fonctions

  • HashBytes ()
  • EncryptByKey
  • Commande PIVOT

Misc

  • Extras de connexion
  • TableDiff.exe
  • Déclencheurs d'événements de connexion (nouveautés dans le Service Pack 2)
  • Amélioration des performances avec les colonnes calculées persistantes (pcc).
  • Paramètre DEFAULT_SCHEMA dans sys.database_principles
  • Paramétrage forcé
  • Format de stockage vardecimal
  • Déterminer les requêtes les plus populaires en quelques secondes
  • Base de données partagée évolutive
  • Fonction de filtre de table/procédure stockée dans SQL Management Studio
  • Indicateurs de trace
  • Le numéro après un GO répète le lot
  • Sécurité à l'aide de schémas
  • Cryptage à l'aide de fonctions de cryptage intégrées, de vues et de tables de base avec déclencheurs
215
Sklivvz

Dans Management Studio, vous pouvez mettre un nombre après un marqueur de fin de lot GO pour que le lot soit répété autant de fois:

PRINT 'X'
GO 10

Imprimera 'X' 10 fois. Cela peut vous éviter des tâches fastidieuses de copier/coller lorsque vous effectuez des opérations répétitives.

91
GilM

Beaucoup de développeurs SQL Server ne semblent toujours pas connaître l'existence de clause OUTPUT (SQL Server 2005 et versions ultérieures) le les instructions DELETE, INSERT et UPDATE.

Il peut être extrêmement utile de savoir quelles lignes ont été INSERTed, UPDATEd ou DELETEd, et la clause OUTPUT permet de le faire très facilement - cela permet d'accéder aux tables "virtuelles" appelées inserted et deleted _ (comme dans les triggers):

DELETE FROM (table)
OUTPUT deleted.ID, deleted.Description
WHERE (condition)

Si vous insérez des valeurs dans une table comportant un champ de clé primaire INT IDENTITY, avec la clause OUTPUT, vous pouvez obtenir immédiatement le nouvel ID inséré:

INSERT INTO MyTable(Field1, Field2)
OUTPUT inserted.ID
VALUES (Value1, Value2)

Et si vous mettez à jour, il peut être extrêmement utile de savoir ce qui a changé - dans ce cas, inserted représente les nouvelles valeurs (après la mise à jour), tandis que deleted fait référence aux anciennes valeurs précédentes. la mise à jour:

UPDATE (table)
SET field1 = value1, field2 = value2
OUTPUT inserted.ID, deleted.field1, inserted.field1
WHERE (condition)

Si de nombreuses informations doivent être renvoyées, la sortie de OUTPUT peut également être redirigée vers une table temporaire ou une variable de table (OUTPUT INTO @myInfoTable).

Extrêmement utile - et très peu connu!

Marc

70
marc_s

sp_msforeachtable: Exécute une commande avec '?' remplacé par chaque nom de table. par exemple.

exec sp_msforeachtable "dbcc dbreindex('?')"

Vous pouvez émettre jusqu'à 3 commandes pour chaque table.

exec sp_msforeachtable
    @Command1 = 'print ''reindexing table ?''',
    @Command2 = 'dbcc dbreindex(''?'')',
    @Command3 = 'select count (*) [?] from ?'

Également, sp_MSforeachdb

52
Mitch Wheat

Extras de connexion:

MultipleActiveResultSets = true;

Cela permet à ADO.Net 2.0 et aux versions ultérieures de lire plusieurs ensembles de résultats en lecture seule, en avant uniquement, sur une seule connexion à une base de données, ce qui peut améliorer les performances si vous lisez beaucoup. Vous pouvez l'activer même si vous mélangez plusieurs types de requêtes.

Nom de l'application = MyProgramName

Désormais, lorsque vous souhaitez afficher une liste des connexions actives en interrogeant la table sysprocesses, le nom de votre programme apparaît dans la colonne nom_programme au lieu de "Fournisseur de données .Net SqlClient".

51
Chris Wenham

TableDiff.exe

  • L'outil Différence de table vous permet de découvrir et de réconcilier les différences entre une table source et cible ou une vue. Tablediff Utility peut signaler les différences entre le schéma et les données. La fonctionnalité la plus populaire de tablediff est le fait qu’elle peut générer un script que vous pouvez exécuter sur la destination et qui réconciliera les différences entre les tables.

Lien

33
Sklivvz

Une technique TSQL moins connue pour renvoyer des lignes dans un ordre aléatoire:

-- Return rows in a random order
SELECT 
    SomeColumn 
FROM 
    SomeTable
ORDER BY 
    CHECKSUM(NEWID())
31
Mitch Wheat

Dans Management Studio, vous pouvez rapidement obtenir une liste de colonnes délimitées par des virgules pour un tableau en:

  1. Dans l'explorateur d'objets, développez les nœuds sous une table donnée (vous verrez ainsi les dossiers des colonnes, des clés, des contraintes, des déclencheurs, etc.).
  2. Pointez sur le dossier Columns et faites glisser dans une requête.

C'est pratique lorsque vous ne voulez pas utiliser le format odieux renvoyé en cliquant avec le bouton droit de la souris sur la table et en choisissant Script Table As ..., puis Insert To ... Cette astuce fonctionne avec les autres dossiers car elle vous donnera une liste de noms délimités par des virgules contenus dans le dossier.

30
Thomas

Constructeurs de lignes

Vous pouvez insérer plusieurs lignes de données avec une seule instruction insert.

INSERT INTO Colors (id, Color)
VALUES (1, 'Red'),
       (2, 'Blue'),
       (3, 'Green'),
       (4, 'Yellow')
23
Rob Boek

HashBytes () pour renvoyer le hachage MD2, MD4, MD5, SHA ou SHA1 de son entrée.

22
Joel Coehoorn

Si vous souhaitez connaître la structure de la table, les index et les contraintes:

sp_help 'TableName'
22
Eduardo Molteni

Identifier les requêtes les plus courantes

  • Avec sys.dm_exec_query_stats, vous pouvez identifier de nombreuses combinaisons d'analyses de requêtes en une seule requête.

Lien avec le commnad

select * from sys.dm_exec_query_stats 
order by execution_count desc
20
Sklivvz
17
Martin Smith

Je sais que ce n'est pas exactement caché, mais peu de gens connaissent la commande PIVOT . J'ai pu modifier une procédure stockée qui utilisait des curseurs et mettait 2 minutes à exécuter un morceau de code rapide de 6 secondes, soit un dixième du nombre de lignes!

16
BoltBait

SAUF ET INTERSECTER

Au lieu d'écrire des jointures et des sous-requêtes élaborées, ces deux mots clés constituent un moyen beaucoup plus élégant et lisible d'exprimer l'intention de votre requête lors de la comparaison de deux résultats. Nouveauté de SQL Server 2005, elles complètent fortement UNION, qui existe déjà depuis des années dans le langage TSQL.

Les concepts de EXCEPT, INTERSECT et UNION sont fondamentaux dans la théorie des ensembles, qui sert de base et de fondement à la modélisation relationnelle utilisée par tous les SGBDR modernes. Maintenant, les résultats de type diagramme de Venn peuvent être générés de manière plus intuitive et assez facile avec TSQL.

16
Ray Vega

utile lors de la restauration d'une base de données à des fins de test ou autre. Re-mappe correctement l'ID de connexion:

EXEC sp_change_users_login 'Auto_Fix', 'Mary', NULL, 'B3r12-36'
16
Kolten

Supprimez toutes les connexions à la base de données:

Use Master
Go

Declare @dbname sysname

Set @dbname = 'name of database you want to drop connections from'

Declare @spid int
Select @spid = min(spid) from master.dbo.sysprocesses
where dbid = db_id(@dbname)
While @spid Is Not Null
Begin
        Execute ('Kill ' + @spid)
        Select @spid = min(spid) from master.dbo.sysprocesses
        where dbid = db_id(@dbname) and spid > @spid
End
15
GateKiller

Je ne suis pas sûr qu'il s'agisse d'une fonctionnalité cachée ou non, mais je suis tombé sur celle-ci et je l'ai trouvée utile à maintes reprises. Vous pouvez concatoner un ensemble de champs dans une seule instruction select, plutôt que d'utiliser un curseur et de parcourir en boucle l'instruction select.

Exemple:

DECLARE @nvcConcatonated nvarchar(max)
SET @nvcConcatonated = ''

SELECT @nvcConcatonated = @nvcConcatonated + C.CompanyName + ', '
FROM tblCompany C
WHERE C.CompanyID IN (1,2,3)

SELECT @nvcConcatonated

Résultats:

Acme, Microsoft, Apple,
15
Sheki

Checksum de table

Select CheckSum_Agg(Binary_CheckSum(*)) From Table With (NOLOCK)

Ligne Checksum

Select CheckSum_Agg(Binary_CheckSum(*)) From Table With (NOLOCK) Where Column = Value
15
GateKiller

Si vous voulez le code d'une procédure stockée, vous pouvez:

sp_helptext 'ProcedureName'

(pas sûr que ce soit une fonctionnalité cachée, mais je l'utilise tout le temps)

14
Eduardo Molteni

Une astuce de procédure stockée est que vous pouvez les appeler à partir d'une instruction INSERT. J'ai trouvé cela très utile lorsque je travaillais sur une base de données SQL Server.

CREATE TABLE #toto (v1 int, v2 int, v3 char(4), status char(6))
INSERT #toto (v1, v2, v3, status) EXEC dbo.sp_fulubulu(sp_param1)
SELECT * FROM #toto
DROP TABLE #toto
13
edomaur

Dans SQL Server 2005/2008, pour afficher les numéros de ligne dans un résultat de requête SELECT:

SELECT ( ROW_NUMBER() OVER (ORDER BY OrderId) ) AS RowNumber,
        GrandTotal, CustomerId, PurchaseDate
FROM Orders

ORDER BY est une clause obligatoire. La clause OVER () indique au moteur SQL de trier les données sur la colonne spécifiée (dans ce cas, OrderId) et d'attribuer des numéros en fonction des résultats du tri.

12
Binoj Antony

Utile pour analyser les arguments de procédure stockée: xp_sscanf

Lit les données de la chaîne dans les emplacements des arguments spécifiés par chaque argument de format.

L'exemple suivant utilise xp_sscanf pour extraire deux valeurs d'une chaîne source en fonction de leur position dans le format de la chaîne source.

DECLARE @filename varchar (20), @message varchar (20)
EXEC xp_sscanf 'sync -b -fproducts10.tmp -rrandom', 'sync -b -f%s -r%s', 
  @filename OUTPUT, @message OUTPUT
SELECT @filename, @message

Voici le jeu de résultats.

-------------------- -------------------- 
products10.tmp        random
10
Sklivvz

dm_db_index_usage_stats

Cela vous permet de savoir si les données d'une table ont été mises à jour récemment, même si vous ne disposez pas d'une colonne DateUpdated dans la table.

SELECT OBJECT_NAME(OBJECT_ID) AS DatabaseName, last_user_update,*
FROM sys.dm_db_index_usage_stats
WHERE database_id = DB_ID( 'MyDatabase')
AND OBJECT_ID=OBJECT_ID('MyTable')

Code de: http://blog.sqlauthority.com/2009/05/09/sql-server-find-last-date-time-updated-for-any-table/

Informations référencées depuis: SQL Server - Quelle est la date/heure de la dernière ligne insérée dans une table?

Disponible dans SQL 2005 et versions ultérieures

9
Nathan Koop

Date de retour seulement

Select Cast(Floor(Cast(Getdate() As Float))As Datetime)

ou

Select DateAdd(Day, 0, DateDiff(Day, 0, Getdate()))
9
GateKiller

Trouver des enregistrements dont la date se situe quelque part dans la semaine en cours.

where dateadd( week, datediff( week, 0, TransDate ), 0 ) =
dateadd( week, datediff( week, 0, getdate() ), 0 )

Trouver des enregistrements dont la date est survenue la semaine dernière.

where dateadd( week, datediff( week, 0, TransDate ), 0 ) =
dateadd( week, datediff( week, 0, getdate() ) - 1, 0 )

Renvoie la date du début de la semaine en cours.

select dateadd( week, datediff( week, 0, getdate() ), 0 )

Renvoie la date du début de la semaine dernière.

select dateadd( week, datediff( week, 0, getdate() ) - 1, 0 )
7
GateKiller

Ce n'est pas vraiment une fonctionnalité cachée, mais la configuration de mappages de touches dans Management Studio sous Outils\Options\Clavier: Alt + F1 est défini par défaut sur sp_help "texte sélectionné" mais je ne peux pas vivre sans l'ajout de Ctrl + F1 pour sp_helptext "texte sélectionné".

7
JohnD

Il y a des moments où il n'y a pas de colonne appropriée pour trier, ou vous voulez simplement l'ordre de tri par défaut sur une table et vous voulez énumérer chaque ligne. Afin de faire cela, vous pouvez mettre "(select 1)" dans la clause "order by" et vous obtiendrez ce que vous voulez. Neat, hein?

select row_number() over (order by (select 1)), * from dbo.Table as t
7
Denis Valeev

Colonnes calculées persistantes

  • Les colonnes calculées peuvent vous aider à déplacer le coût du calcul d'exécution vers la phase de modification des données. La colonne calculée est stockée avec le reste de la ligne et est utilisée de manière transparente lorsque l'expression des colonnes calculées et de la requête correspond. Vous pouvez également créer des index sur les PCC pour accélérer les filtrations et les balayages de plages sur l’expression.

Lien

7
Sklivvz

Voici quelques fonctionnalités que je trouve utiles mais que beaucoup de personnes ne semblent pas connaître:

sp_tables

Renvoie une liste d'objets pouvant être interrogés dans l'environnement actuel. Cela signifie tout objet pouvant apparaître dans une clause FROM, à l'exception des objets synonymes.

Lien

sp_stored_procedures

Renvoie une liste de procédures stockées dans l'environnement actuel.

Lien

7
Sklivvz

/ * Trouver le lecteur fixe avec le plus grand espace libre, vous pouvez également copier des fichiers pour estimer quel disque est le plus rapide * /

EXEC master..xp_fixeddrives

/ * Vérification des hypothèses sur un fichier avant utilisation ou référence * /

EXEC master..xp_fileexist 'C:\file_you_want_to_check'

Plus de détails ici

6
ICW

Cryptage simple avec EncryptByKey

6
John Sheehan

Voici un exemple simple mais utile:

Lorsque vous modifiez manuellement le contenu d'une table, vous pouvez insérer NULL dans une colonne en tapant Control-.

6
Ryan Lundy

La chose la plus surprenante que j'ai apprise cette semaine a consisté à utiliser une déclaration CASE dans ORDER By Clause. Par exemple:

declare @orderby varchar(10)

set @orderby = 'NAME'

select * 
    from Users
    ORDER BY 
        CASE @orderby
            WHEN 'NAME' THEN LastName
            WHEN 'EMAIL' THEN EmailAddress
        END
6
NotMe

SQLCMD

Si vous avez des scripts que vous exécutez maintes et maintes fois, mais que vous devez modifier de légers détails, exécuter ssms en mode sqlcmd est génial. La ligne de commande sqlcmd est également assez épineuse.

Mes fonctionnalités préférées sont:

  • Vous devez définir des variables. Variables appropriées qui ne nécessitent pas de sauter dans les cerceaux sp_exec
  • Vous pouvez exécuter plusieurs scripts les uns après les autres
  • Ces scripts peuvent référencer les variables dans le script "externe"

Plutôt que de jetter davantage, Simpletalk de Red Gate a fait un résumé impressionnant de sqlcmd - The SQLCMD Workbench . Donabel Santos a quelques excellents exemples SQLCMD aussi.

6
Dan F

Voici une requête que j'ai écrite pour répertorier tous les objets utilisateur DB par date de dernière modification:

select name, modify_date, 
case when type_desc = 'USER_TABLE' then 'Table'
when type_desc = 'SQL_STORED_PROCEDURE' then 'Stored Procedure'
when type_desc in ('SQL_INLINE_TABLE_VALUED_FUNCTION', 'SQL_SCALAR_FUNCTION', 'SQL_TABLE_VALUED_FUNCTION') then 'Function'
end as type_desc
from sys.objects
where type in ('U', 'P', 'FN', 'IF', 'TF')
and is_ms_shipped = 0
order by 2 desc
5
Gordon Bell

utilisez GETDATE() avec + ou - pour calculer une date proche

SELECT GETDATE() - 1 -- yesterday, 1 day ago, 24 hours ago
SELECT GETDATE() - .5 -- 12 hours ago
SELECT GETDATE() - .25 -- 6 hours ago
SELECT GETDATE() - (1 / 24.0) -- 1 hour ago (implicit decimal result after division)
4
MikeM

Trace Drapeaux ! "1204" était inestimable pour le débogage de blocage sur SQL Server 2000 (2005 dispose de meilleurs outils pour cela).

4
Constantin

Rechercher les procédures par mot clé

Quelles procédures contiennent un morceau de texte (nom de la table, nom de la colonne, nom de la variable, TODO, etc.)?

SELECT OBJECT_NAME(ID) FROM SysComments 
WHERE Text LIKE '%SearchString%' 
AND OBJECTPROPERTY(id, 'IsProcedure') = 1
4
Meff

Je trouve ce petit script très pratique pour voir le texte d’une procédure qui a été déployée sur un serveur:

DECLARE @procedureName NVARCHAR( MAX ), @procedureText NVARCHAR( MAX )

SET @procedureName = 'myproc_Proc1'

SET @procedureText =    (
                            SELECT  OBJECT_DEFINITION( object_id )
                            FROM    sys.procedures 
                            WHERE   Name = @procedureName
                        )

PRINT @procedureText
4
cheeves

Ok, voici le peu qui me reste, dommage que j'ai raté le départ, mais continue comme ça, il y a des trucs top ici!

Analyseur de requêtes

  • Alt+F1 Exécute sp_help Sur le texte sélectionné
  • Alt-D - concentrez-vous sur la liste déroulante de la base de données afin que vous puissiez utiliser la base de données sélectionnée avec les touches de curseur de lettre.

T-Sql

  • if (object_id("nameofobject") IS NOT NULL) begin <do something> end - vérification de l'existence la plus facile
  • sp_locks - plus d'informations de verrouillage en profondeur que sp_who2 (premier port d'escale)
  • dbcc inputbuffer(spid) - liste de la première ligne du processus d'exécution (un peu utile mais très utile)
  • dbcc outputbuffer(spid) - liste de la première ligne du résultat du processus en cours d'exécution

astuce générale T-sql

  • Avec des volumes importants, utilisez librement des sous-requêtes pour traiter les données par jeux

par exemple. pour obtenir une liste des personnes mariées de plus de cinquante ans, vous pouvez sélectionner un ensemble de personnes mariées dans une sous-requête et les associer à un ensemble des mêmes personnes de plus de 50 ans et afficher les résultats joints - veuillez excuser l'exemple artificiel

4
penderi

Séparateur de lots

La plupart des gens ne le savent pas, mais "GO" n'est pas une commande SQL. C'est le séparateur de lot par défaut utilisé par les outils client. Vous pouvez trouver plus d'informations à ce sujet dans Documentation en ligne .

Vous pouvez modifier le séparateur de lots en sélectionnant Outils -> Options dans Management Studio, puis en modifiant l’option Séparateur de lots dans la section Exécution de la requête.

Je ne suis pas sûr de savoir pourquoi vous voudriez faire cela autrement que comme une farce, mais c'est une pièce un peu intéressante.

4
Rob Boek
sp_executesql 

Pour exécuter une instruction dans une chaîne. Aussi bon que Execute mais peut renvoyer les paramètres

4
Eduardo Molteni

sp_who2, tout comme sp_who, mais avec beaucoup plus d'informations pour le dépannage de blocs

4
Booji Boy

Dans SQL Server Management Studio (SSMS), vous pouvez mettre en surbrillance un nom d'objet dans l'explorateur d'objets et appuyer sur Ctrl-C pour copier le nom dans le Presse-papiers.

Il n'est pas nécessaire d'appuyer sur F2 ou de cliquer avec le bouton droit de la souris pour renommer l'objet afin de copier le nom.

Vous pouvez également faire glisser un objet depuis l'explorateur d'objets vers la fenêtre de requête.

3
Rob Boek

Sql 2000+ DBCC DROPCLEANBUFFERS: Efface les tampons. Utile pour tester la vitesse des requêtes lorsque le tampon est propre.

2
Brian

Stored proc sp_MSdependencies vous informe sur les dépendances d'objet d'une manière plus utile que sp_depends. Pour certaines versions de production, il est pratique de désactiver temporairement les contraintes de la table enfant, d'appliquer les modifications, puis de réactiver les contraintes de la table enfant. C'est un excellent moyen de trouver des objets qui dépendent de votre table parent.

Ce code désactive les contraintes de la table enfant:

create table #deps
( oType int,
  oObjName sysname,
  oOwner nvarchar(200),
  oSequence int
)

insert into #deps  
exec sp_MSdependencies @tableName, null, 1315327

exec sp_MSforeachtable @command1 = 'ALTER TABLE ? NOCHECK CONSTRAINT ALL',
@whereand = ' and o.name in (select oObjName from #deps where oType = 8)'

Une fois la modification appliquée, vous pouvez exécuter ce code pour réactiver les contraintes:

exec sp_MSforeachtable @command1 = 'ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL',
@whereand = ' and o.name in (select oObjName from #deps where oType = 8)'

Le troisième paramètre s'appelle @flags et contrôle le type de dépendances répertoriées. Allez lire le contenu de la procédure pour voir comment vous pouvez changer les @flags pour vos besoins. Le proc utilise des masques de bits pour déchiffrer ce que vous voulez retourner.

2
Sir Wobin

Puisque je suis un programmeur, pas un administrateur de base de données, ma fonction cachée préférée est la bibliothèque SMO . Vous pouvez automatiser à peu près n'importe quoi dans SQL Server, de la création et de la suppression de bases de données/tables/colonnes aux scripts pour la sauvegarde et la restauration. Si vous pouvez le faire dans SQL Server Management Studio, vous pouvez l’automatiser dans SMO.

2
Ryan Lundy

En voici un que j’ai appris aujourd’hui parce que j’avais besoin de rechercher une transaction.

:: fn_dblog
Ceci vous permet d'interroger le journal des transactions pour une base de données.

USE mydatabase;
SELECT *
FROM ::fn_dblog(NULL, NULL)

http://killspid.blogspot.com/2006/07/using-fndblog.html

2
Chris Roland

Mon préféré est maître..xp_cmdshell. Il vous permet d'exécuter des commandes à partir d'une invite de commande sur le serveur et de voir le résultat. C'est extrêmement utile si vous ne pouvez pas vous connecter au serveur, mais vous devez obtenir des informations ou les contrôler d'une manière ou d'une autre.

Par exemple, pour répertorier les dossiers sur le lecteur C: du serveur sur lequel SQL Server est exécuté.

  • master..xp_cmdshell 'dir c: \'

Vous pouvez également démarrer et arrêter des services.

  • master..xp_cmdshell 'requête sc "Mon service"'

  • master..xp_cmdshell 'sc stop "Mon service"'

  • master..xp_cmdshell 'sc start "Mon service"'

C'est très puissant, mais c'est aussi un risque pour la sécurité. De nombreuses personnes le désactivent car il pourrait facilement être utilisé pour faire de mauvaises choses sur le serveur. Mais si vous y avez accès, cela peut être extrêmement utile.

2
Jim

Déclencheurs d'événements de connexion

  • Les déclencheurs de connexion peuvent aider à compléter l'audit et la conformité. Par exemple, les événements de connexion peuvent être utilisés pour appliquer des règles sur les connexions (par exemple, limiter la connexion via un nom d'utilisateur spécifique ou limiter les connexions via un nom d'utilisateur à une période spécifique) ou simplement pour suivre et enregistrer l'activité de connexion générale. Comme dans tout déclencheur, ROLLBACK annule l'opération en cours d'exécution. Dans le cas d'un événement de connexion, cela signifie l'annulation de l'établissement de la connexion. Les événements de connexion ne se déclenchent pas lorsque le serveur est démarré en mode de configuration minimale ou lorsqu'une connexion est établie via une connexion administrateur dédiée (DAC).

Lien

2
Sklivvz

Sur la base de ce qui semble être une réaction véhémente de la part des développeurs de bases de données endurcis, l’intégration CLR se classerait tout en haut. =)

2
casperOne

Exécutez une procédure stockée et capturez les résultats dans une table (temp) pour un traitement ultérieur, par exemple:

INSERT INTO someTable EXEC sp_someproc

Exemple: Affiche sp_help sortie, mais classée par taille de base de données:

CREATE TABLE #dbs
(
    name nvarchar(50),
    db_size nvarchar(50),
    owner nvarchar(50),
    dbid int,
    created datetime,
    status nvarchar(255),
    compatiblity_level int
)
INSERT INTO #dbs EXEC sp_helpdb

SELECT * FROM #dbs 
ORDER BY CONVERT(decimal, LTRIM(LEFT(db_size, LEN(db_size)-3))) DESC

DROP TABLE #dbs
1
Duncan Smart

Une fonctionnalité semi-cachée, la fonctionnalité Filtre de procédure de table/procédure stockée peut être vraiment utile ...

Dans le SQL Server Management Studio Explorateur d'objets, cliquez avec le bouton droit de la souris sur le dossier Tables ou procédures stockées, sélectionnez le menu Filtre, puis Paramètres du filtre et entrez un nom partiel dans la rangée Le nom contient.

De même, utilisez Remove Filter pour voir à nouveau toutes les tables/procédures stockées.

1
Gordon Bell

Obtenez une liste des en-têtes de colonnes au format vertical:

Copier les noms de colonne dans les résultats de la grille

Outils - Options - Résultats de la requête - SQL Server - Résultats dans la grille cochez "Inclure les en-têtes de colonne lors de la copie ou de l'enregistrement des résultats"

vous devrez établir une nouvelle connexion à ce stade, puis exécutez votre requête

Maintenant, lorsque vous copiez les résultats de la grille, vous obtenez les en-têtes de colonne

Aussi, si vous copiez ensuite les résultats dans Excel

Copier uniquement les en-têtes de col

Collage spécial (ne doit pas chevaucher la zone de copie)

coche "Transposer"

D'accord

[vous voudrez peut-être ajouter un "," et se remplir automatiquement à ce stade]

Vous avez une liste instantanée de colonnes au format vertical

1
adolf garlic

Ce sont quelques fonctionnalités cachées de SQL Management Studio que j'aime bien.

J'adore le fait que, si vous maintenez la touche ALT enfoncée tout en mettant en surbrillance des informations, vous pouvez sélectionner des informations en colonnes et non pas uniquement des lignes entières.

Dans SQL Management Studio, vous avez des raccourcis clavier prédéfinis:

Ctrl + 1 exécute sp_who Ctrl + 2 exécute sp_lock Alt + F1 exécute sp_help Ctrl + F1 exécute sp_helptext

Donc, si vous mettez un nom de table en surbrillance dans l’éditeur et appuyez sur Alt + F1, la structure de la table s’affiche.

1
Jose Chama

Utilisation de l'utilitaire osql pour exécuter des requêtes/scripts/batches en ligne de commande

1
Kane

Si vous voulez supprimer toutes les procédures d'une base de données -

SELECT  IDENTITY ( int, 1, 1 ) id, 
        [name] 
INTO    #tmp 
FROM    sys.procedures 
WHERE   [type]        = 'P' 
    AND is_ms_shipped = 0 

DECLARE @i INT 

SELECT   @i = COUNT( id ) FROM #tmp 
WHILE    @i > 0 
BEGIN 
   DECLARE @name VARCHAR( 100 ) 
   SELECT @name = name FROM #tmp WHERE id = @i 
   EXEC ( 'DROP PROCEDURE ' + @name ) 
   SET @i = @i-1 
END

DROP TABLE #tmp
1
cheeves

avez-vous déjà accidentellement cliqué sur le bouton Exécuter quand vous vouliez réellement cliquer sur:
Déboguer/Analyser/Utiliser une base de données/Basculer entre les onglets de requête/etc.?

Voici un moyen de déplacer ce bouton dans un endroit sûr:

Outils -> Personnaliser. et faites glisser le bouton où vous voulez

Vous pouvez aussi :
- ajoute/supprime d'autres boutons couramment utilisés/non utilisés (s'applique même aux commandes de MenuBar telles que Fichier/Éditer)
- change l'image de l'icône du bouton (voir le petit cochon sous Changer l'image du bouton .. lol)

1
waeva

Paramètre DEFAULT_SCHEMA dans sys.database_principles

  • SQL Server offre une grande flexibilité pour la résolution de noms. Toutefois, la résolution de nom a un coût et peut être sensiblement onéreuse dans les charges de travail ad hoc qui ne qualifient pas complètement les références d'objet. SQL Server 2005 autorise un nouveau paramètre DEFEAULT_SCHEMA pour chaque principe de base de données (également appelé "utilisateur"), ce qui peut éliminer cette surcharge sans modifier votre code TSQL.

Lien

1
Sklivvz

Format de stockage Vardecimal

  • SQL Server 2005 ajoute un nouveau format de stockage pour les types de données numériques et décimaux appelé vardecimal. Vardecimal est une représentation de longueur variable pour les types décimaux permettant de sauvegarder les octets inutilisés dans chaque instance de la ligne. La plus grande partie des économies provient des cas où la définition décimale est grande (comme décimale (38,6)) mais les valeurs stockées sont petites (comme une valeur de 0,0) ou s'il existe un grand nombre de valeurs répétées ou que les données sont peu renseignées. .

Lien

1
Sklivvz

Bases de données partagées évolutives

  • Grâce aux bases de données partagées évolutives, il est possible de monter les mêmes lecteurs physiques sur des machines standard et de permettre à plusieurs instances de SQL Server 2005 de fonctionner à partir du même ensemble de fichiers de données. La configuration ne nécessite pas de stockage en double pour chaque instance de SQL Server et permet une puissance de traitement supplémentaire via plusieurs instances de SQL Server disposant de leurs propres ressources locales, telles que cpu, memory, tempdb et potentiellement d'autres bases de données locales.

Lien

1
Sklivvz

Je voudrais recommander un complément gratuit SSMS Tools Pack qui contient un tas de fonctionnalités telles que

Extraits de code

Vous n'avez plus besoin de taper SELECT * FROM vous-même. Il suffit de taper SSF et appuyez sur Entrée (qui peut être personnalisé pour toute autre clé. Je préfère Tab). Quelques autres extraits utiles sont

SSC + tab - SELECT COUNT (*) FROM

SST + onglet - SÉLECTIONNER LE TOP 10 * DE

Onglet S + - SELECT

I + onglet - INSERER

U + tab - MISE À JOUR

W + tab - O

OB + tab - COMMANDER PAR

et la liste continue. Vous pouvez vérifier et personnaliser la liste entière à l'aide du menu SSMS Tools Pack

Historique du journal d'exécution

Avez-vous déjà réalisé que vous auriez pu enregistrer une requête ad hoc que vous avez écrite il y a quelques jours afin de ne pas avoir à réinventer la roue? Le pack d’outils SSMS enregistre tout votre historique d’exécution et vous pouvez effectuer une recherche par date ou par tout texte de la requête.

Recherche dans la base de données

Cette fonctionnalité vous aide à rechercher l'occurrence de la chaîne dans la base de données entière et affiche le nom de la table et le nom de la colonne avec le nombre total d'occurrences. Vous pouvez utiliser cette fonctionnalité en cliquant avec le bouton droit de la souris sur la base de données dans l'explorateur d'objets et en sélectionnant Rechercher dans la base de données.

Format SQL

Définit tous les mots clés en majuscules ou minuscules. Cliquez avec le bouton droit sur la fenêtre de requête et sélectionnez Formater le texte. Vous pouvez définir la touche de raccourci dans le menu Outils SSMS. Mais il manque la fonctionnalité d'alignement.

CRUD SP Génération

Cliquez avec le bouton droit de la souris sur un tableau, Outils SSMS -> Créer un CRUD pour générer les opérations Insertion, Mise à jour, Supprimer et Sélectionner SP. Le contenu de SP peut être personnalisé à l'aide du menu Outils SSMS.

Misc

Peu d'autres fonctionnalités sont

  1. Résultats de la recherche en mode Grille.
  2. Générer un script d'insertion à partir de résultats, tables et base de données.
  3. Analyseur du plan d'exécution.
  4. Exécuter un script dans plusieurs bases de données.

Pour plus d'informations, vous pouvez visiter leur page Features

1
Sundeep Arun

J'utilise pour ajouter cette procédure stockée à la base de données principale,

Améliorations:

  • Couper sur le nom d'hôte, de sorte que le copier-coller fonctionne sur VNC.
  • Ajout d'une option LOCK pour regarder uniquement quels sont les processus verrouillés actuels.

Usage:

  • EXEC sp_who3 'ACTIVE'
  • EXEC sp_who3 'LOCK'
  • EXEC sp_who3 spid_No

C'est ça.

CREATE procedure sp_who3
       @loginame sysname = NULL --or 'active' or 'lock'
as

declare  @spidlow   int,
         @spidhigh  int,
         @spid      int,
         @sid       varbinary(85)

select   @spidlow   =     0
        ,@spidhigh  = 32767


if @loginame is not NULL begin
    if upper(@loginame) = 'ACTIVE' begin
        select spid, ecid, status
            , loginame=rtrim(loginame)
            , hostname=rtrim(hostname)
            , blk=convert(char(5),blocked)
            , dbname = case
                            when dbid = 0 then null
                            when dbid <> 0 then db_name(dbid)
                        end
              ,cmd
        from  master.dbo.sysprocesses
        where spid >= @spidlow and spid <= @spidhigh AND
              upper(cmd) <> 'AWAITING COMMAND'
        return (0)
    end
    if upper(@loginame) = 'LOCK' begin
        select spid , ecid, status
            , loginame=rtrim(loginame)
            , hostname=rtrim(hostname)
            , blk=convert(char(5),blocked)
            , dbname = case
                            when dbid = 0 then null
                            when dbid <> 0 then db_name(dbid)
                        end
              ,cmd
        from  master.dbo.sysprocesses
        where spid >= 0 and spid <= 32767 AND
              upper(cmd) <> 'AWAITING COMMAND'
        AND convert(char(5),blocked) > 0
        return (0)
    end

end

if (@loginame is not NULL
   AND  upper(@loginame) <> 'ACTIVE'
   )
begin
    if (@loginame like '[0-9]%')    -- is a spid.
    begin
        select @spid = convert(int, @loginame)
        select spid, ecid, status
            , loginame=rtrim(loginame)
            , hostname=rtrim(hostname)
            , blk=convert(char(5),blocked)
            , dbname = case
                            when dbid = 0 then null
                            when dbid <> 0 then db_name(dbid)
                        end
              ,cmd
        from  master.dbo.sysprocesses
        where spid = @spid
    end
    else
    begin
        select @sid = suser_sid(@loginame)
        if (@sid is null)
        begin
            raiserror(15007,-1,-1,@loginame)
            return (1)
        end
        select spid, ecid, status
            , loginame=rtrim(loginame)
            , hostname=rtrim(hostname)
            , blk=convert(char(5),blocked)
            , dbname = case
                            when dbid = 0 then null
                            when dbid <> 0 then db_name(dbid)
                        end
               ,cmd
        from  master.dbo.sysprocesses
        where sid = @sid
    end
    return (0)
end


/* loginame arg is null */
select spid,
       ecid,
       status
       , loginame=rtrim(loginame)
       , hostname=rtrim(hostname)
       , blk=convert(char(5),blocked)
       , dbname = case
                    when dbid = 0 then null
                    when dbid <> 0 then db_name(dbid)
                end
       ,cmd
from  master.dbo.sysprocesses
where spid >= @spidlow and spid <= @spidhigh


return (0) -- sp_who

BCP_IN et BCP_OUT sont parfaits pour l'importation et l'exportation de données BULK

0
sourabh

master..spt_values (et plus précisément type = 'p') a été vraiment utile pour division de chaînes et pour effectuer des 'binning' et interpolation temporelle manipulation .

0
StuartLC

sp_lock: affiche tous les verrous actuels. Les données renvoyées peuvent être interrogées en tant que:

spid - utilisez-le avec sp_who pour voir à qui appartient le verrou.

objid - utilisez-le avec select object_name(objid) pour voir quel objet de base de données est verrouillé.

0
viniciushana

Quelques-unes de mes choses préférées:

Ajouté dans sp2 - Options de script sous outils/options/script

Nouvelle sécurité à l'aide de schémas - créez deux schémas: user_access, admin_access. Placez vos procs utilisateurs dans l'un et vos procs administratifs dans l'autre comme ceci: user_access.showList, admin_access.deleteUser. Accordez EXECUTE sur le schéma à votre utilisateur/rôle d’application. Plus besoin de donner EXECUTE tout le temps.

Cryptage à l'aide de fonctions de cryptage intégrées, de vues (à décrypter pour la présentation) et de tables de base avec déclencheurs (à crypter lors de l'insertion/de la mise à jour).

0
Sam

OK, voici mes 2 centimes:

http://dbalink.wordpress.com/2008/10/24/querying-the-object-catalog-and-information-schema-views/

Je suis trop paresseux pour réécrire le tout ici, alors s'il vous plaît vérifier mon post. Cela peut paraître banal pour beaucoup, mais il y en aura qui trouveront un "joyau caché".

MODIFIER:

Après un moment, j'ai décidé d'ajouter le code ici pour que vous n'ayez pas à aller sur mon blog pour voir le code.

SELECT  T.NAME AS [TABLE NAME], C.NAME AS [COLUMN NAME], P.NAME AS [DATA TYPE], P.MAX_LENGTH AS[SIZE],   CAST(P.PRECISION AS VARCHAR) +‘/’+ CAST(P.SCALE AS VARCHAR) AS [PRECISION/SCALE]
FROM ADVENTUREWORKS.SYS.OBJECTS AS T
JOIN ADVENTUREWORKS.SYS.COLUMNS AS C
ON T.OBJECT_ID=C.OBJECT_ID
JOIN ADVENTUREWORKS.SYS.TYPES AS P
ON C.SYSTEM_TYPE_ID=P.SYSTEM_TYPE_ID
WHERE T.TYPE_DESC=‘USER_TABLE’;

Ou, si vous voulez extraire toutes les tables utilisateur, utilisez le CURSEUR comme ceci:

DECLARE @tablename VARCHAR(60)

DECLARE cursor_tablenames CURSOR FOR
SELECT name FROM AdventureWorks.sys.tables

OPEN cursor_tablenames
FETCH NEXT FROM cursor_tablenames INTO @tablename

WHILE @@FETCH_STATUS = 0
BEGIN

SELECT  t.name AS [TABLE Name], c.name AS [COLUMN Name], p.name AS [DATA Type], p.max_length AS[SIZE],   CAST(p.PRECISION AS VARCHAR) +‘/’+ CAST(p.scale AS VARCHAR) AS [PRECISION/Scale]
FROM AdventureWorks.sys.objects AS t
JOIN AdventureWorks.sys.columns AS c
ON t.OBJECT_ID=c.OBJECT_ID
JOIN AdventureWorks.sys.types AS p
ON c.system_type_id=p.system_type_id
WHERE t.name = @tablename
AND t.type_desc=‘USER_TABLE’
ORDER BY t.name ASC

FETCH NEXT FROM cursor_tablenames INTO @tablename
END

CLOSE cursor_tablenames
DEALLOCATE cursor_tablenames

RÉFÉRENCE ADDITIONNELLE (mon blog): http://dbalink.wordpress.com/2009/01/21/how-to-create-cursor-in-tsql/

0
MarlonRibunal
use db
go 

select o.name 
, (SELECT [definition] AS [text()] 
     FROM sys.all_sql_modules 
     WHERE sys.all_sql_modules.object_id=a.object_id 
     FOR XML PATH(''), TYPE
  )  AS Statement_Text
 , a.object_id
 , o.modify_date 

 FROM sys.all_sql_modules a 
 LEFT JOIN  sys.objects o ON a.object_id=o.object_id 
 ORDER BY  4 desc

--select * from sys.objects
0
Yordan Georgiev

Renvoie les résultats en fonction d'une chaîne d'ID délimitée par des tubes dans une seule instruction (alternative au passage de xml ou à la transformation initiale de la chaîne délimitée en table)

Exemple:

DECLARE @nvcIDs nvarchar(max)
SET @nvcIDs = '|1|2|3|'

SELECT C.*
FROM tblCompany C
WHERE @nvcIDs LIKE '%|' + CAST(C.CompanyID as nvarchar) + '|%' 
0
Sheki

CTRL-E exécute le texte actuellement sélectionné dans l'Analyseur de requêtes.

0
Chris McCall

Raccourcis clavier de SQL Server Management Studio ... qui permettront des résultats plus rapides et plus rapides dans les tâches quotidiennes. http://sqlserver-qa.net/blogs/tools/archive/2007/04/25/management-studio-shortcut-keys.aspx

0
Satya SKJ

Vous pouvez créer une liste séparée par des virgules avec une sous-requête et ne pas avoir la dernière virgule. Cela a été dit d'être plus efficace que les fonctions qui étaient utilisées avant que cela soit disponible. Je pense 2005 et plus tard.

SELECT 
    Project.ProjectName,
    (SELECT
        SUBSTRING(
            (SELECT ', ' + Site.SiteName
            FROM Site
            WHERE Site.ProjectKey = Project.ProjectKey
            ORDER BY Project.ProjectName
    FOR XML PATH('')),2,200000)) AS CSV 
FROM Project

Vous pouvez également utiliser FOR XML PATH avec des requêtes imbriquées pour sélectionner le format XML que j'ai trouvé utile.

0
Steve

Alternative au sp_change_users_login de Kolten:

ALTER USER wacom_app WITH LOGIN = wacom_app
0
Michhes
0
SQLMenace

Pour SQL Server 2005:

select * from sys.dm_os_performance_counters

select * from sys.dm_exec_requests
0
Christopher Klein

Paramétrage forcé

  • Le paramétrage permet à SQL Server de tirer parti de la réutilisation du plan de requête et d’éviter les coûts de compilation et d’optimisation lors de l’exécution ultérieure de requêtes similaires. Cependant, il existe de nombreuses applications qui, pour une raison ou une autre, souffrent toujours de la charge de compilation de requêtes ad-hoc. Dans les cas où le nombre de requêtes est élevé et où la réduction de l'utilisation du processeur et du temps de réponse est essentielle pour votre charge de travail, le paramétrage forcé peut être utile.

Lien

0
Sklivvz

Utilisation

sélectionnez * depuis information_schema

pour lister toutes les bases de données, tables de base, sps, vues, etc. dans SQL Server.

0
Ramesh
use db
go      
DECLARE @procName varchar(100)      
DECLARE @cursorProcNames CURSOR      
SET @cursorProcNames = CURSOR FOR      
select name from sys.procedures where modify_date > '2009-02-05 13:12:15.273' order by modify_date desc     

OPEN @cursorProcNames      
FETCH NEXT      
FROM @cursorProcNames INTO @procName      
WHILE @@FETCH_STATUS = 0      
BEGIN      
-- see the text of the last stored procedures modified on 
-- the db , hint Ctrl + T would give you the procedures test 
set nocount off;      
exec sp_HelpText @procName --- or print them      
-- print @procName      

FETCH NEXT      
FROM @cursorProcNames INTO @procName      
END      
CLOSE @cursorProcNames      

select @@error  
0
Yordan Georgiev

Pas sans papiers

RowNumber, avec l'aimable autorisation d'Itzik Ben-Gan http://www.sqlmag.com/article/articleid/97675/sql_server_blog_97675.html

SET XACT_ABORT ON annule tout en cas d'erreur pour les transactions

tous les sp_ ​​sont utiles il suffit de parcourir des livres en ligne

raccourcis clavier que j'utilise tout le temps dans Management Studio F6 - Basculement entre les résultats et interrogation Alt + X ou F5: le texte sélectionné dans l'interrogation si rien n'est sélectionné exécute la totalité de la fenêtre. Alt + T et Alt + D - les résultats sont respectivement du texte ou une grille.

0
user31269

J'utilise SSMS pour rechercher du texte dans des fichiers sur le disque dur du système d'exploitation. Il est très facile d'écrire des expressions rationnelles et de passer au crible n'importe quel répertoire pour remplacer ou trouver du texte. J'ai toujours trouvé cela plus facile que d'utiliser Windows.

0
SoftwareCarpenter

Dans SQL Server 2005, vous n'avez plus besoin d'exécuter la procédure stockée sp-blocker-pss8 . Au lieu de cela, vous pouvez faire:

exec sp_configure 'show advanced options', 1;
reconfigure;
go
exec sp_configure 'blocked process threshold', 30;
reconfigure; 

Vous pouvez ensuite démarrer une trace SQL et sélectionner la classe d'événements de rapport de processus bloqués dans le groupe Erreurs et avertissements. Détails de cet événement ici .

0
Logicalmind

@Gatekiller - Un moyen plus simple d'obtenir la date est sûrement

CAST(CONVERT(varchar,getdate(),103) as datetime)

Si vous n'utilisez pas JJ/MM/AAAA dans vos paramètres régionaux, vous devrez utiliser une valeur différente de 103. Lookup CONVERT dans la documentation en ligne de SQL pour les codes de paramètres régionaux.

0
Ollie

Je trouve sp_depends utile. Il affiche les objets qui dépendent d’un objet donné, par ex.

exec sp_depends 'fn_myFunction' 

retourne les objets qui dépendent de cette fonction (remarque, si les objets n'ont pas été initialement exécutés dans la base de données dans le bon ordre, cela donnera des résultats incorrects.)

0
Dave ODonnell