您在SQL Server存储过程中使用什么缩进样式?

时间:2009-07-01 17:04:58

标签: sql-server stored-procedures coding-style

我的SQL Server存储过程编辑IDE似乎都没有任何工具来强制缩进样式,所以我发现我看到的很多存储过程都到处都是。我发现缩进确实提高了可读性。我想在我们公司的编码风格指南中编写一些存储过程缩进标准,我想知道是否有人有任何他们想要分享的最佳实践。

例如,在普通的SELECT语句中,我尝试将SELECT,FROM,WHERE,ORDER BY和GROUP BY子句保持在同一级别上,并缩进下面的任何内容。我也尝试将每个JOIN从它逻辑上加入的表中缩进一个级别。

是否有其他人有类似的建议或最佳做法?

7 个答案:

答案 0 :(得分:3)

我选择的格式:

--
-- SELECT statements
--

select 
    t1.field1, t1.field2, 
    t2.field3, 
    t3.fieldn
from 
    tblOne t1
    inner join tblTwo t2 on t1.field = t2.field and t1.field2 = t2.field2
    left join tblThree t3 on t2.field = t3.field and t2.field2 = t3.field2
    left join (
        select id, sum(quantity) as quantity
        from tbl4
        group by id
    ) t4 on t4.id=t3.id
where 
    t1.field = 'something'
    and t2.field = 'somethin else'
order by 
    fieldn

可选(当行太长时)我在逻辑边界处分割行并缩进分割部分:

    inner join tblTwo as t2 
        on t1.field = t2.field and t1.field2 = t2.field2

有时我会使用不同的语法进行非常简单的(子)选择。 主要目标是使代码可读并且相对容易修改。

- 编辑 -

恕我直言(至少在小团队中)不需要执行非常严格的规则,这有助于支持和维护:)在我们的团队中,大约3-4人编写大多数sql,很容易建立代码作者,只是看着sql语句 - 所有人都使用了不同的风格(资本化,别名,缩进等)。

答案 1 :(得分:2)

SELECT      T1.Field1,
            T1.Field2,
            T2.Field1 As Field 3
FROM        Table1 AS T1
LEFT JOIN   Table2 AS T2
ON          T1.Field1 = T2.Field7
WHERE       T1.Field9 = 5
AND         T2.Field1 < 900
ORDER BY    T2.Field1 DESC

INSERT INTO Table1 (
            Field1,
            Filed2,
            Field3 )
VALUES (    'Field1',
            'Field2',
            'Field3' )

UPDATE      Table1
SET         Field1      = SomeValue,
            Field2      = AnotherValue,
            FIeld134567 = A ThirdValue
WHERE       Field9      = A Final Value

我发现我没有必要设置缩进长度,而是根据字段名称和值的长度尝试缩进。我喜欢我的左边距沿着任何给定的垂直平面排列,我喜欢我的评估者(如等号)排队。我总是在不同的垂直平面上有任何命令项,而不是它的伴随值和字段。我还倾向于尝试使SELECT命令和Field列表之间的空间长度等于SELECT DISTINCT Field或INSERT INTO Table使用的空间。

但最后,所有这些只是我的偏好。我喜欢整洁的代码。

答案 2 :(得分:2)

我预先设定了以下风格......

Select
    Id = i.Identity,
    User = u.UserName,
From
    tblIdentities i
Inner Join
    tblUsers u On i.UserId = u.UserId
Where
(
    u.IsActive = 'True'
    And
    i.Identity > 100
)

另外,我尝试不使用As关键字。相反,我预先平等。可能会让一些人感到不安,但我觉得这段代码更容易阅读...

Select
    Id = tbl.Identity,
    User = tbl.UserName,
    Age = tbl.Age,
    DOB = tbl.DateOfBirth
From
    tbl

而不是......

Select
    tbl.Id As Identity,
    tbl.UserName As User,
    tbl.Age As Age,
    tbl.DateOfBirth As DOB
From
    tbl

答案 3 :(得分:1)

我更喜欢以下风格:

--
-- SELECT statements
--

select field1,
       field2,
       field3,
       fieldn
from tblOne as t1
inner join tblTwo as t2
    on t1.field = t2.field
    and t1.field2 = t2.field2
left outer join tblThree as t3
    on t2.field = t3.field
    and t2.field2 = t3.field2
where t1.field = 'something'
    and t2.field = 'somethin else'
order by fieldn

--
-- IF statements
--

if @someVar = 'something'
begin
    -- statements here
    set @someVar2 = 'something else'
end

--
-- WHILE statements
--

while @count < @max
begin
    set @count = @count + 1
end

答案 4 :(得分:1)

SELECT      T1.Field1,
            T1.Field2,
            T2.Field1 AS Field 3
FROM        Table1 AS T1
            LEFT JOIN Table2 AS T2 ON T1.Field1 = T2.Field7
WHERE       T1.Field9 = 5
            AND T2.Field1 < 900
ORDER BY    T2.Field1 DESC

INSERT INTO Table1 (Field1,   Field2,   Field3)
            VALUES ('Field1', 'Field2', 'Field3' ) /* for values trivial in length */

UPDATE      Table1
SET         Field1      = SomeValue,
            Field2      = AnotherValue,
            FIeld134567 = A ThirdValue
WHERE       Field9      = A Final Value

我认为我的首选格式来自于我在大学时收到的一个COBOL课程。关于非常对齐的列中的代码的一些内容让我内心开心。

答案 5 :(得分:0)

我的风格几乎与贾斯汀的风格相同。我缩进“和”,所以“和”中的“d”与“where”中的“e”对齐。

有时我会将关键字大写。当我有一个子选择时,我缩进整个子选择并将其格式化为常规选择。

如果我选择了数十个字段,我可能会偏离的地方。在这种情况下,我将几个字段放在一行中并添加空格以使偶数列文本。

答案 6 :(得分:0)

我倾向于对关键字进行右对齐:

SELECT T1.Field1, T2.Field2
  FROM Table1 AS T1
 LEFT JOIN Table2 AS T2 ON T1.Field1 = T2.Field7
 WHERE T1.Field9 = 5
   AND T2.Field1 < 900
 ORDER BY T2.Field1 DESC

请注意,这不是硬性的。我赞成让SELECT成为最左边的,我将打破理由(INNER JOIN,ORDER BY)。如果可能的话,我将打开ON和它的同类,如果可能的话,我更喜欢用关键字开始一行。

 LEFT JOIN Table2 AS T2 
        ON T1.Field1 = T2.Field7 AND T2.Field8 IS NOT NULL