Quelle norme de codage SQL suivez-vous? [fermé]
y a-t-il une norme de codage SQL largement utilisée? SQL est un peu différent des langages de programmation de type C/C++. Vraiment Je ne sais pas comment le formater au mieux pour la lisibilité.
14 réponses
ne l'appellerait pas la norme de codage - plus comme le 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'
- majuscule mots réservés
- mots clés principaux sur la nouvelle ligne
- ne peut pas obtenir utilisé à des virgules avant de colonnes
- toujours utiliser de courts alias de table significatifs
- vues préfixées avec v
- préfixe procs stocké avec sp (cependant n'utilisez pas " sp_ " qui est réservé pour intégré procs)
- n'a pas de préfixe des tables
- noms de table singulier
j'aime la virgule qui précède:
SELECT
column1
, column2
, column3
, COALESCE(column4,'foo') column4
FROM
tablename
WHERE
column1 = 'bar'
ORDER BY
column1
, column2
il est le plus facile à lire et à déboguer à mon avis.
je sais que c'est long, mais garder avec moi, c'est important. Cette question a ouvert une boîte fraîche de vers. Et si vous n'aimez pas les blocs de base de données, lisez la suite.
Et, avant que quelqu'un pense à faire tomber ma réponse, s'il vous plaît voir l'article suivant et connecté articles sur le verrouillage, et recompile; deux des plus dommageables ressources frappe sur une base de données SQL.
http://support.microsoft.com/kb/263889
je peux taper assez rapidement, et je n'aime pas taper, pas plus que la prochaine personne. Mais les points ci-dessous que je suis de très près, même s'il est plus dactylographié. Tellement que j'ai créé mes propres applications SP 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", alors vous n'avez pas lu les articles ci-dessus. et , c'est totalement débile que m$ mette ces points en NOTEs. Pour moi, ces questions devraient être audacieuses et hurlantes.
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 bonnes (10 ans de valeur) pour rendre le script SPs plus facile et surtout plus rapide.
il y a plus que cela, mais c'est ce que je fais pour les 60% premiers de tout.
meilleures pratiques
- utilisez les crochets autour des objets, de sorte que le moteur de requête connaît un champ quand il le voit
- utilisez le même cas que les noms d'objet de table et les noms de champ
- lorsque vous appelez SPs à partir de l'application, utilisez le [dbo] entièrement qualifié.[procName] avec le propriétaire correct et case. Pas De Blague! Lisez les articles ci-dessus!
- référence au propriétaire de l'objet de sorte que la sécurité est explicitement connue et n'a pas à être compris
- NE PAS nous sp_ "ce qui" fait référence à stockée système procs, et les frais généraux de l'1519350920"
- utilisez SET NOCOUNT ON et SET NOCOUNT OFF pour éliminer les frais généraux supplémentaires pour garder une trace du nombre de dossiers mis à jour dans le proc stocké à moins que vous ayez besoin d'eux. Normalement, vous n'avez pas et vous pouvez gagner une énorme augmentation de la performance.
Préférences
- Préfixe stockées procs avec proc
- suffixe chaque proc stocké avec SEL, UPD, DEL, INS (ou SELECT, UPDATE, DELETE, INSERT)
- majuscules mots réservés
- mots-clés Principaux sur une nouvelle ligne (script)
- utiliser les virgules avant les colonnes (scripting)
- Préfixe de vues avec vw
- N'a pas de préfixe des tables
- noms de Table singulier
- ajouter un suffixe aux noms standards comme "_ByPK", "_OrderByLastName", ou "_Top15Orders" pour les variations sur le stock SP
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
mise à 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
ou
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
Supprimer
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 ya beaucoup de normes de codage là-bas. Par exemple,
Base de données de la Norme de Codage et de l'Orientation
et
Base de données SQL SERVER de Codage des Normes et des lignes Directrices Liste Complète
D'un très très beau blog sur PostgreSQL, mais ce sujet est applicable en général:
demandes maintenables - mon point de vue (depesz.com)
...J'ai décidé que mes priorités pour écrire des requêtes maintenables:
éviter les fautes de frappe inutiles.
utiliser des alias pour les tables/vues. Toujours. Et de faire eux sensible alias.
Indenter le code, d'une certaine façon.
Éviter les citations (oui, c'est pourquoi je la haine de Django)
utiliser la syntaxe de jointure
je suis d'accord avec la capitalisation des mots réservés et de tout autre identificateur, sauf le mien.
personnellement, je n'aime pas préfixer un nom de procédure stocké avec sp_ - il est redondant, IMO. Au lieu de cela, j'aime les préfixer avec un identifiant "Unité de fonctionnalité". par exemple, je vais appeler les sproc pour traiter avec orders order_Save, order_GetById, order_GetByCustomer, etc. Il les maintient tous logiquement groupés dans le studio de gestion et rend plus difficile de choisir le mauvais. (GetOrderByProduct, GetCustomerById, etc...)
bien sûr, c'est la préférence personnelle, autre les gens préfèrent avoir tous les Obtenir sprocs ensemble, tous les Sauver, etc.
juste mon 2c.
je garde généralement très peu par ligne, c'est-à-dire:
select
col1,
col2,
col3
from
some_table tabl1
where
col1 = 'some'
and
(
col2 = 'condition'
or col2 = 'other'
)
je suis surpris que le style de codage que j'ai utilisé pendant presque 20 ans n'est 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 le plus lisible, mais j'admets qu'il est fastidieux de taper. Si aligner à droite les mots-clés est trop, j'opterais pour l'alignement à gauche:
SELECT column1,
column2,
column3,
COALESCE(column4, 'foo') AS column4
FROM tablename
WHERE column1 = 'bar'
ORDER BY column1,
column2
Play around with www.sqlinform.com -je recommande d'utiliser le norme ANSI-92 , et puis joli 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
ça marche plutôt bien pour nous.
cette requête réelle n'a pas beaucoup de sens puisque j'ai essayé de la Construire rapidement comme un exemple... mais ce n'est pas le point.
- t_c est l'abréviation de category table sub-query ou "temp category".
- _underscoring de trucs à l'intérieur des sous-requêtes.
- alias noms de colonne pour donner un sens dans le contexte de la requête. par exemple "active_members "
-
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.
N'importe quoi en bleu est en majuscule SELECT
, DELETE
, GO
, etc
les noms de Table sont singuliers comme la table qui détient nos clients serait la table de client
les tables de liaison sont tablename_to_tablename
utiliser _
entre les œuvres dans les noms des tables et des 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:
- INT
- BIGINT
- SMALLINT
- VARCHAR
- BIT
- DATETIME
donne la valeur par défaut pour le type de données BIT. Il ne devrait pas être nullable Les noms de Table et de colonne ne doivent jamais être en minuscules. Il devrait décrire son objet. Éviter l'utilisation de courtes forme. Tout en créant un tableau FK et PK pour être bien pensé et défini. Les noms des Variables doivent commencer par une lettre ou deux indiquant le type de données en minuscules. Par exemple, la variable INT doit commencer par I. Le nom doit être descriptif et les formulaires courts doivent être évités. Chaque mot doit commencer par une lettre majuscule suivie de toutes les petites lettres.
E. G.
de façon Correcte: – iTotalCount
chemin Incorrect: - xyz
Les colonnes du tableauutilisées avec la clause" où " à l'intérieur des procédures stockées devraient être indexées/saisies. Cela permettra d'accroître la vitesse de traitement des données. L'ordre des paramètres dans la clause WHERE doit être fait correctement. La clé primaire / l'index doit précéder les variables binaires. Par exemple: - Un index est créé sur une combinaison de colonnes (REF_ID, T_TYPE_STR, CNUMBER, TLOG_ID)
- manière correcte où les clés indexées sont utilisées dans l'ordre dans la clause "où
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’
En écrivant une procédure stockée, nous devrions avoir la section description Au début qui contiendra Auteur:
Date de création:
Description:
si un sp est modifié, cette section doit être ajoutée avec
modifié par:
Modifié le:
Description:
ROW_INSERTION_DATE_TIME et la colonne ROW_UPDATION_DATE_TIME devrait avoir valeurs par défaut comme GETDATE ().
plus à : http://www.writeulearn.com/sql-database-coding-standards /
create table
#tempTable (
col1 int,
col2 int,
col3 int
)
insert into
#tempTable (
col1,
col2,
col3
)
select
col1,
col2,
col3
from
Table3
inner join Table2
on Table1.col1 = Table2.col2
where col1 = 5
select
col2,
case when col1 = 3
then 'something'
else 'somethingelse'
end
from #tempTable
where
col1 = 5
and (
col2 = 5
or col3 in (
select field
from Table2
where
somecol = 2
and othercol = 5
)
)