Я вызываю хранимую процедуру SQL Server из моего кода 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();
Моя сохраненная процедура довольно стандартна, но соединяется с QueryTable
(отсюда необходимость использования хранимой процедуры).
Теперь: я хочу добавить список строк List<string>
к набору параметров. Например, мой сохраненный запрос proc выглядит так:
SELECT feature
FROM table1 t1
INNER JOIN @QueryTable t2 ON t1.fid = t2.fid
WHERE title IN <LIST_OF_STRINGS_GOES_HERE>
Однако список строк динамический и насчитывает несколько сотен.
Есть ли способ передать список строк List<string>
в хранимую процедуру ??? Или есть способ лучше?
Большое спасибо, Бретт
c#
sql
stored-procedures
Бретт
источник
источник
using
блоке.Ответы:
Если вы используете SQL Server 2008, есть новая функция, называемая типом таблицы, определяемой пользователем. Вот пример того, как его использовать:
Создайте свой определяемый пользователем тип таблицы:
Затем вам нужно правильно использовать его в вашей хранимой процедуре:
Наконец, вот несколько sql для использования в C #:
Чтобы выполнить это из SSMS
источник
Типичный шаблон в этой ситуации - передать элементы в списке, разделенном запятыми, а затем в SQL разделить его в таблицу, которую вы можете использовать. Большинство людей обычно создают для этого определенную функцию, например:
А затем вы можете использовать его в других запросах.
источник
Нет, массивы / списки нельзя передавать непосредственно в SQL Server.
Доступны следующие варианты:
источник
Да, сделайте параметр Stored proc как
VARCHAR(...)
А затем передайте значения, разделенные запятыми, в хранимую процедуру.Если вы используете Sql Server 2008, вы можете использовать TVP ( параметры значений таблицы ): SQL 2008 TVP и LINQ, если структура QueryTable более сложная, чем массив строк, в противном случае это было бы излишним, потому что требуется, чтобы тип таблицы был создан в SQl Server.
источник
Сделайте datatable с одним столбцом вместо списка и добавьте строки в таблицу. Вы можете передать эту таблицу данных как структурированный тип и выполнить еще одно соединение с полем заголовка вашей таблицы.
источник
Если вы предпочитаете разбивать список CSV в SQL, есть другой способ сделать это с помощью общих табличных выражений (CTE). См. Раздел « Эффективный способ разделения строк с помощью CTE» .
источник
Единственный способ, о котором я знаю, - это создать список CSV и затем передать его как строку. Затем, на стороне SP, просто разделите его и делайте все, что вам нужно.
источник
создайте ТИП как таблицу и назовите его "StringList1"
Создайте процедуру, как указано выше, и назовите ее "UserStringList1" s
в С #, попробуйте это
источник