Um teste rápido aqui mostra que NULL deve fazer o trabalho. Código de exemplo que usei para testar (em um formulário simples com um botão e uma caixa de texto):
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
E chamou este proc armazenado:
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 retornou 'NULL' para usar o valor VB
Null
(conforme o exemplo acima) e 'NOT NULL' para vbNull
. Se Null
não funciona para você, então não posso comentar sobre o que pode estar errado...! Da mesma forma, strings vazias devem ser passadas assim -- uma string vazia, ou seja,
str = ""
-- que faz usp_Bob retornar 'EMPTY'. Qualquer outra coisa retorna 'NOT NULL AND NOT EMPTY' (como esperado). Se você não conseguir passar NULL, outra opção é converter uma string vazia para NULL no sproc - ou seja,
IF @param = ''
SET @param = NULL
Observe que o comprimento pelo qual você passa não deve importar muito. É um reflexo do comprimento máximo do parâmetro, conforme definido no SQL Server, em vez do comprimento dos dados pelos quais você está passando.