2008-08-26 5 views
1

私はデータを挿入するSQLスクリプトを持っています(現在は千単位のINSERTステートメントを使用しています)。列の1つには、実際にはいくつかの異なるテーブルで一意のIDENTITY型ではなく、 。SQL Server UDFの呼び出し間で状態を維持できますか?

次の利用可能なID(すなわち、最後に使用されたID + 1)を取得するスクリプトにスカラー関数を追加したいと思いますが、これは可能ではないと思われますUDF内からグローバル変数または静的変数を使用すると、一時表を使用できず、関数内から永続表を更新できません。

現在、私のスクリプトは次のようになります。

 
    declare @v_baseID int 
    exec dbo.getNextID @v_baseID out --sproc to get the next available id 
    --Lots of these - where n is a hardcoded value 
    insert into tableOfStuff (someStuff, uniqueID) values ('stuff', @v_baseID + n) 
    exec dbo.UpdateNextID @v_baseID + lastUsedn --sproc to update the last used id 

しかし、私は、それは次のようになりたい:オフセットをハードコーディング

 
    --Lots of these 
    insert into tableOfStuff (someStuff, uniqueID) values ('stuff', getNextID()) 

はお尻の痛みで、エラーが発生しやすくなります。単純なスカラー関数にパッケージ化するのは非常に魅力的ですが、呼び出し間のオフセット・カウンターを維持する方法がないように思われるので、そうすることはできません。それは正しいのですか、私は行方不明のものがあります。

現時点では、SQL Server 2005を使用しています。明確化のため

編集:それは起こらないだろう打つ

2人のユーザー。これはアップグレードスクリプトで、一度だけ実行され、同時に実行されることはありません。

実際のsprocの前にsp_が付いていないので、サンプルコードを修正しました。

通常はidテーブルとsprocを使用してIDを取得していますが、このスクリプトではよりクリーンな方法を探していました。

答えて

2

コール間のオフセットカウンタを維持する方法がないように思われるので、このようにすることはできません。それは正しいのですか、私は行方不明のものがあります。

あなたは何も欠けていません。 SQL Serverはグローバル変数をサポートしておらず、UDF内でのデータ変更もサポートしていません。 CONTEXT_INFO(http://weblogs.sqlteam.com/mladenp/archive/2007/04/23/60185.aspx参照)を使用してクルーギー(kludgy)として何かしたい場合でも、それをUDF内から設定することはできません。

オフセットを "ハードコーディング"する方法はありますか?その変数を作成し、そのループの中で挿入を行い、その反復をループしますか?

2

2人のユーザーが同時にそれを打つと、同じIDを取得します。なぜあなたは(保証)を一意のIDとして、これはまた

はるかに高速に実行することをその挿入して使用する代わりに、アイデンティティとIDテーブルを使用していませんでした

をsp_getNextID

prospにsp_を接頭語として使用しない場合、オプティマイザはマスターDBを確認してそのデータベースが存在するかどうかを確認し、実行する

0

これはおそらくそれ以上の価値がありますが、SQL CLR UDFで静的なC#/ VB変数を使用することができます。この変数を増やすだけで何かしたいことができると思いますUDFが呼び出されます。静的変数は、もちろん、appdomainがアンロードされると失われます。だから、ある日から次のIDの連続性が必要な場合は、NextIdの最初のアクセス時に、このIDを使用するすべてのテーブルをポーリングして最高の値を見つける方法が必要です。

関連する問題