Я пытаюсь отладить чужие отчеты SQL и поместил базовый запрос отчетов в окна запросов SQL 2012.
Одним из параметров, запрашиваемых в отчете, является список целых чисел. Это достигается в отчете с помощью раскрывающегося списка с несколькими вариантами выбора. Основной запрос отчета использует этот список целых чисел в where
предложении, например:
select *
from TabA
where TabA.ID in (@listOfIDs)
Я не хочу изменять отлаживаемый запрос, но не могу понять, как создать на SQL Server переменную, которая может содержать данные этого типа для его проверки.
например
declare @listOfIDs int
set listOfIDs = 1,2,3,4
Не существует типа данных, который может содержать список целых чисел, так как я могу выполнить запрос отчета на моем SQL Server с теми же значениями, что и отчет?
sql-server
list
tsql
variables
reporting-services
ErickTreetops
источник
источник
Ответы:
Переменная таблицы
или
источник
SET @AddressIDs = (SELECT ID FROM address WHERE Account = 1234)
этот запрос вернет несколько идентификаторов, и я получаю сообщение об ошибке, в котором говорится, что подзапрос возвратил более одного результата, и это недопустимо. Есть ли в любом случае создать переменную, которая будет хранить массив, если идентификаторы из подзапроса?Предполагая, что переменная похожа на:
И хранимая процедура использует его в этой форме:
Вы можете создать IntList и вызвать процедуру следующим образом:
Или, если вы предоставляете IntList самостоятельно
источник
Вы правы, в SQL-сервере нет типа данных, который может содержать список целых чисел. Но вы можете сохранить список целых чисел в виде строки.
Затем вы можете разбить строку на отдельные целочисленные значения и поместить их в таблицу. Ваша процедура может уже сделать это.
Вы также можете использовать динамический запрос для достижения того же результата:
источник
Для SQL Server 2016+ и базы данных SQL Azure была добавлена функция STRING_SPLIT, которая была бы идеальным решением для этой проблемы. Вот документация: https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql
Вот пример:
Результат запроса 1,3
~ Приветствия
источник
В итоге я пришел к выводу, что без изменения работы запроса я не смогу хранить значения в переменных. Я использовал SQL profiler, чтобы перехватить значения, а затем жестко запрограммировал их в запрос, чтобы увидеть, как это работает. Было 18 из этих целочисленных массивов, а в некоторых содержалось более 30 элементов.
Я думаю, что MS / SQL необходимо ввести некоторые дополнительные типы данных в язык. Массивы довольно распространены, и я не понимаю, почему вы не можете использовать их в хранимых процессах.
источник
Вы не можете сделать это так, но вы можете выполнить весь запрос, сохраняя его в переменной.
Например:
источник
В SQL есть новая функция, которая вызывается,
string_split
если вы используете список строк. Ссылка на ссылку STRING_SPLIT (Transact-SQL)Вы можете передать этот запрос
in
следующим образом:источник
Я использую это:
1-Объявите переменную временной таблицы в скрипте вашего здания:
2-Распределить во временную таблицу:
3-Ссылка на таблицу, когда вам это нужно в выражении WHERE:
источник