0

SQLServer2008を使用しています。データベース内の日付のリストを保存および更新するための独創的な方法を探しています。

アプリケーションから日付のリストを収集します。各値がすでに存在するかどうかを確認し、追加しない場合は、データベースに既に保存されているリストにない日付を削除する必要があります。

私が考えることができる最も簡単なことは、この特定のリクエストに関連付けられているすべての日付を削除してから、リスト内の各アイテムを繰り返し処理してデータベースに挿入することです。

もっとエレガントなアイデアを持っている人はいますか?

4

2 に答える 2

0

マージを使用できます。日付を一時テーブルにロードして、次のような挿入を行うこともできます。

with toinsert as (
    select thedate
    from #newdates nd left outer join
         alldates ad
         on nd.thedate = ad.thedate 
    where ad.thedate is null
)
insert into alldates(thedate)
    select thedate
    from toinsert

toinsertエイリアスは、左外部結合を使用して「notin」を実行します。私はよくこれがうまくいくことに気づきます。クエリの設定方法(このように、またはマージを使用する場合など)に関係なく、日付にインデックスを付ける必要があります。それは物事をより速くするはずです。

于 2012-06-25T20:37:51.297 に答える
0

テーブル値のパラメーターと関数を組み合わせて使用​​しNOT EXISTSます。したがって、アプリケーションからストアドプロシージャにパラメータとして日付を渡すと、ストアドプロシージャは、アプリケーションに挿入されたすべての日付のリストを返します。

最初のステップは、タイプを作成して、日付のリストをプロシージャに渡すことができるようにすることです。

CREATE TYPE dbo.DateListType AS TABLE (Date DATETIME)

次に、プロシージャを作成します。私はあなたの日付テーブルが呼ばれていると仮定しましdbo.Datesた、あなたは明らかにこれの代わりにあなたのテーブルを使う必要があるでしょう。

CREATE PROCEDURE dbo.InsertDates (@Dates dbo.DateListType READONLY)
AS
BEGIN
    DECLARE @Inserted TABLE (Date DATETIME)

    INSERT INTO dbo.Dates
    OUTPUT inserted.Date INTO @Inserted
    SELECT  Date
    FROM    @Dates d
    WHERE   NOT EXISTS
            (   SELECT  1
                FROM    dbo.Dates
                WHERE   Dates.Date = d.Date
            )

    SELECT  Date
    FROM    @Inserted
END

アプリケーションが何にコード化されているかわからないため、残念ながら、プロシージャを呼び出すためのコードを提案することはできません。

于 2012-06-25T22:07:35.093 に答える