Domanda

Sto cercando di creare una vista dove voglio una colonna per essere solo vero o falso. Tuttavia, sembra che non importa quello che faccio, SQL Server (2008) ritiene che la mia colonna di bit può in qualche modo essere nullo.

Ho una tabella denominata "Prodotto" con la colonna "Stato" che è INT, NULL. In una vista, voglio tornare una riga per ogni riga di prodotto, con una colonna di bit impostato a true se la colonna Product.Status è pari a 3, in caso contrario il campo di bit dovrebbe essere falsa.

Esempio SQL

SELECT CAST( CASE ISNULL(Status, 0)  
               WHEN 3 THEN 1  
               ELSE 0  
             END AS bit) AS HasStatus  
FROM dbo.Product  

Se salvo questa query come la vista e guardare le colonne in Esplora oggetti, la colonna HasStatus è impostato su BIT, NULL. Ma non dovrebbe mai essere NULL. C'è qualche trucco magico SQL posso usare per forzare questa colonna per essere NOT NULL.

Si noti che, se mi tolgo la CAST() intorno al CASE, la colonna è impostato correttamente come NOT NULL, ma poi il tipo di colonna è impostata su INT, che non è quello che voglio. Io voglio che sia BIT. : -)

È stato utile?

Soluzione

È possibile ottenere ciò che si vuole da ri-organizzare la query un po '. Il trucco è che il ISNULL deve essere al di fuori prima di SQL Server capirà che il valore risultante non può mai essere NULL.

SELECT ISNULL(CAST(
    CASE Status
        WHEN 3 THEN 1  
        ELSE 0  
    END AS bit), 0) AS HasStatus  
FROM dbo.Product  

Una ragione in realtà ho trovato questo utile è quando si utilizza un ORM e tu no desidera che il valore risultante mappato a un tipo nullable. Si può rendere le cose più facili in tutto se l'applicazione vede il valore come mai potrebbero essere oggetto nullo. Quindi non c'è bisogno di scrivere codice per gestire le eccezioni nulli, ecc.

Altri suggerimenti

Cordiali saluti, per le persone in esecuzione in questo messaggio, aggiungendo l'ISNULL () intorno alla parte esterna del cast / convertire può rovinare l'ottimizzatore sul vostro punto di vista.

Abbiamo avuto 2 tavoli con lo stesso valore di una chiave di indice, ma con tipi di diversa precisione numerica (male, lo so) e la nostra visione stava unendo su di loro per produrre il risultato finale. Ma il nostro codice middleware era alla ricerca di un tipo di dati, e la vista ha avuto un CONVERT () intorno alla colonna restituito

ho notato, come il PO ha fatto, che i descrittori di colonna del risultato vista definita come annullabile e stavo pensando E 'una chiave primaria / estero su 2 tavoli; il motivo per cui vorremmo il risultato definito come annullabile?

Ho trovato questo post, ha gettato ISNULL () attorno alla colonna e voilà -. Non Nullable più

Il problema era la performance della vista è andato dritto nel gabinetto quando una query filtrata su quella colonna.

Per qualche ragione, un convertito esplicito () sulla colonna dei risultati della vista non rovinare l'ottimizzatore (che stava per avere a che fare in ogni caso a causa delle diverse precisioni), ma l'aggiunta di un ISNULL ridondante () involucro ha fatto, in una grande strada.

Tutto si può fare in una dichiarazione Select è controllare i dati che il motore di database invia a voi come un cliente. L'istruzione SELECT non ha alcun effetto sulla struttura della tabella sottostante. Per modificare la struttura della tabella è necessario eseguire un'istruzione ALTER TABLE.

  1. Per prima cosa assicurarsi che non vi sono attualmente i null in quel campo di bit nella tabella
  2. Quindi eseguire la seguente istruzione DDL:  Alter Table dbo.Product Alter column status bit not null

Se, OTOH, tutto quello che sta cercando di fare è controllare l'output della vista, allora quello che stai facendo è sufficiente. La sintassi garantirà che l'uscita della colonna HasStatus in vista di risultati sarà infatti non essere nullo. Sarà sempre essere o valore di bit value = 1 o bit = 0. Non ti preoccupare quello che dice l'esploratore oggetto ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top