Esecuzione di MS SQL Server 2014 express. All'improvviso una delle colonne in una vista divenne nullable, nonostante fosse un'unione di due colonne non annullabili. Ti prego, aiutami a capire cosa sta succedendo qui:UNION di colonne non annullabili è annullabile
e l'Unione:
Che cosa mi manca?
Modifica con ulteriori informazioni: quando si esegue nuovamente la visualizzazione IncomingTransactions, la sua colonna ora diventa nulla, ma non dovrebbe essere! Ecco la definizione della colonna Quantità: (CASE PIN.StatusId WHEN 6 THEN PIN.QuantityReceived WHEN 7 THEN 0 ELSE PIN.QuantityRevised END) AS Quantity. Ciascuno dei campi quantità è non nullo e la dichiarazione caso è esaustiva. Il resto della query è un semplice join nel campo StatusId, che è un FK non Null, quindi sono ancora perso qui.
Edit 2: sulla base dei suggerimenti di YB sotto, ho creato un banco di prova minima che riproduce questo comportamento:
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
La colonna Q nella vista ybTest1 è nullo, anche se l'istruzione case è esaustivo . Anche se avvolgo lo 0 nel ramo ELSE con CAST(0 as decimal(7,2))
, come suggerito da YB, è ancora nullo. O CASE non ha la semantica che ho pensato, o questo è un bug.
La parte strana è Stato get 'not null', probabilmente dipende dal tipo di dati. Come hai creato la vista? Raccomando di lavorare con due tabelle di test, con tutti i tipi di dati come null e non null e vedere se è possibile riprodurre questo comportamento –
Come stai usando la vista? Dove la clausola? Aggregati? A seconda della tua query, è possibile che tu abbia un record in una tabella che non esiste nella seconda tabella, risultando in un null utilizzato. Sotto il cofano un'UNIONE fa un ordinamento e si fonde per eliminare i duplicati. Se si desidera TUTTI i record, fare un UNIONE TUTTI Se non si cura dei duplicati, UNION ALL è molto più veloce. – JVC
@JuanCarlosOropeza, sto indovinando Type, Id, PartTypeId e Status sono tutti campi chiave? Quantità, FiscalYearId, DataTransacted e Source non lo sono. – Clay