我知道这很长,但请耐心等待,这很重要。这个问题打开了一个很酷的蠕虫罐头。如果您不喜欢数据库块,请继续阅读。
并且,在任何人考虑取消我的回复之前,请查看以下文章以及与之相关的有关锁定和重新编译的文章; SQL 数据库上的两个最具破坏性的资源。
http://support.microsoft.com/kb/263889
我打字很快,而且我不喜欢比下一个人打字。但是我非常关注以下几点,即使它是更多的打字。以至于我已经构建了自己的 SP 应用程序来为我做这件事。
我提出的观点非常重要!你甚至可能对自己说,“你在开玩笑吧,这不是问题”,好吧,那你就没有读过上面的文章。 并且,M$ 将这些点作为注释放入是完全愚蠢的。这些问题对我来说应该是大胆的和尖叫的。
我还使用 C# 应用程序构建我的基本脚本以加快开发速度,并且这些实践非常有效(10 年的价值),使脚本 SP 更容易,尤其是更快。
还有更多,但这是我为前 60% 所做的一切。
最佳做法
- 在对象周围使用方括号,以便查询引擎在看到字段时明确知道该字段
- 使用 THE SAME CASE 作为表对象名称和字段名称
- 从应用程序调用 SP 时,使用具有正确所有者和大小写的完全限定 [dbo].[procName]。不开玩笑!阅读以上文章!
- 引用对象的所有者,以便明确了解安全性并且不必弄清楚
- 不要使用“sp_”,因为它指的是系统存储的过程和开销
- 使用 SET NOCOUNT ON 和 SET NOCOUNT OFF 来消除额外的开销来跟踪存储过程中更新了多少记录,除非您需要它们。通常情况下,您不会这样做,但您可以获得巨大的性能提升。
首选项
- 为存储的过程添加前缀 proc
- 为每个存储过程添加 SEL、UPD、DEL、INS(或 SELECT、UPDATE、DELETE、INSERT)后缀
- 保留字大写
- 新行上的主要关键字(脚本)
- 在列前使用逗号(脚本)
- 以 vw 为视图添加前缀
- 不要给表格加前缀
- 表名单数
- 为标准名称添加后缀,例如“_ByPK”、“_OrderByLastName”或“_Top15Orders”,以表示股票 SP 的变体
选择
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
或
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