2012-08-08 10 views
5

Sto notando che quando uso questa dichiarazione, la colonna Action non è annullabile:Come controllare nullability in SELECT INTO per le colonne letterali a base

SELECT TOP 0 SerialNumber, 0 [Action] INTO #MyTable FROM FSE_SerialNumber 

Ma quando uso questa dichiarazione, la colonna Action è annullabile:

SELECT TOP 0 SerialNumber, CAST(0 as int) [Action] INTO #MyTable FROM FSE_SerialNumber 

la ragione per la creazione della tabella in questo modo è perché non voglio che la tabella temporanea di ereditare le regole di confronto SerialNumber dalle regole di confronto di default del server o altrove. Voglio che corrisponda alle regole di confronto di FSE_SerialNumber..SerialNumber.

La mia domanda è: posso contare sulla funzione di cast che mi dà una colonna nullable, o non è chiaramente definita e potrebbe cambiare. Perché il cast improvvisamente rende nullable la colonna? C'è un modo migliore (oltre ai commenti) per chiarire che il mio intento è quello di ottenere una colonna nullable lì?

+0

Non so che questo è documentato, ma altrove ho anche visto la tecnica di usare una variabile piuttosto che un valore letterale per produrre una colonna nullable.Suppongo che sia perché la variabile (come la tua espressione) ha una struttura i cui metadati permettono i NULL, così fa anche la nuova colonna. E se hai chiamato la tua variabile @NullableInt in grado di gestire il tuo problema di auto-documentazione. – GilM

risposta

5

Sembra che una risposta definitiva sia here. Copia di qui:

metadati è determinato sulla base della colonna di origine e le espressioni utilizzate nell'elenco SELECT. Qui di seguito sono le regole:

  1. Qualsiasi espressione che utilizza una funzione incorporata come SOTTOSTRINGA, sinistra, destra etc (tranne ISNULL) per esempio è considerato come annullabile dal motore . Quindi, se si utilizza CAST (somecol come char (8)) allora l'espressione è annullabile

  2. letterali, costanti, variabili globali come @@ DBTS, @@ ERROR ecc sono considerati non annullabile in quanto restituiscono sempre un certo valore

  3. Se expression è una colonna allora annullabilità è derivata dai metadati colonna di origine

    quindi, per rendere un'espressione o colonna dell'elenco SELECT non nullo quindi utilizzare ISNULL intorno alla colonna o espressione.

Così, sembra che sei sicuro da usare la tua espressione CAST.

0

Personalmente, per il miglior controllo, è necessario creare prima il tavolo. Per esempio:

Create Table #MyTable (
    SerialNumber int Not Null, -- or however this is correctly defined. 
    Action int Null 
) 

Poi, fare un INSERT INTO ... Seleziona da ...

Insert Into #MyTable(SerialNumber, Action) 
Select SerialNumber, 0 
From FSE_SerialNumber 

Poi, non ci sarà alcun problema di cosa i campi dovrebbero essere.

So che questo non è proprio quello che hai chiesto, ma potrebbe essere qualcosa da considerare.

+0

Problema con questo non c'è un modo semplice per copiare le regole di confronto della colonna SerialNumber nella tabella temporanea quindi. Stavo facendo a modo tuo e ho dovuto cambiarlo a causa di problemi di collazione. – BlueMonkMN

+0

@BlueMonkMN. Sono lieto che tu abbia trovato una soluzione adatta, e sei proprio corretto che non puoi _copy_ il confronto durante la creazione di una tabella, ma puoi _can_ fornirlo esplicitamente nell'istruzione Crea tabella (per riferimento futuro). – Jim

0

Suggerimento generale rapido per SELECT ... INTO: utilizzare ISNULL( con una colonna e verrà creato come una colonna NOT NULL nella tabella.

Problemi correlati