実行中のMS SQL Server 2014 express。突然、ビュー内の列のうちの1つが、ヌル可能ではない2つの列の結合であるにもかかわらず、ヌル可能になりました。私はここで何が起こっているかを理解する助けてください:null不可能な列のUNIONはNULL可能です
とUNION:
私は何をしないのですか?
詳細情報を編集: IncomingTransactionsビューを再保存すると、その列はnullになりますが、そうではありません。数量列の定義は次のとおりです。(ケースPIN.StatusId時6 PIN .QuantityReceived 7 THEN 0 ELSE PIN.QuantityRevised END)AS数量。数量フィールドのそれぞれはnullではなく、caseステートメントは網羅的です。残りのクエリは、StatusIdフィールドの単純な結合です。これはnull以外のFKであるため、ここではまだ失われています。
編集2:以下YBの提案に基づいて、私はこの動作を再現する最小限のテストケースを作成しました:
Create Table ybTest1 (Q1 decimal (7,2) not null, X int not null);
GO
Create View ybTestNSB As
Select (CASE X WHEN 0 THEN Q1 ELSE CAST(0 as decimal(7,2)) END) AS Q From ybTest1
GO
ybTest1ビューのQ列は、case文が網羅されていても、nullです。私がELSEブランチの0をでラップしても、YBが示唆しているように、それはまだnullです。 CASEには私が考えたセマンティクスがないか、これはバグです。
奇妙な部分はステータスが 'not null'です。これはおそらくデータ型に依存します。どのようにビューを作成しましたか? 2つのテストテーブルを使って、すべてのデータ型がヌルで、ヌルでないことを推薦します。この動作を再現できるかどうかを確認してください。 –
どのようにビューを使用していますか? WHERE句?集計?クエリによっては、2つ目のテーブルに存在しないレコードが1つのテーブルに存在する可能性があり、結果としてnullが使用される可能性があります。 UNIONは、重複を排除するためにソートとマージを行います。すべてのレコードが必要な場合は、UNION ALLを実行します。重複を気にしない場合、UNION ALLははるかに高速です。 – JVC
@JuanCarlosOropeza、私はタイプ、ID、PartTypeIdとステータスを推測しているすべてのキーフィールドですか? Quantity、FiscalYearId、DateTransactedおよびSourceはそうではありません。 – Clay