J'appelle 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();
Mon proc stocké est assez standard mais fait une jointure avec QueryTable
(d'où la nécessité d'utiliser un proc stocké).
Maintenant: je veux ajouter une liste de chaînes List<string>
,, au jeu de paramètres. Par exemple, ma requête proc stockée ressemble à ceci:
SELECT feature
FROM table1 t1
INNER JOIN @QueryTable t2 ON t1.fid = t2.fid
WHERE title IN <LIST_OF_STRINGS_GOES_HERE>
Cependant, la liste des chaînes est dynamique et longue de quelques centaines.
Existe-t-il un moyen de passer une liste de chaînes List<string>
au proc stocké ??? Ou y a-t-il une meilleure façon de faire cela?
Merci beaucoup, Brett
c#
sql
stored-procedures
Brett
la source
la source
using
bloc.Réponses:
Si vous utilisez SQL Server 2008, il existe une nouvelle fonctionnalité appelée un type de table défini par l'utilisateur. Voici un exemple de son utilisation:
Créez votre type de table défini par l'utilisateur:
Ensuite, vous devez l'utiliser correctement dans votre procédure stockée:
Enfin, voici quelques sql pour l'utiliser en c #:
Pour l'exécuter à partir de SSMS
la source
Le modèle typique dans cette situation est de transmettre les éléments dans une liste délimitée par des virgules, puis en SQL de les diviser en une table que vous pouvez utiliser. La plupart des gens créent généralement une fonction spécifiée pour faire cela comme:
Et puis vous pouvez l'utiliser dans d'autres requêtes.
la source
Non, les tableaux / listes ne peuvent pas être transmis directement à SQL Server.
Les options suivantes sont disponibles:
la source
Oui, définissez le paramètre proc stocké sur
VARCHAR(...)
Et puis passez les valeurs séparées par des virgules à une procédure stockée.Si vous utilisez Sql Server 2008, vous pouvez tirer parti de TVP ( paramètres de valeur de table ): SQL 2008 TVP et LINQ si la structure de QueryTable est plus complexe que le tableau de chaînes, sinon ce serait excessif car le type de table doit être créé dans SQl Server
la source
Créez un datatable avec une colonne au lieu de List et ajoutez des chaînes à la table. Vous pouvez passer ce datatable en tant que type structuré et effectuer une autre jointure avec le champ title de votre table.
la source
Si vous préférez fractionner une liste CSV en SQL, il existe une manière différente de le faire à l'aide d' expressions de table communes (CTE). Voir moyen efficace de split chaîne en utilisant CTE .
la source
Le seul moyen dont je suis conscient est de créer une liste CSV, puis de la passer sous forme de chaîne. Ensuite, du côté SP, divisez-le et faites tout ce dont vous avez besoin.
la source
créer un TYPE comme table et le nommer "StringList1"
Créez une procédure comme ci-dessus et nommez-la comme "UserStringList1" s
dans le c #, essayez ceci
la source