sql-server – 用于INSERT和UPDATE的SQL Server存储过程,更好地分离或压缩?

前端之家收集整理的这篇文章主要介绍了sql-server – 用于INSERT和UPDATE的SQL Server存储过程,更好地分离或压缩?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在创建用于在sql Server数据库中插入和更新数据的存储过程.起初我正在为Add / Set创建一个单独的过程,但后来我偶然发现了一个允许我将它们压缩成一个过程的查询.我想与SO社区核实任何可能的未来问题,这样做.

单独的程序

  1. --INSERT Procedure
  2. CREATE PROCEDURE [dbo].[AddDataType]
  3. @TypeName [nvarchar](255),@TypeProperty [nvarchar](255)
  4. AS
  5. BEGIN
  6. SET NOCOUNT ON;
  7.  
  8. INSERT INTO DataType(TypeName,TypeProperty)
  9. VALUES(@TypeName,@TypeProperty)
  10.  
  11. SELECT SCOPE_IDENTITY()
  12. END
  13.  
  14. --UPDATE Procedure
  15. CREATE PROCEDURE [dbo].[SetDataType]
  16. @ID [int],@TypeName [nvarchar](255),@TypeProperty [nvarchar](255)
  17. AS
  18. BEGIN
  19. SET NOCOUNT ON;
  20.  
  21. UPDATE DataType SET TypeName = @TypeName,TypeProperty = @TypeProperty
  22. WHERE ID = @ID
  23. END
  24.  
  25. EXEC AddDataType @TypeName = 'Test Name',@TypeProperty = 'Test Property' --INSERT
  26. EXEC SetDataType @ID = 42,@TypeName = 'Test Name',@TestProperty = 'Test Property' --UPDATE

综合

  1. CREATE PROCEDURE [dbo].[SetDataType]
  2. @ID [int] = NULL,TypeProperty = @TypeProperty
  3. WHERE ID = @ID
  4.  
  5. IF @@ROWCOUNT = 0
  6. INSERT INTO DataType(TypeName,TypeProperty)
  7. VALUES(@TypeName,@TypeProperty)
  8.  
  9. IF @ID IS NULL
  10. SELECT SCOPE_IDENTITY()
  11. END
  12.  
  13. EXEC SetDataType @TypeName = 'New Type Name',@TypeProperty = 'New Type Property' --INSERT
  14. EXEC SetDataType @ID = 42,@TypeName = 'Updated Type Name',@TypeProperty = 'Updated Type Property' --UPDATE

到目前为止,我有15个类型表,我创建了程序,并试图减少创建的程序数,但我不想牺牲性能.我知道第二种方法是更多的处理,但它是否足以导致问题?我没有看到类型表保存大量数据,不超过100条记录,平均值大约为10-20.

任何想法或建议表示赞赏.

解决方法

什么版本的sql Server?此信息始终有用,因此请养成使用特定版本标记问题的习惯.

如果是sql-server-2008或更高版本,您可能会考虑MERGE而不是单独的INSERT / UPDATE操作,但是自从写完这个答案后我肯定改变了我的观点并且更喜欢你提出的UPDATE / IF @@ ROWCOUNT = 0 / INSERT方法.有关更多信息,请参阅我写的这篇文章

> Use Caution with SQL Server’s MERGE Statement

这是一个MERGE示例(在tempdb中运行它),但我再次建议不要使用它.

  1. CREATE TABLE dbo.DataType
  2. (
  3. ID int IDENTITY(1,1),TypeName nvarchar(255),[TypeProperty] nvarchar(255),CONSTRAINT PK_DataType PRIMARY KEY (ID)
  4. );
  5.  
  6. INSERT dbo.DataType(TypeName,[TypeProperty]) VALUES (N'name 1',N'property 1');
  7. GO

然后一个程序:

  1. CREATE PROCEDURE dbo.MergeDataType
  2. @ID int = NULL,@TypeName nvarchar(255),@TypeProperty nvarchar(255)
  3. AS
  4. BEGIN
  5. SET NOCOUNT ON;
  6.  
  7. WITH [source](ID,TypeName,[TypeProperty]) AS
  8. (
  9. SELECT @ID,@TypeName,@TypeProperty
  10. )
  11. MERGE dbo.DataType WITH (HOLDLOCK) AS [target]
  12. USING [source] ON [target].ID = [source].ID
  13. WHEN MATCHED THEN
  14. UPDATE SET [target].TypeName = @TypeName,[target].[TypeProperty] = @TypeProperty
  15. WHEN NOT MATCHED THEN
  16. INSERT (TypeName,[TypeProperty])
  17. VALUES (@TypeName,@TypeProperty);
  18. END
  19. GO

现在让我们运行它并检查结果:

  1. EXEC dbo.MergeDataType
  2. @TypeName = N'foo',@TypeProperty = N'bar';
  3.  
  4. EXEC dbo.MergeDataType
  5. @ID = 1,@TypeName = N'name 1',@TypeProperty = N'new property';
  6. GO
  7.  
  8. SELECT ID,[TypeProperty] FROM dbo.DataType;
  9. GO

清理:

  1. DROP TABLE dbo.DataType;
  2. DROP PROCEDURE dbo.MergeDataType;

猜你在找的MsSQL相关文章