0

我有一个 Merge Into 语句,它调用 UDF 以根据传递给 Merge 语句的字段生成唯一值。基本上,当我合并到一个 URL 表中时,我有一个名称表。该函数使名称对 URL 友好,并确保它们是唯一的。

问题在于,如果它们是由合并语句插入的,UDF 不会检测到冲突的 URL。如果 URL 在合并开始之前就在那里,它会检测到它并添加后缀。

因此,如果我有 2 个名字,都是“John Doe”,它会在合并中创建 2 个“JohnDoe”URL。如果已经有一个 'JohnDoe' URL,它会创建 2 个 'JohnDoe1' URL。

有什么方法可以让 UDF 查看刚刚更新的表中的重复项,而不是 Merge Into 开始时的表?

合并到语句:

MERGE INTO url_table
USING name_table
ON name_key= url_key
WHEN NOT MATCHED BY TARGET THEN
INSERT ( url_value )
VALUES (dbo.get_unique_url ( name_value));

get_unique_url UDF:

DECLARE @url NVARCHAR ( 50 ) = @name_value
--Remove non-alpha characters
DECLARE @KeepValues AS VARCHAR ( 50 ) = '%[^a-z]%'
WHILE PATINDEX ( @KeepValues , @url ) > 0
SET @url = STUFF ( @url , PATINDEX ( @KeepValues , @url ), 1 , '' )

DECLARE @suffix INT= 1
WHILE EXISTS( SELECT url_value FROM url_table ( NOLOCK ) WHERE url_value = @url )
BEGIN
SET @url = @url + CONVERT ( NVARCHAR ( 5 ), @suffix )
END

-- Return the good URL
RETURN @url

编辑修复代码显示

4

0 回答 0