#sql #sql-server
#sql #sql-сервер
Вопрос:
Я пишу SQL-запрос на основе пользовательского ввода, так как эти входные данные будут меняться ежедневно.
Цель запроса — извлечь все данные только для идентификаторов в пользовательском списке. Пример ниже-
Однако я получаю следующую ошибку:
«Ошибка преобразования при преобразовании varchar […] в тип данных int»
Есть идеи о том, каков оптимальный способ указать список и использовать этот список в предложении «ID in (..)»? Я попытался преобразовать список идентификаторов в строки, но все равно получаю аналогичную ошибку.
id_list = [12,16,22,42,1,24]
date = '2020-12-18'
query = (
"""
DECLARE @id varchar(1000), @date datetime
SET @id = '{}'
SET @date = '{}'
SELECT * from TABLE where ID in (@id) and Date = @Date
"""
.format(id_list,date))
Желаемый результат заключается в том, чтобы запрос мог получать список идентификаторов, которые могут быть использованы в предложении.
идентификатор в @id
Комментарии:
1. Вы имели в виду
.format(id_list, date)
? Вы распечатали SQL-запрос и проверили его по документации на правильность синтаксиса? Абстрагируйтесь от Python здесь, чтобы упростить ваш вопрос.2. Я добавил тег SQL Server, потому что синтаксис выглядит как SQL Server.
3. @AsteroidsWithWings, спасибо за это — сделано.
Ответ №1:
SQL Server не поддерживает списки или массивы. Итак, лучшим методом является таблица:
declare @id_list table (id int);
insert into @idlist (id)
values (12), (16), (22), (42), (1), (24);
Затем вы можете использовать это везде, где вы использовали бы табличную переменную. Например:
where id in (select id from @id_list)
Комментарии:
1. есть ли более простой способ вставить val в эту таблицу, возможно, через цикл? @gordon
2. Если у вас есть значения в таблице, вы можете просто вставить их. Если вы хотите представить это как цикл, вы можете думать о «значении» как о «где». Или поместите их в строку и разделите строку.
3. это работает просто отлично. Спасибо за информацию @Gordon. Счастливых праздников