多行参数字符串到单个存储过程

时间:2016-08-09 08:20:24

标签: sql-server stored-procedures

我有一个模仿MYSQL'UPSERT'命令的存储过程。即。如果记录存在,则插入if new / update现有。

我希望将对SQL Server的调用次数保持在绝对最小值,即。 1

我可以将param字符串传递给存储过程(SP_MAIN),然后在此存储过程中为每个唯一的表行调用我的'UPSERT'存储过程,该行作为参数传递给SP_MAIN ......? 如果是这样,任何人都可以通过一个简单的例子来说明..? 提前谢谢。

1 个答案:

答案 0 :(得分:1)

您可以使用合并声明。请参阅下面的示例:要更新的表是dbo.Table。我们使用表值参数来更新/插入数据。合并语句在存储过程中

创建表dbo。[表] (     PrimaryKey INT IDENTITY(1,1)NOT NULL     ,Column1 INT NOT NULL     ,Column2 INT NOT NULL ) GO

创建类型dbo。[TableTVP] AS TABLE(     PrimaryKey INT NULL     ,Column1 INT NULL     ,Column2 INT NULL ) GO

创建程序dbo.CRUD_Table     @TableTVP dbo.TableTVP READONLY AS

设置NOCOUNT

DECLARE @OutPut TABLE(Action VARCHAR(10)NULL,EntityKey INT NULL)

MERGE dbo。[表] AS TARGET 使用(选择         首要的关键         ,列1         ,列2         ,BINARY_CHECKSUM(Column1,Column2)作为DataCheckSum     从         @TableTVP)来源SOURCE.PrimaryKey = TARGET.PrimaryKey     当匹配和SOURCE.DataCheckSum<> BINARY_CHECKSUM(TARGET.Column1,TARGET.Column2)那么         更新集             Column1 = SOURCE.Column1             ,Column2 = SOURCE.Column2
    当没有匹配时         插入 (             列1             ,列2
        )         价值观(             SOURCE.Column1             ,SOURCE.Column2
        )     OUTPUT $动作为[动作]         ,例如$操作IN(' INSERT','更新')然后Inserted.PrimaryKey ELSE Deleted.PrimaryKey END as [EntityKey] INTO @OutPut; SELECT Action,EntityKey FROM @OutPut GO