Merge ステートメントに渡されたフィールドに基づいて一意の値を生成するために UDF を呼び出す Merge Into ステートメントがあります。基本的に、URL のテーブルにマージすると、名前のテーブルがあります。この関数は、名前を URL に適したものにし、それらが一意であることを確認します。
問題は、競合する URL がマージ ステートメントによって挿入された場合、UDF がそれらを検出しないことです。マージが開始される前に URL がそこにある場合は、それが正常に検出され、サフィックスが追加されます。
したがって、両方とも「John Doe」という 2 つの名前がある場合、マージで 2 つの「JohnDoe」URL が作成されます。「JohnDoe」URL が既に存在する場合は、2 つの「JohnDoe1」URL が作成されます。
Merge Into が開始されたときのテーブルではなく、更新されたばかりのテーブルの重複を UDF に確認させる方法はありますか?
ステートメントにマージ:
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
コード表示を修正するために編集