我有两张桌子,
Idea(Idea_ID int primary key, Idea_name varchar(30))
并且
Keyword(Idea_ID int, Keyword varchar(15), weight numeric(1,0))
我希望创建一个将数据插入Idea
和/或Keyword
表的存储过程。理想情况下,输入格式为(Idea_name, K1,W1,K2,W2,K3,W3...etc)
,其中Ks为关键字,Ws为权重。
我希望如果在Idea
表中找不到Idea名称,首先会在Idea
表中插入一个新的Idea名称,然后插入其他数据Keyword
表。是否也可以让存储过程检查输入模式以确保它具有正确的格式和正确的数据类型,如果出现问题则显示字符串?
在此先感谢您的帮助,我对存储过程和MSSQL自由文本搜索引擎都很陌生!我可以包含任何其他相关标签吗?
干杯
答案 0 :(得分:0)
请不要使用以逗号分隔的列表,有更好的方法可以做到这一点,在我看来,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 Fiddle 强>
虽然从应用程序层调用更实用。