Многозначный параметр в T-SQL Query - PullRequest
1 голос
/ 28 августа 2009

Я работаю над страницей .aspx, в которой используется запрос t-sql, в котором используется многозначный входной параметр (набор лабораторных имен) с использованием массива, в котором будут храниться все лабораторные имена до выполнения запроса.

У меня есть следующие параметры для запроса.

        With c.Parameters
        .Add(New SqlParameter("@sdate", sdate.text))
        .Add(New SqlParameter("@edate", edate.text))
        .Add(New SqlParameter("@labname", SqlDbType.Text)).Value = labnamesparam.ToString
    End With

Однако я все еще вижу, что только одно лабораторное имя (3-й параметр в порядке).

Есть идеи по этому поводу?

Ответы [ 4 ]

2 голосов
/ 28 августа 2009

Для SQL 2008 вы должны использовать TVP, как рекомендовано Марком.

В SQL 2005 есть несколько методов, таких как использование XML или использование списка с разделителями-запятыми. Эрланд Соммарског (Erland Sommarskog) предлагает подробный анализ каждой техники на странице http://www.sommarskog.se/arrays-in-sql-2005.html.

Для SQL 2000 вариантов меньше, и снова Эрланд подробно обсуждает каждый из них на Массивы и списки в SQL Server (SQL 2000 и более ранние версии) .

Я настоятельно рекомендую статьи Эрланда, они уже много лет являются предметом этой темы.

1 голос
/ 28 августа 2009

Вам нужно превратить состязание массива в строку. Вот пример c #, конечно, не единственный способ сделать это.

        System.Text.StringBuilder k = new System.Text.StringBuilder();
        foreach (string x in LABNAMES) {
            k.Append(x);
            k.Append(",");
        }
        .Add(New SqlParameter("@labname", SqlDbType.Text)).Value =k.ToString();

Вы должны будете изменить свой sql, хотя у вас не может быть такого динамического предложения. Старый трюк, но не очень хорошая практика - превращать весь sql в строку и выполнять ее один.

0 голосов
/ 28 августа 2009

Если вы используете SQL Server 2008, вы можете использовать функцию "табличного параметра" (TVP).

По сути, в SQL Server 2008 вам необходимо определить пользовательский тип таблицы:

CREATE TYPE Customer AS 
    TABLE (id int, CustomerName nvarchar(50), postcode nvarchar(50))

, а затем используйте это в своей хранимой процедуре в качестве параметра:

CREATE Procedure AddCustomers(@customer Customer READONLY)

А затем в своем коде C # вы создадите переменную DataTable той же структуры и будете использовать ее в качестве входного параметра. Таким образом, вы можете передать любое количество значений и любую понравившуюся вам структуру.

См. Эти превосходные сообщения в блоге для получения дополнительной информации и обширных примеров кода:

Марк

0 голосов
/ 28 августа 2009

Вам может потребоваться немного больше работы в вашей хранимой процедуре, если вы хотите передать ей массив строк и выполнить операцию T-SQL «IN».

В этой статье есть очень хороший пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...