Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment gérer les paramètres sql dynamiques

Selon l'implémentation spécifique, nous avons deux approches générales à ce problème :

1) Créez dynamiquement l'instruction de filtre pour la requête SQL dans le code en ignorant tous les paramètres vides. Il s'agit de la meilleure approche si vous autorisez l'utilisateur à sélectionner plusieurs valeurs pour une seule colonne (c'est-à-dire, sélectionnez 0 ou plus des 50 états pour filtrer les données).

Par exemple :

En supposant que txtCondition1 et txtCondition2 sont des zones de texte :

        // 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) Si les valeurs sont plus contraintes, nous les passons généralement à une procédure stockée, qui est chargée de déterminer si la valeur doit être évaluée ou non en testant le paramètre pour "vide", soit null, chaîne vide, 0 pour les numériques , etc.