Передайте массив как значение в DBParameter ado.net

Проект я продолжаю работать, имеет много из В ЗАПРОСАХ как:

SELECT something, anotherthing
FROM atable
WHERE something IN (value1, value2, value3)

Это - пример запроса с 3 параметрами в Частично, но тот же запрос мог быть выполнен с 1 или 2 или 5 или 10 или... параметры. Проблема состоит в том, что каждый запрос имеет другой план выполнения в базе данных с, заставляет его замедлиться.

Я хотел бы к hava запрос как это:

SELECT something, anotherthing
FROM atable
WHERE something IN (@value1, @value2, @value3)

или это:

SELECT something, anotherthing
FROM atable
WHERE something IN (@values)

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

Что лучший способ состоит в том, чтобы передать массив как параметр базы данных? Я использую Oracle Server и SQL Server, решения для них обоих приветствуются.

6
задан Jochen 28 July 2012 в 20:30
поделиться

2 ответа

Для SQL-сервера существует два общих подхода. Третий вариант , которого следует избегать - это передача в -варчаре и соединение его в динамический SQL-оператор с - IN - это чистая поверхность атаки инъекций.

Разумные опции:

  • pass в varchar и использование UDF для разделения данных на разделителе (, как в этом вопросе), возможно, запятая, труба, табу и т.д. Присоединяйтесь к результату:

    SELECT something, anotherthing
    от
    INNER JOIN dbo.SplitUDF(@values) udf
     ON udf.Value = a.something
    
  • используйте параметр таблицы (SQL2008) и присоединяйтесь напрямую (избегайте UDF)
4
ответ дан 17 December 2019 в 04:47
поделиться

Взгляните на эти статьи

Это пример использования типа XML для создания списка

--Split
DECLARE @textXML XML
DECLARE @data NVARCHAR(MAX), 
        @delimiter NVARCHAR(5)

SELECT  @data = 'A,B,C',
        @delimiter = ','

SELECT    @textXML = CAST('<d>' + REPLACE(@data, @delimiter, '</d><d>') + '</d>' AS XML)
SELECT  T.split.value('.', 'nvarchar(max)') AS data
FROM    @textXML.nodes('/d') T(split)
1
ответ дан 17 December 2019 в 04:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: