Rychlý test zde ukazuje, že NULL by měla fungovat. Ukázkový kód, který jsem použil k testování (na jednoduchém formuláři s jedním tlačítkem a jedním textovým polem):
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
A nazval tento uložený proces:
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 vrátil 'NULL' pro použití hodnoty VB Null
(jak je uvedeno výše) a 'NOT NULL' pro vbNull
. Pokud Null
nefunguje vám, pak se nemohu vyjádřit k tomu, co by mohlo být špatně...!
Podobně by měly být předány prázdné řetězce – prázdný řetězec, tj. str = ""
-- což způsobí, že usp_Bob vrátí 'EMPTY'. Cokoli jiného vrátí 'NOT NULL AND NOT EMPTY' (jak se očekávalo).
Pokud nemůžete předat hodnotu NULL, pak další možností je přetypovat prázdný řetězec na hodnotu NULL ve sproc -- tj.
IF @param = ''
SET @param = NULL
Všimněte si, že délka, kterou projdete, by neměla příliš záležet. Je to odraz maximální délky parametru definovaného v SQL Server spíše než délky dat, kterými procházíte.