0

Мне нужно сделать большой объем Insert и/или Update для целевой таблицы в базе данных SQL. Я уже пробовал хранимую процедуру Merge. В целевой таблице у меня есть составной ключ.SQL Insert, Update using Merge Store Процедура

Мне нужно сгенерировать шаблон для первого поля (ключа) при вставке. Я попробовал пользовательскую функцию, которая возвращает ключ шаблона, который уникален для каждой из строк.

Вопрос в том, как включить эту функцию в запрос, который будет автоматически генерировать ключ и вставлять соответствующие поля для каждой записи?

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 возвращает шаблон я хочу. Вот мой User Defined Function:

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 

Пожалуйста, помогите мне с этим. Заранее спасибо.

+0

Вместо 'используя SourceTable в качестве s', используйте' с помощью (выбрать col1, col2, dbo.UserDefiendFunction (@ parama1) в качестве шаблона из SourceTable), как s' –

+0

@ Nick.McDermaid я попробовал с вашим подходом . Определенная пользователем функция возвращает тот же шаблон для всех строк, которые я вставляю. Причина - пользовательская функция вызывается только один раз ... она будет нарушать ограничение первичного ключа во время вставки ... Это не сработает. –

+0

Вы говорите, что для двух вызовов UDF с тем же значением @ parama1 вы всегда будете получать разные значения, и вы никогда не получите одинаковое значение дважды? –

ответ

0
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 
+0

Как процедура хранения слияния сканирует все значения только один раз. .. then User Defined Function, вызываемая только один раз .Pattern будет одинаковым для всех строк, которые я вставляю ... Мне нужен другой шаблон для каждой строки ..... –

Смежные вопросы