Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Umgang mit dynamischen SQL-Parametern

Abhängig von der spezifischen Implementierung haben wir zwei allgemeine Ansätze für dieses Problem:

1) Erstellen Sie die Filteranweisung für die SQL-Abfrage dynamisch im Code und überspringen Sie alle Parameter, die leer sind. Dies ist der beste Ansatz, wenn Sie dem Benutzer erlauben, mehrere Werte für eine einzelne Spalte auszuwählen (d. h. 0 oder mehr der 50 Staaten auswählen, um die Daten zu filtern).

Zum Beispiel:

Angenommen, txtCondition1 und txtCondition2 sind Textfelder:

        // Assuming conn is an open SqlConnection

        System.Text.StringBuilder sbSQL = new StringBuilder(500);

        List<SqlParameter> cParameters = new List<SqlParameter>();

        // Add a default condition of 1=1 so that all subsequent conditions can be added 
        // with AND instead of having to check to see whether or not any other conditions
        // were added before adding AND.
        sbSQL.Append("SELECT * FROM MyTestTable WHERE 1 = 1 ");

        if (!String.IsNullOrEmpty(txtCondition1.Text)) {
            sbSQL.Append(" AND Column1 = @Column1");
            cParameters.Add(new SqlParameter("@Column1", txtCondition1.Text));
        }
        if (!String.IsNullOrEmpty(txtCondition1.Text))
        {
            sbSQL.Append(" AND Column2 = @Column2");
            cParameters.Add(new SqlParameter("@Column2", txtCondition2.Text));
        }

        SqlCommand oCommand = new SqlCommand(sbSQL.ToString, conn);
        if (cParameters.Count != 0) 
        {
            oCommand.Parameters.AddRange(cParameters.ToArray());
        } 

        // Do something with oCommand

2) Wenn die Werte eingeschränkter sind, übergeben wir sie normalerweise an eine gespeicherte Prozedur, die dafür verantwortlich ist, zu bestimmen, ob der Wert ausgewertet werden soll oder nicht, indem der Parameter auf "Leerheit" getestet wird, entweder null, leere Zeichenfolge, 0 für Zahlen usw.