C# SQL Server - Passage d'une liste à une procédure stockée
Je suis de l'appel d'une procédure stockée SQL Server à partir de mon code C#:
using (SqlConnection conn = new SqlConnection(connstring))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("InsertQuerySPROC", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
var STableParameter = cmd.Parameters.AddWithValue("@QueryTable", QueryTable);
var NDistanceParameter = cmd.Parameters.AddWithValue("@NDistanceThreshold", NDistanceThreshold);
var RDistanceParameter = cmd.Parameters.AddWithValue(@"RDistanceThreshold", RDistanceThreshold);
STableParameter .SqlDbType = SqlDbType.Structured;
NDistanceParameter.SqlDbType = SqlDbType.Int;
RDistanceParameter.SqlDbType = SqlDbType.Int;
//Execute the query
SqlDataReader QueryReader = cmd.ExecuteReader();
De ma procédure stockée est assez standard, mais ne une jointure avec QueryTable
(d'où la nécessité pour les pour les à l'aide d'une procédure stockée).
Maintenant: je veux ajouter une liste de chaînes de caractères, List<string>
, pour le jeu de paramètres. Par exemple, ma procédure stockée requête qui va comme ceci:
SELECT feature
FROM table1 t1
INNER JOIN @QueryTable t2 ON t1.fid = t2.fid
WHERE title IN <LIST_OF_STRINGS_GOES_HERE>
Toutefois, la liste des chaînes est dynamique et à une centaine de long.
Est-il un moyen pour passer d'une liste de chaînes de List<string>
à la procédure stockée??? Ou est-il une meilleure façon de le faire?
Merci beaucoup,
Brett
- Éventuellement, double de stackoverflow.com/questions/209686/...
- Ce version de SQL Server?? 2005?? 2008 ?? 2008 R2 ?? SQL Server 2008 et plus récent a le concept de "table des paramètres" (voir Redth la réponse pour plus de détails)
- Sans rapport avec astuce: le SqlDataReader est également IDisposable devrait donc être dans un
using
bloc.
Vous devez vous connecter pour publier un commentaire.
Si vous utilisez SQL Server 2008, il y a une nouvelle vedette appelé un Type de Table Défini par l'Utilisateur. Voici un exemple de comment l'utiliser:
Créer votre Utilisateur Type de Table Défini par:
Ensuite, vous devez l'utiliser correctement dans votre procédure stockée:
Enfin voici quelques sql à utiliser en c#:
Pour exécuter cette de SSMS
IN
de la clause de la sorte:SELECT [columnA] FROM [MyTable] WHERE [Id] IN (@List)
mais lorsque j'essaie de mettre à jour ma Procédure Stockée pour ce faire, SQL Server 2012 me dit que je dois Déclarer la variable scalaire @Liste. Je l'utilise dans la section paramètres, comme vous êtes donc, lorsque j'essaie de mettre DÉCLARER en face d'elle je reçois beaucoup d'erreurs de syntaxe... toutes les idées @Redth ?Le modèle typique de cette situation est de passer les éléments dans une liste délimitée par des virgules, puis dans SQL répartis dans un tableau, vous pouvez utiliser. La plupart des gens créent habituellement une fonction spécifiée pour ce faire, comme:
Et puis vous pouvez l'utiliser dans d'autres requêtes.
Non, les tableaux/listes ne peuvent pas être transmis à SQL Server directement.
Les options suivantes sont disponibles:
Yep, faire Stockées proc paramètre comme
VARCHAR(...)
Et puis passer valeurs séparées par des virgules à une procédure stockée.
Si vous utilisez Sql Server 2008, vous pouvez tirer parti de la TVP (Le Tableau De La Valeur Des Paramètres): SQL 2008 TVP et LINQ si la structure de la table de requête plus complexe que le tableau de chaînes de caractères sinon il serait inutile parce que requiert type de table dans SQl Server
Faire une table avec une colonne au lieu de la Liste et ajouter des chaînes à la table. Vous pouvez passer cette datatable comme type structuré et effectuer une autre jointure avec le champ titre de votre table.
Si vous préférez le fractionnement d'un fichier CSV liste en SQL, il y a une manière différente de le faire à l'aide de Les Expressions De Table Communes (expressions de table communes). Voir Moyen efficace de la chaîne de split à l'aide de la CTE.
La seule façon dont je suis conscient, c'est la construction CSV liste, puis en le passant comme une chaîne de caractères. Ensuite, sur le SP côté, juste de le diviser et de faire tout ce dont vous avez besoin.