Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como passar strings NULL ou vazias para o parâmetro de entrada do procedimento armazenado com ADO e VB?


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.