1

NewSequentialID()ストアドプロシージャ(SQL Server 2008 R2 SP2を使用)で、一時テーブル変数なしでを返すことは可能ですか?

NewSequentialID()一時テーブルを使用して、を正常に取得できます。

挿入時にNEWSEQUENTIALID()の値を取得する

おそらく私は古い学校ですが、絶対に必要な場合を除いて、一時テーブルの使用は控えるようにしています…これは絶対に必要な場合かもしれませんが…</ p>

私が試してみると:

DECLARE @NewSequentialID UNIQUEIDENTIFIER;
SET @NewSequentialID = NEWID()

…期待どおりに機能します。

私が試してみると:

DECLARE @NewSequentialID UNIQUEIDENTIFIER;
SET @NewSequentialID = NEWSEQUENTIALID()

…次のエラーが表示されます。

newsequentialid()組み込み関数は、CREATETABLEまたはALTERTABLEステートメントの「uniqueidentifier」タイプの列のDEFAULT式でのみ使用できます。他の演算子と組み合わせて、複雑なスカラー式を形成することはできません。

  • 一時テーブルメソッドを使用する唯一の解決策はありますか?
  • NEWSEQUENTIALID()マイクロソフトがのように機能するために違いを実装した理由を誰かが知っていますNEWID()か?
  • NEWSEQUENTIALID()Microsoftが次のように動作するように更新する可能性があるかどうか誰かが知っていNEWID()ますか?

ジオ

更新-「NEWSEQUENTIALIDはWindowsUuidCreateSequential関数のラッパーである」と述べているため、Microsoftがこの方法でメソッドを実装することを選択した理由はわかりません...しかし、非一時変数はないようですテーブルメソッド。(少なくとも現時点では。)
皆さんのコメント/回答に感謝します。【モデレーター注:】答えが「不可能」の場合、質問をどうすればいいのかわかりません。そこで、回避策の詳細について@marc_sの功績を認めます。

4

2 に答える 2

3

現時点では、列のデフォルトの制約としてのみnewsequentialid()使用できます。それは、エラーメッセージもかなり明確に言っていることです。

したがって、連続した GUID を取得するには、テーブルが必要です。これを行う他の方法はありません。また、SQL Server 2012 にも他の方法はありません。

なぜこのような違いがあるのか​​ 、なぜMicrosoftがこのように実装することを選択したのかについては、私にはわかりません....

アップデート:

では、テーブルに挿入される値を取得する必要があります -OUTPUTを使用するのはどうですか?

何かのようなもの:

DECLARE @NewIDs TABLE (NewSeqID UNIQUEIDENTIFIER)

INSERT INTO dbo.YourTable(list-of-columns)
OUTPUT INSERTED.NewSeqID INTO @NewIDs(NewSeqID)
VALUES (.........)

このようにして、INSERT操作からの出力 (新しく作成された順次 GUID) がそのテーブル変数に格納され、それを使用したり、返したり、スライスしたりできます。

于 2012-08-12T19:29:46.243 に答える
1

マイクロソフトの公式見解は次のとおりです。

NEWSEQUENTIALID() は、uniqueidentifier 型のテーブル列に対する DEFAULT 制約でのみ使用できます。例: CREATE TABLE myTable (ColumnA uniqueidentifier DEFAULT NEWSEQUENTIALID())

ここで説明 http://msdn.microsoft.com/en-us/library/ms189786.aspx

NewID は乱数を生成し、もう 1 つは次の連番です。

于 2012-08-12T19:36:00.657 に答える