Ich rufe eine gespeicherte SQL Server-Prozedur aus meinem C # -Code auf:
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();
Mein gespeicherter Prozess ist ziemlich Standard, führt jedoch eine Verknüpfung mit durch QueryTable
(daher muss ein gespeicherter Prozess verwendet werden).
Jetzt: Ich möchte List<string>
dem Parametersatz eine Liste von Zeichenfolgen hinzufügen . Zum Beispiel sieht meine gespeicherte Proc-Abfrage folgendermaßen aus:
SELECT feature
FROM table1 t1
INNER JOIN @QueryTable t2 ON t1.fid = t2.fid
WHERE title IN <LIST_OF_STRINGS_GOES_HERE>
Die Liste der Zeichenfolgen ist jedoch dynamisch und einige hundert lang.
Gibt es eine Möglichkeit, eine Liste von Zeichenfolgen List<string>
an den gespeicherten Prozess zu übergeben? Oder gibt es einen besseren Weg, dies zu tun?
Vielen Dank, Brett
c#
sql
stored-procedures
Brett
quelle
quelle
using
Block befinden.Antworten:
Wenn Sie SQL Server 2008 verwenden, gibt es eine neue Funktion, die als benutzerdefinierter Tabellentyp bezeichnet wird. Hier ist ein Beispiel für die Verwendung:
Erstellen Sie Ihren benutzerdefinierten Tabellentyp:
Als nächstes müssen Sie es ordnungsgemäß in Ihrer gespeicherten Prozedur verwenden:
Zum Schluss noch ein paar SQL, um es in c # zu verwenden:
Um dies von SSMS auszuführen
quelle
Das typische Muster in dieser Situation besteht darin, die Elemente in einer durch Kommas getrennten Liste zu übergeben und diese dann in SQL in eine Tabelle aufzuteilen, die Sie verwenden können. Die meisten Leute erstellen normalerweise eine bestimmte Funktion, um dies zu tun:
Und dann können Sie es in anderen Abfragen verwenden.
quelle
Nein, Arrays / Listen können nicht direkt an SQL Server übergeben werden.
Folgende Optionen stehen zur Verfügung:
quelle
Ja, machen Sie den gespeicherten Proc-Parameter zu
VARCHAR(...)
Und übergeben Sie dann durch Kommas getrennte Werte an eine gespeicherte Prozedur.Wenn Sie SQL Server 2008 verwenden, können Sie TVP ( Table Value Parameters ) nutzen: SQL 2008 TVP und LINQ, wenn die Struktur von QueryTable komplexer ist als das Array von Zeichenfolgen. Andernfalls wäre dies ein Overkill, da der Tabellentyp in SQl Server erstellt werden muss
quelle
Erstellen Sie eine Datentabelle mit einer Spalte anstelle von Liste und fügen Sie der Tabelle Zeichenfolgen hinzu. Sie können diese Datentabelle als strukturierten Typ übergeben und einen weiteren Join mit dem Titelfeld Ihrer Tabelle ausführen.
quelle
Wenn Sie es vorziehen, eine CSV-Liste in SQL zu teilen, gibt es eine andere Möglichkeit, dies mithilfe von Common Table Expressions (CTEs) zu tun . Siehe Effiziente Methode zum Teilen von Zeichenfolgen mithilfe von CTE .
quelle
Die einzige Möglichkeit, die mir bekannt ist, besteht darin, eine CSV-Liste zu erstellen und diese dann als Zeichenfolge zu übergeben. Teilen Sie es dann auf der SP-Seite einfach auf und tun Sie, was Sie brauchen.
quelle
Erstellen Sie einen TYP als Tabelle und nennen Sie ihn "StringList1".
Erstellen Sie eine Prozedur wie oben und nennen Sie sie "UserStringList1"
Versuchen Sie dies in der c #
quelle