创建存储过程以将特定数据插入1-2个表

时间:2013-10-07 13:23:46

标签: sql sql-server stored-procedures freetext

我有两张桌子,

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自由文本搜索引擎都很陌生!我可以包含任何其他相关标签吗?

干杯

1 个答案:

答案 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

虽然从应用程序层调用更实用。