Hier, j'étais frustré par la désynchronisation de la base de données. Les bibliothèques utilisées pour le développement et les tests ne sont pas les mêmes. Dans la bibliothèque développée, les procédures stockées sont fréquemment mises à jour. Parfois même la structure du tableau change.
Cela entraîne de nombreux problèmes. Pendant un moment, je ne savais pas quel était le problème spécifique, ce qui m'a mis très embarrassé. J'ai soudainement eu envie d'écrire un programme pour comparer les différences entre les deux bibliothèques afin de faciliter les tests et la mise en œuvre.
Ce matin, j'écrivais lors d'une réunion et j'ai réussi le test à midi.
Principalement deux instructions SQL :
Le SQL avec différentes structures de table et de vue et attributs de colonne dans la bibliothèque de requêtes est le suivant :
sélectionnez A. [nom] comme TableName,
B. [nom] comme Colname,
B.xtype,
B.xusertype,
B. longueur,
B. colide,
B.cdefault,
B.domaine,
B. numéro,
B. décalage,
B.statut,
Type B,
B. type d'utilisateur,
B.prec,
B.échelle,
B.est calculé,
B.isoutparam,
B.isnullable,
C.COLUMN_DEFAULT,
dbo.fnIsColumnPrimaryKey (B. [ID], B. [nom]) comme PKey
à partir des objets système A, des colonnes système B, INFORMATION_SCHEMA .COLUMNS C
où a.id = B.id
et A.xtype in ('u', 'v')
et A. Nom = C.TABLE_NAME
et B. Nom = C.COLUMN_NAME
commander par A. [ID], B. [Nom]
///////
La signification de chaque colonne est la suivante
name sysname Nom de colonne ou nom d'un paramètre de procédure.
id int ID d'objet de table auquel appartient cette colonne ou ID de procédure stockée associé à ce paramètre.
xtype tinyint Type de stockage physique dans les types système.
typestat tinyint Usage interne uniquement.
xusertype smallint ID de type de données étendu défini par l'utilisateur.
length smallint Longueur de stockage physique maximale en types de système.
xprec tinyint Usage interne uniquement.
xscale tinyint Usage interne uniquement.
colonne colid smallint ou ID de paramètre.
xoffset smallint Usage interne uniquement.
bitpos tinyint Usage interne uniquement.
réservé tinyint Usage interne uniquement.
colstat smallint Usage interne uniquement.
cdefault int L'ID de valeur par défaut de cette colonne.
domain int ID de règle ou de contrainte CHECK de cette colonne.
number smallint Le numéro du sous-processus lorsque le processus est regroupé (0 indique les éléments non liés au processus).
colorder smallint Usage interne uniquement.
autoval varbinary(255) Usage interne uniquement.
offset smallint Le décalage de la ligne dans laquelle se trouve cette colonne ; s'il est négatif, indique une ligne de longueur variable.
status tinyint Bitmap décrivant les attributs de colonne ou de paramètre :
0x08 = La colonne autorise les valeurs nulles.
0x10 = Le remplissage ANSI est en vigueur lors de l'ajout d'une colonne varchar ou varbinary. Préserve les espaces de fin pour les colonnes varchar et les zéros de fin pour les colonnes varbinary.
0x40 = Le paramètre est un paramètre de SORTIE.
0x80 = La colonne est une colonne d'identité.
tapez tinyint Le type de stockage physique dans les types système.
usertype smallint ID de type de données défini par l'utilisateur dans systypes.
printfmt varchar(255) Usage interne uniquement.
prec smallint Le niveau de précision de cette colonne.
scale int Nombre de décimales pour cette colonne.
iscomputed int Flag indiquant si la colonne a été calculée :
0 = non calculé.
1 = Calculé.
isoutparam int indique si le paramètre de procédure est un paramètre de sortie :
1 = vrai.
0 = faux.
isnullable int indique si la colonne autorise les valeurs nulles :
1 = vrai.
0 = faux.
Valeur par défaut COLUMN_DEFAULT
PKey Clé primaire.
////////
Les fonctions suivantes sont utilisées :
--------------------------
CRÉER UNE FONCTION dbo.fnIsColumnPrimaryKey (@sTableID int, @nColumnName varchar(128))
--alter FONCTION dbo.fnIsColumnPrimaryKey (@sTableName varchar(128), @nColumnName varchar(128))
Bit de retour
COMME
COMMENCER
DÉCLARE @nTableID int,
@nIndexID entier,
@i int
SET @nTableID = @sTableID--OBJECT_ID (@sTableName)
SELECT @nIndexID = indid
DEPUIS les index système
OÙ identifiant = @nTableID
ET indid ENTRE 1 et 254
ET (statut & 2048) = 2048
SI @nIndexID est nul
RETOUR 0
SI @nColumnName IN
(SELECT sc.[nom]
DE sysindexkeys sik
INNER JOIN syscolumns sc ON sik.id = sc.id ET sik.colid = sc.colid
OÙ sik.id = @nTableID
ET sik.indid = @nIndexID)
COMMENCER
RETOUR 1
FIN
RETOUR 0
FIN
--------------------------
Grâce à cette instruction SQL, vous pouvez connaître les attributs de colonne de toutes les tables de la base de données.
En exécutant cette instruction SQL deux fois respectivement, les attributs des colonnes des deux bibliothèques peuvent être récupérés et comparés.
-------------------------------------------------- ---------------
Pour les procédures stockées et les fonctions, utilisez les instructions SQL suivantes :
sélectionnez * parmi les objets système où xtype dans ('P', 'TF', 'IF', 'FN') ordre par [Nom]
Tous les noms de procédures stockées et de fonctions peuvent être interrogés. Les résultats de la requête en boucle,
Dans chaque boucle, le nom de la fonction ou de la procédure stockée est stocké dans une chaîne SpobjectName, puis la procédure stockée est appelée : sp_helptext est le suivant :
exec sp_helptext '" +SpobjectName+"'
Renvoie une table qui contient le contenu textuel de la procédure stockée SpobjectName. Une ligne de texte dans la procédure stockée correspond à une ligne dans le tableau.
Exécutez tous les SP et fonctions avec exec sp_helptext pour obtenir les codes de toutes les procédures et fonctions stockées.
Mettez simplement les résultats dans un tableau et comparez les similitudes et les différences.
Référence : Documentation en ligne de SQL Server
<Génération automatisée de procédures stockées dans la base de données>( http://www.vckbase.com/document/viewdoc/?id=1111 )
Désormais, nous comparons uniquement les attributs de colonne des tables et des vues, ainsi que les procédures et fonctions stockées.
La relation de contrainte entre les tableaux de comparaison n'est pas implémentée.
Sera ajouté plus tard.