1

私は2つのテーブルを持っています、

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

最初のチェックは、その名前のアイデアが存在するかどうかを確認することです。存在する場合は新しい行が挿入されず、存在しない場合は新しいアイデアが追加されます。次に、キーワードをマージします。そのアイデアに既に存在する場合は追加されませんが、重みが異なる場合は更新されます。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 フィドル

ただし、これはアプリケーション層から呼び出す方が実用的です。

于 2013-10-07T14:50:47.060 に答える