En hurtig test her viser, at NULL burde gøre jobbet. Eksempelkode, jeg plejede at teste (på en simpel formular med én knap og én tekstboks):
Private Sub Command1_Click()
Dim dbConn As ADODB.Connection
Dim dbComm As ADODB.Command
Dim dbRS As ADODB.Recordset
Set dbConn = New ADODB.Connection
With dbConn
.ConnectionString = "...REPLACE THIS ACCORDINGLY..."
.ConnectionTimeout = 10
.Open
End With
Set dbComm = New ADODB.Command
With dbComm
.ActiveConnection = dbConn
.CommandType = adCmdStoredProc
.CommandText = "usp_Bob"
.Parameters.Append .CreateParameter("b", adVarChar, adParamInput, 10, Null)
Set dbRS = .Execute
End With
Text1.Text = dbRS.Fields.Item(0).Value
dbRS.Close
dbConn.Close
End Sub
Og den kaldte denne lagrede proc:
ALTER PROCEDURE usp_Bob
@b VARCHAR(10)
AS
IF @b IS NULL
SELECT 'NULL' AS '1'
ELSE
IF @b = ''
SELECT 'EMPTY' AS '1'
ELSE
SELECT 'NOT NULL AND NOT EMPTY' AS '1'
usp_Bob returnerede 'NULL' for at bruge VB-værdien Null
(som i eksemplet ovenfor), og 'NOT NULL' for vbNull
. Hvis Null
virker ikke for dig, så kan jeg ikke udtale mig om, hvad der kan være galt...!
På samme måde skal tomme strenge sendes lige som det -- en tom streng, dvs. str = ""
-- hvilket får usp_Bob til at returnere 'EMPTY'. Alt andet har det returnere 'NOT NULL AND NOT EMPTY' (som forventet).
Hvis du ikke kan få NULL passeret igennem, så er en anden mulighed at caste en tom streng til NULL i sproc -- dvs.
IF @param = ''
SET @param = NULL
Bemærk, at længden du passerer igennem ikke bør betyde for meget. Det er en afspejling af den maksimale længde af parameteren som defineret i SQL Server snarere end længden af de data, du passerer igennem.