広く使用されているSQLコーディング標準はありますか? SQLは、C/C++タイプのプログラミング言語とは少し異なります。読みやすくするために最適なフォーマットを設定する方法はわかりません。
コーディング標準とは呼ばない-コーディングスタイルに近い
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'
私はこれが長いことを知っていますが、私と一緒に耐えてください、それは重要です。この質問は、ワームのクールな缶を開きました。データベースブロックが気に入らない場合は、読み進めてください。
そして、誰かが私の応答をノックダウンすることを考える前に、くださいロックと再コンパイルに関する次の記事とそれに関連する記事を参照してください。 SQLデータベースで最も有害なリソースヒットの2つ。
http://support.Microsoft.com/kb/263889
私はかなりすばやく入力できますが、次の人以外は入力したくありません。しかし、以下のポイントは、タイピングが多い場合でも非常に厳密に続きます。あまりにも多くのことで、独自のSPアプリを作成してくれました。
私が取り上げるポイントは本当に重要です! 「冗談ですか、それは問題ではない」と自分自身に言うこともできますが、その後、上記の記事を読んでいませんでした。 [〜#〜] and [〜#〜]、M $がこれらのポイントをメモとして入れるのは完全にモロニックです。私にとってこれらの問題は、大胆かつ悲鳴を上げるべきです。
また、開発をスピードアップするためにC#アプリケーションを使用して基本的なスクリプトを構築するために多くのコーディングを行います。これらのプラクティスは、SPのスクリプト作成をより簡単かつ特に高速にするために非常に適切です(10年分の価値があります)。
これ以上のものがありますが、これは私がすべての最初の60%に対して行うことです。
ベストプラクティス
設定
選択する
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
更新
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
インサート
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
削除する
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
私はコンマの前の方法が好きです:
SELECT
column1
, column2
, column3
, COALESCE(column4,'foo') column4
FROM
tablename
WHERE
column1 = 'bar'
ORDER BY
column1
, column2
私の意見では読みやすく、デバッグしやすくなっています。
Googleを使用する場合、コーディング標準はたくさんあります。例えば、
そして
PostgreSQLに関する非常に素晴らしいブログからですが、このトピックは一般的に適用可能です:
...保守可能なクエリを作成するための優先順位を決定しました。
無駄なタイピングを避けてください。
テーブル/ビューのエイリアスを使用します。常に。そして、それらを適切なエイリアスにします。
何らかの方法でコードをインデントします。
引用を避けます(はい、これが私がDjangoを嫌う理由です)
結合構文を使用する
私は、予約語と他のすべての識別子の大文字化に同意しますが、自分のものは除きます。
個人的に、ストアドプロシージャ名の前にsp_を付けるのは好きではありません。IMOという冗長なものです。代わりに、「機能単位」識別子をプレフィックスに追加するのが好きです。例えば私はsprocsを呼び出して、order_Save、order_GetById、order_GetByCustomerなどの注文を処理します。これらはすべて管理スタジオで論理的にグループ化され、間違ったものを選択しにくくします。 (GetOrderByProduct、GetCustomerByIdなど)
もちろん、それは個人的な好みであり、他の人はすべてのGet sproc、すべてのSave sprocなどを持つことを好むかもしれません。
ちょうど私の2c。
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
これは私たちにとっては非常に有効です。
この実際のクエリは、例としてすばやく作成しようとしたため、あまり意味がありませんが、それはポイントではありません。
新しい行の先頭にコンマを挿入すると、動的クエリを簡単に作成できます。
$sql .= ", c.another_column"
他のすべては簡単です。
私が20年近く使ってきたコーディングスタイルがこのリストに載っていないことに驚いています。
SELECT column1,
column2,
column3,
COALESCE(column4, 'foo') AS column4
FROM tablename
WHERE column1 = 'bar'
ORDER BY column1,
column2
これは絶対に最も読みやすいと思いますが、入力するのは面倒です。キーワードの右揃えが多すぎる場合は、左揃えを選択します。
SELECT column1,
column2,
column3,
COALESCE(column4, 'foo') AS column4
FROM tablename
WHERE column1 = 'bar'
ORDER BY column1,
column2
私は通常、行ごとにほとんど保持しません、すなわち:
select
col1,
col2,
col3
from
some_table tabl1
where
col1 = 'some'
and
(
col2 = 'condition'
or col2 = 'other'
)
Google for SQL pretty printerまたはlook here 。私は自分で試したことはありませんが、良いスタートを切ることができます。 Toadのようなほとんどの商用ツールには、「フォーマット」オプションもあります。
www.sqlinform.com をいじってみてください- ANSI-92標準 を使用することをお勧めします。
青の部分はすべて大文字のSELECT
、DELETE
、GO
などです。
テーブル名は、顧客を保持するテーブルが顧客テーブルであるように単数形です
リンクテーブルはtablename_to_tablename
使用する _
テーブル名とパラメーターの作品間
例
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
使用するデータ型:次のデータ型のみを使用する必要があります。
BITデータ型のデフォルト値を指定します。 nullを許可することはできません。テーブル名と列名を小文字にすることはできません。目的を説明する必要があります。短い形式の使用は避けてください。テーブルFKとPKを作成する際、よく考えて定義します。変数名は、小文字のデータ型を示す1文字または2文字で始まる必要があります。たとえばINT変数はiで始まる必要があります。名前はわかりやすく、短い形式は避けてください。各Wordは大文字で始まり、すべての小文字が続く必要があります。
例えば。
正しい方法:– iTotalCount
間違った方法:– xyz
ストアドプロシージャ内で "WHERE"句で使用されるテーブル列には、インデックス/キーが必要です。これにより、データ処理の速度が向上します。 WHERE句のパラメーターの順序は適切に行われる必要があります。主キー/インデックスはビット変数の前に置く必要があります。例:-列の組み合わせでインデックスが作成されます(REF_ID、T_TYPE_STR、CNUMBER、TLOG_ID)
—インデックスキーが「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’
ストアドプロシージャを記述している間、冒頭にAuthorを含む説明セクションが必要です。
作成日:
説明:
Spが変更された場合、このセクションに追加する必要があります
によって変更:
変更日:
説明:
ROW_INSERTION_DATE_TIMEおよびROW_UPDATION_DATE_TIME列には、GETDATE()のデフォルト値が必要です。
詳細: http://www.writeulearn.com/sql-database-coding-standards/