Проект я продолжаю работать, имеет много из В ЗАПРОСАХ как:
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, решения для них обоих приветствуются.
Для SQL-сервера существует два общих подхода. Третий вариант , которого следует избегать - это передача в -варчаре
и соединение его в динамический SQL-оператор с - IN
- это чистая поверхность атаки инъекций.
Разумные опции:
pass в varchar
и использование UDF для разделения данных на разделителе (, как в этом вопросе), возможно, запятая, труба, табу и т.д. Присоединяйтесь к результату:
SELECT something, anotherthing
от
INNER JOIN dbo.SplitUDF(@values) udf
ON udf.Value = a.something
Взгляните на эти статьи
Это пример использования типа 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)