我有一个Merge Into语句,它调用UDF根据传递给Merge语句的字段生成唯一值。基本上我有一个名称表,当我合并到一个URL表。该函数使名称对URL友好,并确保它们是唯一的。
问题是如果UDF是由merge语句插入的,则UDF不会检测到冲突的URL。如果在合并开始之前URL在那里,它会检测到它并添加后缀。
因此,如果我有两个名字,都是'John Doe',它会在合并中创建2个'JohnDoe'网址。如果已有“JohnDoe”网址,则会创建2个“JohnDoe1”网址。
有没有办法让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
修改代码显示