【发布时间】:2011-07-28 19:41:35
【问题描述】:
我正在创建用于在我的 SQL Server 数据库中插入和更新数据的存储过程。起初我正在为 Add/Set 创建一个单独的过程,但后来我偶然发现了一个查询,该查询允许我将它们压缩为一个过程。我想与 SO 社区核实以这种方式进行的任何可能的未来问题。
单独的程序
--INSERT Procedure
CREATE PROCEDURE [dbo].[AddDataType]
@TypeName [nvarchar](255),
@TypeProperty [nvarchar](255)
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO DataType(TypeName, TypeProperty)
VALUES(@TypeName, @TypeProperty)
SELECT SCOPE_IDENTITY()
END
--UPDATE Procedure
CREATE PROCEDURE [dbo].[SetDataType]
@ID [int],
@TypeName [nvarchar](255),
@TypeProperty [nvarchar](255)
AS
BEGIN
SET NOCOUNT ON;
UPDATE DataType SET TypeName = @TypeName, TypeProperty = @TypeProperty
WHERE ID = @ID
END
EXEC AddDataType @TypeName = 'Test Name', @TypeProperty = 'Test Property' --INSERT
EXEC SetDataType @ID = 42, @TypeName = 'Test Name', @TestProperty = 'Test Property' --UPDATE
合并
CREATE PROCEDURE [dbo].[SetDataType]
@ID [int] = NULL,
@TypeName [nvarchar](255),
@TypeProperty [nvarchar](255)
AS
BEGIN
SET NOCOUNT ON;
UPDATE DataType SET TypeName = @TypeName, TypeProperty = @TypeProperty
WHERE ID = @ID
IF @@ROWCOUNT = 0
INSERT INTO DataType(TypeName, TypeProperty)
VALUES(@TypeName, @TypeProperty)
IF @ID IS NULL
SELECT SCOPE_IDENTITY()
END
EXEC SetDataType @TypeName = 'New Type Name', @TypeProperty = 'New Type Property' --INSERT
EXEC SetDataType @ID = 42, @TypeName = 'Updated Type Name', @TypeProperty = 'Updated Type Property' --UPDATE
到目前为止,我有 15 个类型表,我为它们创建了过程,并试图减少创建的过程的数量,但是我不想牺牲性能。我知道第二种方法需要更多处理,但它是否足以引起问题?我没有看到存储大量数据的类型表,不超过 100 条记录,平均在 10-20 条左右。
感谢任何想法或建议。
【问题讨论】:
-
我个人更喜欢有单独的、有重点的程序——我不喜欢那些做各种事情的“全部做然后再做一些”的方法——这一切都取决于什么你传入的值....
-
@marc_s 我对搜索过程没意见,即使对于各种参数 (DRY),大部分逻辑都没有改变。在 MERGE 之前(除非应用程序可能不知道此项目是新项目还是现有项目),对于 DML,我通常同意您的看法。
-
如果不存在,您将在尝试更新时进行扫描。问题是真的,你想要有好的 SQL 性能还是更少的 procs?
标签: sql-server sql-server-2008 stored-procedures