Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come passare stringhe NULL o vuote al parametro di input della procedura memorizzata con ADO e VB?

Un rapido test qui mostra che NULL dovrebbe fare il lavoro. Codice di esempio che ho usato per testare (su un semplice modulo con un pulsante e una casella di testo):

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 ha chiamato questo stored proc:

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 ha restituito 'NULL' per l'utilizzo del valore VB Null (come nell'esempio sopra) e 'NOT NULL' per vbNull . Se Null non funziona per te, quindi non posso commentare cosa potrebbe essere sbagliato...!

Allo stesso modo, le stringhe vuote dovrebbero essere passate proprio così:una stringa vuota, ad es. str = "" -- che fa in modo che usp_Bob restituisca 'VUOTO'. Qualsiasi altra cosa fa restituire 'NON NULL E NON VUOTO' (come previsto).

Se non riesci a far passare NULL, un'altra opzione è eseguire il cast di una stringa vuota su NULL in sproc, ovvero

IF @param = ''
    SET @param = NULL

Nota che la lunghezza che attraversi non dovrebbe importare troppo. È un riflesso della lunghezza massima del parametro definita in SQL Server anziché della lunghezza dei dati che stai attraversando.