2

ID 列を持つテーブルに要素を再挿入する必要があるストアド プロシージャに取り組んでいます。これを行うと、ID 列を指定する必要がある行もあれば、ID 列によって生成される新しい ID 値が望ましい行もあります。の代わりに単一のステートメントでこれを行うことは可能IF-ELSEですか?

ここに私が今持っている解決策があります(id_columnID列はどこにありますか):

DECLARE @id_to_insert INT, @val1 INT, @val2 INT, @val3 INT, @val4 INT;

-- Do some things

IF @id_to_insert IS NOT NULL
BEGIN
    SET IDENTITY_INSERT dbo.table1 ON;

    INSERT INTO dbo.table1 (id_column, col1, col2, col3, col4, col4)
    VALUES (@id_to_insert, @val1, @val2, @val3, @val4);

    SET IDENTITY_INSERT dbo.table1 OFF;
END
ELSE
BEGIN
    INSERT INTO dbo.table1 (col1, col2, col3, col4, col4)
    VALUES (@val1, @val2, @val3, @val4);
END

ご覧のとおり、両方のステートメントは非常に似ています。ほぼ同じ挿入を繰り返さなくて済むのは興味深いことです。

編集:

このテーブルには、現在の連絡先データが保持されます。アーカイブ/削除された連絡先を別のテーブルに移動して、このテーブルをクリーンで不要なデータのない状態に保ちますが、現在のデータ テーブルに復元することがあります。可能であれば、連絡先がアーカイブ/削除される前に持っていた ID を保持したいと思います。不可能な場合 (ID が既に再割り当てされている場合)、新しい ID を生成する必要があります。

4

2 に答える 2

2

一般的な日常の使用では ID 挿入を使用しないことを強くお勧めします。ID 挿入では、ユーザーがテーブルを所有しているか、テーブルに対する変更権限を持っている必要があります。これを一般ユーザーに与えることはお勧めできません。ID 挿入機能は、データの移行を可能にするために存在し、通常は定期的に発生するものではなく、メンテナンス タイプのモードでのみ使用する必要があります。

ActiveFlag代わりに、テーブルにフィールドを追加できますか? 次に、クラスター化インデックスを に作成できます(ActiveFlag, id_column)。これにより、データを分離して新しいデータと古いデータにすばやくアクセスできるという利点が得られます。また、テーブルが期限切れになったり若返ったりしたときに、テーブル間でデータをやり取りするオーバーヘッドもありません。これは、フラグのフィールド更新にすぎません。2 つの別々のテーブルを保持することは、ほとんどまたはまったくメリットがないため、より多くの作業が追加されるように思えます。

于 2015-05-20T15:33:26.013 に答える
0

あなたができる最も近いことは、次の疑似コードのようなものです:

IF @id_to_insert IS NULL
  SET @id_to_insert = SELECT [the next identity value] FROM MyTable;

SET IDENTITY_INSERT dbo.table1 ON;

INSERT INTO dbo.table1 (id_column, col1, col2, col3, col4, col4)
VALUES (@id_to_insert, @val1, @val2, @val3, @val4);

SET IDENTITY_INSERT dbo.table1 OFF;

また、同時実行の問題を処理するには、おそらくトランザクションを使用する必要があります。

于 2015-05-19T18:25:45.447 に答える