2017-10-17 7 views
0

私はこのテーブルを持っている:Guid/uniqueidentifierでデフォルトのNEWID()/ NEWSEQUENTIALID()を使用するにはどうすればよいですか?

CREATE TABLE [dbo].[SandTable](
    [Id] [uniqueidentifier] NOT NULL, 
    [Date] [date]    NULL, 
    CONSTRAINT [PK_SandTable] PRIMARY KEY) 

ALTER TABLE [dbo].[SandTable] ADD CONSTRAINT [DF_SandTable_Id] DEFAULT (NEWID()) FOR [Id] 

質問NEWSEQUENTIALID(対NEWIDを())を使用しての話ではありません。

linqPadを使用してテーブルをテストします。

SandTables.InsertOnSubmit(new SandTable 
{ 
    // I don't provide any value for Id 
    Date = DateTime.Now 
}); 
SubmitChanges(); 

私の最初のアイデアにはIDが提供されていないときの値に自分自身を初期化することができますが、1つが設けられている場合に提供されたIDを使用しますId列を作成することでした。

しかし、Guidは構造体であり、Idでないクラスであるため、Idはデフォルト値(00000000-0000-0000-0000-000000000000)に初期化されます。したがって、SQLサーバーは、Idは常に値を持ち、NEWID()のデフォルトの命令は決して呼び出されないと考えます。

NEWID()を特定の値で強制的に呼び出すことはできますか? Idの値を評価するためにトリガーを使用し、それが(00000000-0000-0000-0000-000000000000)のときにNEWID()を呼び出す必要がありますか?解決策または回避策は何ですか?あなたがチェック制約でそれを行うことができます

+0

は、興味深い類似し質問ですが、私の具体的な質問に応答していない:おそらくhttps://stackoverflow.com/q/11974939/196526 –

+0

あなたが挿入しようとしていることがわかっているなら、id = Guid.NewGuid()でコードにGUIDを作成してみてはどうでしょうか?あなたはそれを作成するSQLをしたいので? –

+0

また、オプションを挿入するためのストアドプロシージャを使用していますか?それでは、GUIDが空であるかどうかをチェックし、新しいGUIDがあればそれを生成し、挿入を実行することができます。 –

答えて

1

:ここ

ALTER TABLE [dbo].[SandTable] 
    ADD CONSTRAINT [DF_SandTable_Id] DEFAULT (NEWID()) FOR [Id] 

ALTER TABLE [dbo].[SandTable] 
    WITH CHECK ADD CONSTRAINT [CK_SandTable_Id_Empty] 
    CHECK (
     [Id] <> CAST(0x0 AS UNIQUEIDENTIFIER) 
    ) 
+0

私は、入力を検証するためにチェック制約が使用されていると思います。 '[Id] <> CAST(0x0 AS UNIQUEIDTITIER)' –

+0

これは挿入をブロックするでしょう、私は彼がそれがちょうどNewID()を生成したいと思うと信じています。違う)。 –

+0

私はその質問を誤解しました。私はまもなく新しい答えで更新します。 –

関連する問題