Ein schneller Test hier zeigt, dass NULL die Arbeit erledigen sollte. Beispielcode, den ich zum Testen verwendet habe (auf einem einfachen Formular mit einer Schaltfläche und einem Textfeld):
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
Und es nannte diese gespeicherte Prozedur:
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 gab 'NULL' für die Verwendung des VB-Werts Null
zurück (gemäß obigem Beispiel) und „NOT NULL“ für vbNull
. Wenn Null
funktioniert bei dir nicht, dann kann ich nichts dazu sagen, was falsch sein könnte...!
Ebenso sollten leere Strings genauso übergeben werden – ein leerer String, also str = ""
-- wodurch usp_Bob "LEER" zurückgibt. Bei allem anderen wird 'NOT NULL AND NOT EMPTY' zurückgegeben (wie erwartet).
Wenn Sie NULL nicht durchlassen können, besteht eine andere Möglichkeit darin, einen leeren String im Sproc in NULL umzuwandeln – d. h.
IF @param = ''
SET @param = NULL
Beachten Sie, dass die Länge, die Sie durchlaufen, keine allzu große Rolle spielen sollte. Es spiegelt die maximale Länge des Parameters wider, wie sie in SQL Server definiert ist, und nicht die Länge der Daten, die Sie durchlaufen.