2012-10-25 47 views
1

我想寫正確的SQL查詢,我需要知道SQL格式的標準。我不是指邏輯或效率,我的意思是正確的縮進和空格。在命令的情況下,我也很有趣。是否有任何正確的SQL格式模式?

是否有任何正確的SQL格式模式(標準)?

+1

我使用http://poorsql.com/ – Tariqulazam

+0

http://programmers.stackexchange.com/questions/114346/algorithm-for-formating-sql-code – RGO

+2

沒有太多的正式標準,但我懷疑至少有一本Celko書可以涵蓋它。您可以通過標記爲[SQL](http://stackoverflow.com/questions/tagged/sql)的問題來查看代碼,特別是在答案中查看人們如何格式化SQL以用於演示。問題的格式通常不及答案。 –

回答

1

看看Database Coding Standard and Guideline。它自2008年以來已經過時了,但我還找不到更好的東西。我在幾個月前正在尋找這個,看起來非常好。

我在看oracle和mysql的網站,但是「怪物」從未發表過正式的論文。

+0

謝謝!這就是我一直在尋找的。 –

1

好吧,我現在不開始討論大寫表名,但大多數情況下你會考慮如何格式化select/update/insert/delete語句。在巴勃羅·多明戈斯giben文檔,他們暗示格式化選擇這樣

select  t.Task_Id, 
      t.Course_Id, 
      t.Due_Dt, 
      t.Start_Time, 
      t.End_Time, 
      t.Name, 
      et.Completed_Flag, 
      et.Completed_Dt 
from BusyWork.dbo.TB_TASK t 
inner join BusyWork.dbo.ENROLLMENTTASK et 
on t.Task_Id = et.Task_Id 
where t.Due_Dt >= @pStartDate 
and t.Due_Dt <= @pEndDate 
and et.Member_Id = @pMemberId 
order by t.Due_Dt, 
      t.Start_Time 

我可以說,這是很難(對我來說)來讀取這樣的腳本,尤其是from的一部分,所以在我們的系統,我們使用這樣

select 
    t.Task_Id, 
    t.Course_Id, 
    t.Due_Dt, 
    t.Start_Time, 
    t.End_Time, 
    t.Name, 
    et.Completed_Flag, 
    et.Completed_Dt 
from BusyWork.dbo.TB_TASK as t 
    inner join BusyWork.dbo.ENROLLMENTTASK as et on t.Task_Id = et.Task_Id 
where 
    t.Due_Dt >= @pStartDate and t.Due_Dt <= @pEndDate and 
    et.Member_Id = @pMemberId 
order by t.Due_Dt, t.Start_Time 

update約定,delete陳述我一直想寫from條款,所以我總是可以輕鬆地改寫update/deleteselect測試它

update BusyWork.dbo.TB_TASK set 
    Due_Dt = getdate(), 
    Name = 'updated' 
from BusyWork.dbo.TB_TASK as T 
    inner join BusyWork.dbo.ENROLLMENTTASK as et on t.Task_Id = et.Task_Id 
where 
    t.Due_Dt >= @pStartDate and t.Due_Dt <= @pEndDate 

delete BusyWork.dbo.TB_TASK 
from BusyWork.dbo.TB_TASK as T 
    inner join BusyWork.dbo.ENROLLMENTTASK as et on t.Task_Id = et.Task_Id 
where 
    t.Due_Dt >= @pStartDate and t.Due_Dt <= @pEndDate 

insert聲明,我試圖避免values條款,所以我也可以很容易地重寫聲明爲純select。始終在插入中明確指定列以避免在添加/刪除表中的字段後出現問題。也可以嘗試使用列別名,所以當你使用普通select

insert into BusyWork.dbo.TB_TASK 
(
    Due_Dt, 
    Name 
) 
select 
    getdate() as Due_Dt, 
    'New' as Name 

另一條規則測試它,你可以檢查正確的價值觀 - 總是用別名列和表/圖/表函數。將來修改語句會更容易,它可以幫助您在更改表模式時避免一些令人討厭的錯誤。

+0

我也不喜歡巴勃羅的多明戈斯的方式。你的更好。但它只是SELECT示例。 –

+0

我不認爲我喜歡你的風格「*避免價值條款*」。我認爲這會讓意圖變得更加混亂(並且並非所有DBMS都允許沒有FROM的SELECT)。 –

+0

是的,它可能不適合其他RDBMS,但對於我非常喜歡的SQL服務器。它並不令人困惑,而且更容易支持和維護這樣的代碼 –