请不要使用逗号分隔的列表,有更好的方法可以做到这一点,在我看来,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
第一个检查是查看是否存在具有该名称的想法,如果不存在则不插入新行,否则添加新想法。然后它合并关键字。如果它们已经存在于该想法中,则不会添加它们,但如果权重不同,则会更新。如果他们的关键字不存在,则将其插入。
然后要使用它,您可以使用以下内容:
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小提琴
尽管从您的应用程序层调用这更实用。