2013-09-24 9 views
5

SQL INSERT INTO avrà esito negativo se la variabile che sto inserendo ha il valore Null.INSERT INTO ha esito negativo se si inserisce una variabile con valore Null

Il variabile costLab è il tipo di dati Variant. Il valore non Null sarebbe Decimale.

db.Execute ("INSERT INTO budget 
(wbsid, category, capture_date, budget_date, budget_type, month_value) " & _ 
"VALUES ('" & wbsid & "', 'Labor', #" & importDate & "#, 
#" & monthDate & "#, 'Forecast', " & costLab & ");") 

voglio inserire Null se il codice che imposta costLab restituisce null. Ma se viene restituito un valore, voglio inserire quel valore. Ovviamente potrei scrivere un'istruzione If che controlli null, quindi inserire "Null" direttamente ma volevo sapere se c'era un modo senza l'istruzione If per inserire Nulls tramite una variabile.

risposta

6

È possibile utilizzare Nz() quando si crea l'istruzione INSERT. È simile all'approccio IIf(), ma è leggermente più conciso.

Dim strInsert As String 
strInsert = "INSERT INTO budget (wbsid, category, capture_date, budget_date, budget_type, month_value) " & _ 
     "VALUES ('" & wbsid & "', 'Labor', #" & importDate & "#, #" & monthDate & "#, 'Forecast', " & Nz(costLab, 'Null') & ");" 
Debug.Print strInsert ' <- examine the finshed statement in Immediate window 
db.Execute strInsert, dbFailOnError 

Debug.Print ti dà l'opportunità di esaminare la dichiarazione finale si dà al motore db da eseguire. In caso di problemi, è possibile accedere alla finestra Immediata (Ctrl + g) per visualizzare il testo dell'istruzione. Puoi anche copiare quel testo e incollarlo in SQL View di una nuova query per il test.

+0

Grazie Hans per la rapida risposta. Mi sto ancora chiedendo perché, in primo luogo, sta fallendo. Ad esempio un inserto che utilizza un SELECT basato su una tabella con un valore di campo di null non ha alcun problema. – dblE

+0

Esamina l'output da 'Debug.Print'. La mia ipotesi è quando 'costLab' è Null, l'ultima parte dell'istruzione costruita dal tuo codice originale sarà questa ...' 'Previsione',); ' – HansUp

+0

Con il codice che ho suggerito, l'ultima parte della frase terminerà come questo quando 'costLab' è Null ...' 'Forecast', Null); ' – HansUp

1

Inserire letteralmente "null" quando costLab è Nullo.

Così, quando è concatenare la stringa SQL, al posto della variabile costLab, è sufficiente inserire questo:

IIf(IsNull(costLab), "null", costlab) 

La query completa:

db.Execute ("INSERT INTO budget (wbsid, category, capture_date, budget_date, budget_type, month_value) " & _ 
    "VALUES ('" & wbsid & "', 'Labor', #" & importDate & "#, #" & monthDate & "#, 'Forecast', " & IIf(IsNull(costLab), "null", costlab) & ");") 

lo so ... tecnicamente, questo è e una dichiarazione If (IIf è solo una forma abbreviata di If...Then...Else), ma è la forma più breve a cui possa pensare.

+0

Grazie per la rapida risposta cristiana. Questa è una soluzione valida e capisco che, quello che non capisco è il motivo per cui non posso inserire il valore null semplicemente usando la variabile. Perché fallisce? – dblE