質問

ビューを使用して 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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top