2

テーブルの主キーとして ID 列を使用しています。

場合によっては、新しい行を挿入する前に主キーを操作する必要があります。

たとえば、Oracle では : を使用select <sequence_name>.nextval into <variable> from dual しており、sp の実行中に同じ ID を持つ行を誰も挿入しないと確信していました。

SQL Server に関しては、現在の ID 値を読み取ることができ、それはインクリメントされますが、行を挿入せずにインクリメントする方法はありません。

更新: 問題は、行を挿入する前に SQL Server で ID (ID 列として) を操作し、ストアド プロシージャの最後で ID が一意であることを確認するにはどうすればよいかということです。

更新: HierarchyId 列を含むテーブルがあります。私の場合、階層の最初のレベルを形成する方法は、indentity 列に従って、hierarchyId 列を挿入することです。それが私が今それをやった方法です:

begin transaction

insert into [dbo].[Group](GroupTypeId,CompanyOwnerId,GroupHierarchyId)
     values(@GroupTypeId,@HeaderCompanyId,null)

     update [dbo].[Group] 
      set GroupHierarcyId=hierarchyid::GetRoot().GetDescendant(cast ('/'+cast(@NewGroupId as varchar)+'/' as hierarchyid),null) 
     where GroupId=scope_identity()

    commit
4

2 に答える 2

1

テーブルに排他ロックを設定し、最大 ID を取得して、それに 1 を追加できます。それがあなたの次のIDになります。データを挿入すると、テーブルのロックが解除されます。

でも、

値が作成される前に値を操作したい理由がわかりません。それについてもう少し情報を投稿できますか?

于 2011-09-28T04:43:55.660 に答える
0

データベースとデータベース サーバー間で一意のキーが必要な場合は、GUID ( Global Unique Identifier ) が確実にこのニーズを満たします。新しい GUID サーバーを生成する場合は、NEWID()関数を使用するだけです。

SELECT NEWID()
于 2011-09-28T05:31:38.587 に答える