1

我有两张桌子,

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表中,然后将其他数据插入Keyword表中。是否也可以让存储过程检查输入模式以确保它具有正确的格式和正确的数据类型,如果有问题则显示一个字符串?

提前感谢您的帮助,我对存储过程和 MSSQL 自由文本搜索引擎很陌生!我还可以包含其他相关标签吗?

干杯

4

1 回答 1

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小提琴

尽管从您的应用程序层调用这更实用。

于 2013-10-07T14:50:47.060 回答