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插入,使用合并存储过程更新的主要内容,如果未能解决你的问题,请参考以下文章