Existe-t-il une norme de codage SQL largement utilisée? SQL est un peu différent du type de langage de programmation C/C++. Vraiment, je ne sais pas comment le mieux formater pour la lisibilité.
Je ne l'appellerais pas norme de codage - plutôt comme style de codage
SELECT
T1.col1,
T1.col2,
T2.col3
FROM
table1 T1
INNER JOIN ON Table2 T2 ON T1.ID = T2.ID
WHERE
T1.col1 = 'xxx'
AND T2.Col3 = 'yyy'
J'aime la virgule précédente
SELECT
column1
, column2
, column3
, COALESCE(column4,'foo') column4
FROM
tablename
WHERE
column1 = 'bar'
ORDER BY
column1
, column2
à mon avis, il est plus facile à lire et à déboguer.
Je sais que c'est long, mais supporte-moi, c'est important. Cette question a ouvert une boîte de conserve fraîche. Et si vous n'aimez pas les blocs de base de données, lisez la suite.
Et, avant que quiconque ne songe à rejeter ma réponse, s'il vous plaît voyez l'article suivant et les articles associés sur le verrouillage et recompilez; deux des ressources les plus dommageables sur une base de données SQL.
http://support.Microsoft.com/kb/263889
Je peux taper assez rapidement et je n'aime pas plus taper que la personne suivante. Mais je suis extrêmement attentif aux points ci-dessous, même si c’est plus typé. Tellement que j'ai construit mes propres SP applications pour le faire pour moi.
Les points que je soulève sont vraiment importants! Vous pourriez même vous dire: "Vous plaisantez, ce n'est pas un problème", eh bien, alors vous n'avez pas lu les articles ci-dessus. ET, il est totalement idiot que M $ mette ces points sous forme de NOTES. Ces questions pour moi devraient être audacieuses et SCREAMING.
Je fais aussi beaucoup de codage pour construire mes scripts de base en utilisant des applications C # pour accélérer le développement et ces pratiques sont très valables (10 ans) pour rendre la rédaction de scripts plus simple et plus rapide.
Il y a plus que cela, mais c'est ce que je fais pour les 60% de tout.
Les meilleures pratiques
Préférences
Sélectionner
CREATE PROC [dbo].[procTable_SEL] AS SET NOCOUNT ON SELECT [Column1] = T1.[col1] , [Column2] = T1.[col2] , [Column3] = T2.[col3] FROM [dbo].[Table] T1 INNER JOIN ON [dbo].[Table2] T2 ON T1.ID = T2.ID WHERE T1.[col1] = 'xxx' AND T2.[Col3] = 'yyy' SET NOCOUNT OFF GO
Mettre à jour
CREATE PROC [dbo].[procTable_UPD] AS SET NOCOUNT ON UPDATE t1 SET [Column1] = @Value1 , [Column2] = @Value2 , [Column3] = @Value3 FROM [dbo].[Table1] T1 INNER JOIN ON [dbo].[Table2] T2 ON T1.[ID] = T2.[ID] WHERE T1.[col1] = 'xxx' AND T2.[Col3] = 'yyy' SET NOCOUNT OFF GO
Insérer
CREATE PROC [dbo].[procTable_INS] AS SET NOCOUNT ON INSERT INTO [Table1] ( [Column1] , [Column2] , [Column3] ) VALUES ( @Value1 , @Value2 , @Value3 ) SET NOCOUNT OFF GO
OR
CREATE PROC dbo.procTable_INS AS SET NOCOUNT ON INSERT INTO [table1] ( [Column1] , [Column2] , [Column3] ) SELECT [Column1] = T1.col1 , [Column2] = T1.col2 , [Column3] = T2.col3 FROM dbo.Table1 T1 INNER JOIN ON Table2 T2 ON T1.ID = T2.ID WHERE T1.[col1] = 'xxx' AND T2.[Col3] = 'yyy' SET NOCOUNT OFF GO
Effacer
CREATE PROC dbo.procTable_DEL AS SET NOCOUNT ON DELETE FROM [dbo].[Table1] T1 INNER JOIN ON [dbo].[Table2] T2 ON T1.[ID] = T2.[ID] WHERE T1.[col1] = 'xxx' AND T2.[Col3] = 'yyy' SET NOCOUNT OFF GO
Si vous google, il existe de nombreuses normes de codage. Par exemple,
Norme et directive de codage de base de données
et
Liste complète des normes et directives de codage de la base de données SQL SERVER
D'un très très beau blog sur PostgreSQL, mais ce sujet est applicable en général:
Requêtes maintenables - mon point de vue (depesz.com)
... j'ai décidé que mes priorités pour l'écriture de requêtes maintenables:
Évitez de taper inutile.
Utilisez des alias pour les tables/vues . Toujours. Et les rendre sensibles alias.
Indentez le code d'une certaine manière.
Évitez les citations (oui, c'est pourquoi je Déteste Django)
Utiliser la syntaxe de jointure
Je suis d'accord avec la capitalisation des mots réservés et tout autre identifiant, sauf le mien.
Personnellement, je n'aime pas préfixer un nom de procédure stockée avec sp_ - il est redondant, IMO. Au lieu de cela, j'aime bien les préfixer avec un identifiant "unité de fonctionnalité". par exemple. J'appellerai les sprocs pour traiter les commandes order_Save, order_GetById, order_GetByCustomer, etc. Elles sont toutes logiquement regroupées dans le studio de gestion et il est plus difficile de choisir le mauvais. (GetOrderByProduct, GetCustomerById, etc ...)
Bien sûr, il s'agit d'une préférence personnelle, d'autres personnes peuvent préférer disposer de tous les fichiers Get Get ensemble, de tous les fichiers Save, etc.
Juste mon 2c.
Je suis surpris que le style de codage que j'ai utilisé pendant presque 20 ans ne figure pas sur cette liste:
SELECT column1,
column2,
column3,
COALESCE(column4, 'foo') AS column4
FROM tablename
WHERE column1 = 'bar'
ORDER BY column1,
column2
Je trouve cela absolument lisible, mais j’admets que c’est fastidieux de taper. Si aligner correctement les mots-clés est trop, je choisirais de les aligner à gauche:
SELECT column1,
column2,
column3,
COALESCE(column4, 'foo') AS column4
FROM tablename
WHERE column1 = 'bar'
ORDER BY column1,
column2
Je garde généralement très peu par ligne, à savoir:
select
col1,
col2,
col3
from
some_table tabl1
where
col1 = 'some'
and
(
col2 = 'condition'
or col2 = 'other'
)
Google pour jolie imprimante ou regarder ici . Je n'ai pas essayé moi-même, mais cela vous donne un bon départ. La plupart des outils commerciaux comme Toad ont une option de "formatage" qui aide également.
Jouez avec www.sqlinform.com - Je vous recommande d’utiliser la norme ANSI-92 , puis de jolies choses avec ce site.
SELECT c.id
, c.name
, c.folder
, cs.num_users active_members
, cs.num_videos
FROM campaign c
JOIN campaign_stats cs
ON cs.campaign_id = c.id
JOIN (SELECT _c.id
, _c.name
FROM campaign _c
WHERE _c.type = 9) t_c
ON t_c.id = c.id
WHERE c.id IN (1,2,3)
AND cs.num_videos > 10
Cela fonctionne très bien pour nous.
Cette requête n’a pas beaucoup de sens puisque j’ai essayé de la construire rapidement à titre d’exemple ...
mettre des virgules au début des nouvelles lignes facilite la construction de requêtes dynamiques:
$sql .= ", c.another_column"
tout le reste est simple.
Tout en bleu est en majuscule SELECT
, DELETE
, GO
, etc.
Les noms de table sont singuliers comme la table qui contient nos clients serait la table de client
Les tables de liaison sont tablename_to_tablename
utiliser _
entre les travaux dans les noms de table et les paramètres
exemple
BEGIN
SELECT
Company.ID AS Company_ID,
Company.Client_Name,
Company.Website,
Office.Office_Name
FROM
Company_Office WITH(NOLOCK)
INNER JOIN Company WITH(NOLOCK) ON Company_Office.Company_ID = Company.ID
WHERE
END
Types de données à utiliser: Nous ne devrions utiliser que les types de données suivants:
Donne la valeur par défaut pour le type de données BIT. Les noms de table et de colonne ne doivent jamais être en minuscule. Il devrait décrire son but. Évitez d’utiliser des formes abrégées . Lors de la création d’une table FK et PK pour être bien pensé et défini . Les noms de variables doivent commencer par une/deux lettre (s) en indiquant le type de données en minuscule. La variable INT doit commencer par i. Le nom doit être descriptif et les formes abrégées doivent être évitées. Chaque mot doit commencer par une lettre majuscule suivie de toutes les lettres minuscules.
Par exemple.
Manière correcte: - iTotalCount
Manière incorrecte: - xyz
Les colonnes de table utilisées avec la clause «WHERE» dans les procédures stockées doivent être indexées/indexées. Cela augmentera la vitesse de traitement des données . La commande des paramètres dans la clause WHERE doit être effectuée correctement. La clé primaire/index doit précéder les variables de bits . E.g.:- Un index est créé sur une combinaison de colonnes (REF_ID, T_TYPE_STR, CNUMBER, TLOG_ID)
- Manière correcte d’utiliser les clés indexées en séquence dans la clause ‘WHERE’
SELECT REF_ID,T_TYPE_STR,C_NUMBER,TLOG_ID
FROM T_T_DATA_tbl
WHERE REF_ID = 1
AND LOG_ID = ‘4042654’
AND T_TYPE_STR = ‘SA’
AND CNUMBER = ‘10702’
–Incorrect way
SELECT REF_ID, T_TYPE_STR, CNUMBER, LOG_ID
FROM T_T_DATA_tbl
WHERE LOG_ID = ‘4042654’
AND T_TYPE_STR = ‘SA’
Lors de l'écriture d'une procédure stockée, nous devrions avoir au début une section de description qui contiendraAuteur:
Date de création:
La description:
Si un sp est modifié, cette section doit être ajoutée avec
Modifié par:
Modifié le:
La description:
La colonne ROW_INSERTION_DATE_TIME ET ROW_UPDATION_DATE_TIME doit avoir les valeurs par défaut GETDATE ().
Plus à: http://www.writeulearn.com/sql-database-coding-standards/