SQL插入,使用合并存储过程更新

Posted

技术标签:

【中文标题】SQL插入,使用合并存储过程更新【英文标题】:SQL Insert ,Update using Merge Store Procedure 【发布时间】:2015-12-29 10:46:20 【问题描述】:

我需要为 SQL 数据库中的目标表批量处理 Insert 和/或 Update。我已经尝试过合并存储过程。在目标表中,我有一个复合键。

我需要在插入时为(键的)第一个字段生成模式。我尝试了一个用户定义的函数,该函数返回一个模式键,该键对于每一行都是唯一的。

我的问题是,如何将此函数合并到一个查询中,以便自动生成键并为每条记录插入相应的字段?

TargetTable 是我在数据库中的目标表,它有两列 - Key1(Bigint)Key2(int)。再一次,这是一个复合键。

注意:我只想为第一个字段/列生成密钥。

这是我的存储过程:

Merge Targettable as T  
Using SourceTable as s  
ON s.Key1 = T.Key1 and  
s.Key2=T.Key2  
WHEN MATCHED THEN UPDATE  
SET T.UserName = S.UserName  
WHEN NOT MATCHED THEN  
INSERT (Key1, Key2, UserName)  
VALUES (dbo.UserDefiendFunction(@parama1),Key2,userName)

UserDefinedFunction 返回我想要的模式。 这是我的用户定义函数:

Create function [dbo].[UserDefinedFunction] (  
@Param1 int)  
returns BIGINT   
AS Begin  
DECLARE @ResultVar BIGINT  
SET @ResultVar=CONVERT(BIGINT, (SELECT Cast(@Param1 AS VARCHAR(10))  
+ '' + Format((SELECT Count(userName)+1 FROM [dbo].[TableName]), '0')) )  
RETURN @ResultVar  
END

请帮我解决这个问题。提前致谢。

【问题讨论】:

using sourcetable as s代替using (select col1, col2, dbo.UserDefiendFunction(@parama1) as pattern from sourcetable) as s @Nick.McDermaid 我已经尝试过你的方法..用户定义的函数为我插入的所有行返回相同的模式..原因是用户定义的函数只被调用一次......它在插入过程中会违反主键约束...它不起作用.. 您是说两次调用具有相同 @parama1 值的 UDF,您将始终获得不同的值,并且您永远不会两次获得相同的值? @Nick.McDermaid 这里我们在合并存储过程中使用用户定义的函数。合并存储过程只扫描所有批量值一次..因此用户定义的函数只被调用一次..它永远不会被调用两次。它将为所有行提供相同的模式..在批量插入期间,我需要为每行提供不同的模式.. 你能把你的UDF代码贴出来吗? 【参考方案1】:
IF EXISTS (SELECT * FROM Table1 join table 2 on Column1='SomeValue')
UPDATE Table1 SET (...) WHERE Column1='SomeValue'
ELSE
insert into ods..Table1 (Columname)
select [DatabaseName].[dbo].[UserDefinedFunction] (@paramater) as ColumnName

【讨论】:

因为合并存储过程只扫描所有值一次..因此用户定义的函数只调用一次..模式对于我插入的所有行都是相同的......我需要为每一行使用不同的模式。 ....

以上是关于SQL插入,使用合并存储过程更新的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 上插入更新存储过程

从操作更新、删除、插入到存储过程 SQL 中设置值

如何使用 VBA 执行插入/更新记录的存储过程?

利用mysql存储过程循环插入新数据并更新

从存储过程结果集中在表上插入/更新数据

sql server中批量插入与更新两种解决方案分享(存储过程)