Быстрый тест показывает, что NULL должен делать эту работу. Пример кода, который я использовал для тестирования (на простую форму с одной кнопкой и одним текстовым полем):
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
И он вызвал эту хранимую процедуру:
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 вернул 'NULL' для использования значения VB Null
(согласно приведенному выше примеру) и 'NOT NULL' для vbNull
. Если Null
не работает для вас, то я не могу комментировать, что может быть не так ...!
Аналогично, пустые строки должны передаваться именно так - пустая строка, то есть str = ""
- что заставляет usp_Bob возвращать 'EMPTY'. Все остальное имеет возвращаемое значение «НЕ НУЛЬ И НЕ ПУСТО» (как и ожидалось).
Если вы не можете пропустить NULL, тогда другой вариант - привести пустую строку к NULL в sproc - т.е.,
IF @param = ''
SET @param = NULL
Обратите внимание, что длина, которую вы проходите, не должна иметь большого значения. Это отражение максимальной длины параметра, определенной в SQL Server, а не длины данных, через которые вы проходите.