Wywołuję procedurę składowaną programu SQL Server z mojego kodu 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();
Mój zapisany proces jest dość standardowy, ale łączy go z QueryTable
(stąd potrzeba używania przechowywanego procesu).
Teraz: chcę dodać listę ciągów List<string>
, do zestawu parametrów. Na przykład moje przechowywane zapytanie proc wygląda następująco:
SELECT feature
FROM table1 t1
INNER JOIN @QueryTable t2 ON t1.fid = t2.fid
WHERE title IN <LIST_OF_STRINGS_GOES_HERE>
Jednak lista strun jest dynamiczna i kilkaset długich.
Czy istnieje sposób na przekazanie listy ciągów List<string>
do przechowywanego procesu ??? Czy jest lepszy sposób, aby to zrobić?
Wielkie dzięki, Brett
c#
sql
stored-procedures
Brett
źródło
źródło
using
bloku.Odpowiedzi:
Jeśli używasz SQL Server 2008, dostępna jest nowa funkcja zwana typem tabeli zdefiniowanym przez użytkownika. Oto przykład, jak go używać:
Utwórz typ tabeli zdefiniowany przez użytkownika:
Następnie musisz go poprawnie użyć w swojej procedurze składowanej:
Na koniec jest trochę sql do użycia w C #:
Aby wykonać to z SSMS
źródło
Typowy wzorzec w tej sytuacji polega na przekazaniu elementów w postaci listy rozdzielanej przecinkami, a następnie w języku SQL podzielenie jej na tabelę, której można użyć. Większość ludzi zwykle tworzy określoną funkcję, aby to zrobić, na przykład:
A potem możesz go użyć w innych zapytaniach.
źródło
Nie, tablice / listy nie mogą być przekazywane bezpośrednio do SQL Server.
Dostępne są następujące opcje:
źródło
Tak, ustaw parametr Stored proc na
VARCHAR(...)
A następnie przekaż wartości oddzielone przecinkami do procedury składowanej.Jeśli używasz Sql Server 2008, możesz wykorzystać TVP ( Table Value Parameters ): SQL 2008 TVP i LINQ, jeśli struktura QueryTable jest bardziej złożona niż tablica ciągów, w przeciwnym razie byłaby to przesada, ponieważ wymaga utworzenia typu tabeli w SQl Server
źródło
Utwórz datatable z jedną kolumną zamiast listy i dodaj ciągi do tabeli. Możesz przekazać ten zbiór danych jako typ strukturalny i wykonać inne sprzężenie z polem tytułu tabeli.
źródło
Jeśli wolisz podzielić listę CSV w języku SQL, możesz to zrobić w inny sposób, używając wspólnych wyrażeń tabelowych (CTE). Zobacz Efektywny sposób dzielenia ciągów za pomocą CTE .
źródło
Jedynym sposobem, o którym wiem, jest zbudowanie listy CSV i przekazanie jej jako ciągu znaków. Następnie, po stronie SP, po prostu podziel go i rób, co potrzebujesz.
źródło
utwórz TYPE jako tabelę i nazwij ją jako „StringList1”
Utwórz procedurę jak powyżej i nazwij ją jako „UserStringList1” s
w c #, spróbuj tego
źródło