2

私は現在、スキーマを変更できないデータベース上のプロジェクトを担当しています。IDが一意である必要があるテーブルに新しい行を挿入する必要がありますが、構造の元の作成者はこの値を自動インクリメントに設定していません。これを回避するために、私は次のようなコードを使用しています。

(SELECT TOP 1 [ID] from [Table] ORDER BY [ID] DESC) + 1

IDフィールドの値を指定する場合、基本的にはある種の内部クエリがあります。問題は、数行下に、入力したIDが必要なことです。この列の出力にSQLParameterを設定できれば、設定された値を取得できます。問題は、SQLを使用していることであり、他のSQLParametersのように難しい値ではありません。値だけの代わりにSQLを使用することはできませんか?

これは大量の交換の可能性があるため、2つの異なるクエリ(1つはIDを取得し、もう1つは挿入)を実行したくありません。

4

4 に答える 4

3

スキーマを変更できないと言いますが、列を自動インクリメントするプロジェクトにテーブルを追加できますか?次に、そのテーブルを使用して(安全に)新しいIDを作成し、それらをコードに返すことができます。

これは、OracleがIDを実行する方法と似ており、Oracle上で実行されるSQLサーバーのベンダーアプリケーションは、2つのデータベース間の違いを最小限に抑えるためにそのアプローチを使用する場合があります。

更新:
ああ、私はここで他の答えへのあなたのコメントを見つけました。その場合、他にうまくいくと思うのは、2つのステートメント(新しいIDを挿入してから、新しいIDを読み戻す)をSERIALIZABLE分離レベルのトランザクション内に配置することだけです。そして、それはあなたにパフォーマンスとロックの落とし穴にあなたを開いたままにするので、それはちょっとひどいです。

于 2011-09-06T21:46:10.817 に答える
1

これを行うためにデータベースにストアドプロシージャを作成することは可能ですか?ストアドプロシージャの戻り値は、必要なIDを返しますか?

于 2011-09-06T21:23:32.083 に答える
1

このIDをどこで使用する必要があるかについて少し混乱しています。同じストアドプロシージャ内にある場合は、次の方法を使用してください。

DECLARE @NewId int
SELECT TOP 1 @NewId =  [ID] + 1 from [Table] ORDER BY [ID] DESC
SELECT @NewId
于 2011-09-06T21:49:16.933 に答える
0

1つのSqlCommandに複数のSQLステートメントを入れることができます。だから、安倍が提案したことに沿って簡単に何かをすることができます:

DECLARE @NewId int
SELECT TOP 1 @NewId =  [ID] + 1 from [Table] ORDER BY [ID] DESC
INSERT INTO [Table] (ID, ...) VALUES (@NewId, ...)
SELECT @NewId

次に、SqlCommandでExecuteScalarを呼び出すだけで、INSERTが実行され、使用したIDが返されます。

于 2011-09-06T21:56:12.277 に答える