我有一个模仿MYSQL'UPSERT'命令的存储过程。即。如果记录存在,则插入if new / update现有。
我希望将对SQL Server的调用次数保持在绝对最小值,即。 1
我可以将param字符串传递给存储过程(SP_MAIN),然后在此存储过程中为每个唯一的表行调用我的'UPSERT'存储过程,该行作为参数传递给SP_MAIN ......? 如果是这样,任何人都可以通过一个简单的例子来说明..? 提前谢谢。
答案 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