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?
Merci à tous pour toutes les bonnes réponses !
Procédures stockées
Extraits de code
Fonctions
Misc
GO
répète le lotDans 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.
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
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
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".
TableDiff.exe
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())
Dans Management Studio, vous pouvez rapidement obtenir une liste de colonnes délimitées par des virgules pour un tableau en:
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.
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')
HashBytes () pour renvoyer le hachage MD2, MD4, MD5, SHA ou SHA1 de son entrée.
Si vous souhaitez connaître la structure de la table, les index et les contraintes:
sp_help 'TableName'
Identifier les requêtes les plus courantes
Lien avec le commnad
select * from sys.dm_exec_query_stats
order by execution_count desc
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!
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.
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'
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
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,
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
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)
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
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.
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
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
Date de retour seulement
Select Cast(Floor(Cast(Getdate() As Float))As Datetime)
ou
Select DateAdd(Day, 0, DateDiff(Day, 0, Getdate()))
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 )
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é".
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
Colonnes calculées persistantes
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.
sp_stored_procedures
Renvoie une liste de procédures stockées dans l'environnement actuel.
/ * 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'
Cryptage simple avec EncryptByKey
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-.
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
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:
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.
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
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)
Trace Drapeaux ! "1204" était inestimable pour le débogage de blocage sur SQL Server 2000 (2005 dispose de meilleurs outils pour cela).
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
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
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 facilesp_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écutionastuce générale T-sql
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
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.
sp_executesql
Pour exécuter une instruction dans une chaîne. Aussi bon que Execute mais peut renvoyer les paramètres
sp_who2, tout comme sp_who, mais avec beaucoup plus d'informations pour le dépannage de blocs
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.
Sql 2000+ DBCC DROPCLEANBUFFERS
: Efface les tampons. Utile pour tester la vitesse des requêtes lorsque le tampon est propre.
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.
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.
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)
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é.
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.
Déclencheurs d'événements de connexion
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. =)
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
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.
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
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.
Utilisation de l'utilitaire osql pour exécuter des requêtes/scripts/batches en ligne de commande
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
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)
Paramètre DEFAULT_SCHEMA dans sys.database_principles
Format de stockage Vardecimal
Bases de données partagées évolutives
Je voudrais recommander un complément gratuit SSMS Tools Pack qui contient un tas de fonctionnalités telles que
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
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.
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.
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.
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.
Peu d'autres fonctionnalités sont
Pour plus d'informations, vous pouvez visiter leur page Features
J'utilise pour ajouter cette procédure stockée à la base de données principale,
Améliorations:
Usage:
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
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 .
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é.
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).
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/
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
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) + '|%'
CTRL-E exécute le texte actuellement sélectionné dans l'Analyseur de requêtes.
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
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.
Alternative au sp_change_users_login de Kolten:
ALTER USER wacom_app WITH LOGIN = wacom_app
Quelques uns non documentés sont ici: Commandes SQL Server Procs et DBCC non documentées mais pratiques
Pour SQL Server 2005:
select * from sys.dm_os_performance_counters
select * from sys.dm_exec_requests
Paramétrage forcé
Utilisation
sélectionnez * depuis information_schema
pour lister toutes les bases de données, tables de base, sps, vues, etc. dans SQL Server.
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
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.
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.
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 .
@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.
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.)