ビューで列を NOT NULL として示すにはどうすればよいですか?
質問
ビューを使用して ADO.NET エンティティを作成しようとしています。ただし、そのビューには NOT NULL の列が 1 つもありません。
私が思いついたことの 1 つは、ビューの「主キー」として使用する NOT NULL 列をビューに作成することでした。これは機能しましたが、フィールドは依然として NULL として報告されます。
SQL Server にそのビュー列を NOT NULL としてレポートさせる方法はありますか?
次のようなビューを想像してください。
CREATE VIEW vwSample WITH SCHEMABINDING
AS
SELECT ID = convert(uniqueidentifier, /* some computed value */)
,Field1
,Field2
,Field3
FROM tbSample
注記: エンティティXMLを編集してそのようなことをできると言う前に、私はこれを尋ねています。 とても この方法で作成される多数のエンティティ。
解決
努力する価値があるかどうかはわかりませんが、NOT NULL フィールドを含む一時テーブルを返す関数を作成すると、計算された値が得られるはずです。元。
Create function fnSTestample()
returns @Test TABLE
(
tableId varchar(100) not null
)
WITH SCHEMABINDING
as
begin
insert @Test(tableID)
select 'some computed value' from dbo.someTable
return
end
次に、ビューでその関数を選択します。
乾杯。
他のヒント
まず、あなたの質問に答えると、次のようになります。
使いたくない newid()
ID フィールドを決定します。これはビューを使用するたびに再計算されるためです。実際、データの整合性が最大の問題です。
select
row_number() over (order by someStaticAndUniqueFieldLikeCreateDate) as ID,
Field1,
Field2,
Field3
from
tblA
order by
someStaticAndUniqueFieldLikeCreateDate
これは、新しい行を追加する一貫した順序を持つフィールドで順序付けしている場合にのみ機能します。 CreateDate
分野。これをお持ちでない場合、その ID は変更される可能性があります。ここで、これらの ID が実行時にのみ必要で、それらに永続的にリンクするものが何もない場合は、 row_number
まさに桃のような熱心さになるでしょう。信頼できないデータがある場合、信頼できる ID フィールドを作成する方法はありません。 ない限り 追加のテーブルを作成し、トリガーを使用してテーブルにデータを設定します。
2番目に、それに注意してください with schemabinding
. 。汚物として使うと危険です。ビューを作成したらすぐに次のことに注意してください。 with schemabinding
, のスキーマを変更することはできません。 どれでも 基礎となるテーブル 全然. 。つまり、 varchar(50)
A列 varchar(100)
すべてのビューを削除して再追加することなく、 with schemabinding
有効になりました。はい、スキーマバインドされたビューにインデックスを付けることはできますが、ロック、ストック、バレルを実行する前に考慮する必要があるトレードオフが確実にあります。
私が使用した ISNULL
このために。つまり、次のようなものが私にとってはうまくいきました:
CREATE VIEW vwSample WITH SCHEMABINDING
AS
SELECT ID = ISNULL(uniqueidentifier, /*some computed value */)
,Field1
,Field2
,Field3
FROM tbSample
使用 newid()
CREATE VIEW vwSample WITH SCHEMABINDING
AS
SELECT ID = NEWID()
,Field1
,Field2
,Field3
FROM tbSample