2017-01-17 10 views
0

SQL Server Express 2016およびExcel VBAを使用して、さまざまなExcelドキュメントの一意のロット番号を生成しています。現在、新しい行を作成していますが、SQL Serverのスクリプトはロット番号をインクリメントします。次に、select文を実行して、作成したばかりの行からフィールドを取得します。これまでのところ問題はありませんでしたが、Excelファイルが同時に複数のユーザーによって実行された場合、あるユーザーの選択クエリが別のユーザーが作成した行を取得する可能性があります。これは心配ですか?もしそうなら、私はそれをどうやって避けるのですか?SQL Serverの複数のユーザーインクリメント番号フィールドのエラーを回避する方法

statement = "INSERT INTO LotInfo(RefNum,DateCreated,UserName)VALUES('" & RefNum 
& "','" & DateCreated & "','" & user & "')" 

conn.Execute statement 

Set lot = conn.Execute("SELECT top 1 Lot FROM LotInfo Order By ID desc;") 
+0

ここでは「RefNum」はユニークではありませんか?とにかく、 '@@ IDENTITY'またはおそらくもっと良いものを返すことができます。' SCOPE_IDENTITY() ' – DavidG

+0

いいえ、残念ながらRefNumは同じRefNumの異なるロットを同時に作ることができるので一意ではありません。私は@@ IDENTITYまたはSCOPE)_IDENTITY()に慣れていませんが、この例では正しい方法は何でしょうか? – Dalton

+0

多くのリソースがありますが、たとえばSELECT SCOPE_IDENTITY()を実行する必要があります。参照してください:http://stackoverflow.com/questions/1920558/what-is-the-difference-between-scope-identity-identity-identity-and-ide – DavidG

答えて

1

私はスコープIDが動作するとは思わない。 ステートメントは完全に別個です。まず挿入を行います。それは終わる。次に選択を送信します。私はVBAに100%精通しているわけではありませんが、第2選択が最初の請求書の結果について何かを知っているかどうかはわかりません。 私はVBAから呼び出すことができるストアドプロシージャを作成することをお勧めします。 プロシージャは挿入を実行し、ロット番号を返します。

+0

アダム、それも私が思ったものです。しかし、スコープのアイデンティティーは確かに機能していると思います。私は、それぞれのExcelドキュメントのコードを実行しました(選択クエリが実行される前に休憩に入れてください)。スコープアイデンティティを使用せずにステップインしたとき、両方のドキュメントが最新のエントリを受信しました。しかし、スコープ識別情報を使用して同じテストを実行した場合、各ドキュメントは正しいロット番号を受け取りました。しかし、あなたが正しいかもしれません、ストアドプロシージャは行く方法かもしれません。 – Dalton

+0

あなたがテストしたなら、素晴らしいです。長年にわたって、VBAとSQLサーバーの間の奇妙なやりとりにより、ストアドプロシージャで動作するようになりました。簡単にSSMSのロジックをテストし、VBAで単純な呼び出しを行うだけです。 (また、SSMSはVBAよりもずっと良いエラーメッセージを出します) –

+0

Thanks Adam!ストアドプロシージャを使用します。 – Dalton

関連する問題