コンマで区切られたリストを使用しないでください。これを行うにはもっと良い方法があります。私の意見では、SQL で区切られた文字列を使用する場所はありません。
SQL-Server 2008 以降を使用している場合は、テーブル値パラメーターを使用してキーワードをストア プロシージャに渡すことができます。
CREATE TYPE dbo.KeyWords AS TABLE (Keyword VARCHAR(15) NOT NULL, Weight NUMERIC(1, 0));
あなたの手順は次のようになります
CREATE PROCEDURE dbo.SaveIdea @IdeaName VARCHAR(30), @Keywords dbo.KeyWords READONLY
AS
DECLARE @IdeaID INT = ( SELECT TOP 1 Idea_ID
FROM dbo.Idea
WHERE Idea_Name = @IdeaName
);
IF @IdeaID IS NULL
BEGIN
INSERT dbo.Idea (Idea_Name) VALUES (@IdeaName);
SET @IdeaID = SCOPE_IDENTITY();
END
MERGE dbo.KeyWords t
USING @Keywords s
ON t.Idea_ID = @IdeaID
AND t.Keyword = s.Keyword
WHEN NOT MATCHED THEN INSERT (Idea_ID, KeyWord, Weight)
VALUES (@IdeaID, s.Keyword, s.Weight)
WHEN MATCHED AND t.Weight != s.Weight THEN UPDATE
SET Weight = s.Weight
OUTPUT $Action, inserted.*;
GO
最初のチェックは、その名前のアイデアが存在するかどうかを確認することです。存在する場合は新しい行が挿入されず、存在しない場合は新しいアイデアが追加されます。次に、キーワードをマージします。そのアイデアに既に存在する場合は追加されませんが、重みが異なる場合は更新されます。they キーワードが存在しない場合は、挿入されます。
次に、これを使用するには、次のようなものを使用できます。
DECLARE @Keywords dbo.KeyWords;
INSERT @Keywords (Keyword, Weight)
VALUES
('Test 1', 1),
('Test 2', 2),
('Test 3', 3),
('Test 4', 5),
('Test 5', 4);
EXECUTE dbo.SaveIdea 'Test Idea', @Keywords;
SELECT *
FROM dbo.Idea;
SELECT *
FROM dbo.Keywords;
SQL フィドル
ただし、これはアプリケーション層から呼び出す方が実用的です。