TSQLQuery. Несколько команд за один раз

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

TSQLQuery. Несколько команд за один раз

Сообщение GAMER » 18.05.2020 10:41:16

Есть TSQLQuery.
Есть последовательность команд
Код: Выделить всё
declare
@datein datetime=CONVERT(datetime,'2020-01-01T00:00:00.000',126),
@dateout datetime=CONVERT(datetime,'2020-01-15T00:00:00.000',126)

exec myProc @datein,@dateout

можно ли это выполнить за один раз, если последовательность команд записана в String?

СУБД MSSQL
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 620
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: TSQLQuery. Несколько команд за один раз

Сообщение Снег Север » 18.05.2020 10:55:16

Можно выполнить всё, что позволяется синтаксисом SQL соответствующего сервера БД. В мускуле, например, отдельные команды в наборе команд разделяются точкой с запятой.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2681
Зарегистрирован: 27.11.2007 16:14:47

Re: TSQLQuery. Несколько команд за один раз

Сообщение GAMER » 18.05.2020 10:57:46

Сервер менеджмент студио такое выполняет без проблем. Но мне кажеться, он это разделяет на отдельные команды сам и последовательно выполняет. С Лазарусом такой фокус не идет (пишет какие-то ошибки внутрене-скл-ные).
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 620
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: TSQLQuery. Несколько команд за один раз

Сообщение Снег Север » 18.05.2020 10:59:36

Какая это БД?
Вообще-то мой склероз подсказывает, для выполнения подобных команд специально предназначен TSQLScript.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2681
Зарегистрирован: 27.11.2007 16:14:47

Re: TSQLQuery. Несколько команд за один раз

Сообщение GAMER » 18.05.2020 11:12:50

МССКЛ. За TSQLScript - спасибо, проверю.

Добавлено спустя 11 минут 7 секунд:
Хм... Если процедура возвращает таблицу, то как при выполнении скрипта получить значения ячеек? Или это только для выполнение без возвращения результата?
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 620
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: TSQLQuery. Несколько команд за один раз

Сообщение Снег Север » 18.05.2020 11:44:30

Сохранять результат во временную таблицу/курсор.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2681
Зарегистрирован: 27.11.2007 16:14:47

Re: TSQLQuery. Несколько команд за один раз

Сообщение GAMER » 18.05.2020 12:19:07

Это не получится одним пакетом. Так как скрипт выполнит все подготовительные работы, но получить результат (таблицу) не даст.
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 620
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: TSQLQuery. Несколько команд за один раз

Сообщение Снег Север » 18.05.2020 13:57:49

У мелкомягких нет возможности создать временную таблицу, направить в неё выхлоп процедуры и потом прочитать данные из этой таблицы? Никогда не поверю... :)
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2681
Зарегистрирован: 27.11.2007 16:14:47

Re: TSQLQuery. Несколько команд за один раз

Сообщение GAMER » 18.05.2020 14:19:02

Дело не в этом. Просто есть внешний СКЛ-запрос. И с ним нужно работыть. Но похоже, что проблема не в Лазарусе, какая-то другая. Разбираюсь.

Добавлено спустя 27 минут 3 секунды:
Похоже, что создается темповая таблица в темповой БД. Подключаячь к БД1 я могу обращаться к другой БД? Права у пользователя есть. Такое ощущение, что при работе процедуры с другой БД в Лазарусе какой-то конфликт с правами.

Добавлено спустя 1 час 31 минуту 55 секунд:
Похоже, что ситуация следующая. СКЛквери ждет возврат таблицы, и считает, что работает в ридонлы режиме. Но сама процедура, делает инсерт и не может. Вопрос, как указать, что режим не ридонли, но ожидаеться таблица как результат.
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 620
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: TSQLQuery. Несколько команд за один раз

Сообщение Снег Север » 18.05.2020 17:27:29

Свойства соединения и права юзера на сервере, как-то так.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2681
Зарегистрирован: 27.11.2007 16:14:47

[Решено] TSQLQuery. Несколько команд за один раз

Сообщение GAMER » 18.05.2020 17:53:34

Разобрался. Совпало, что процедура делала insert. В ODBC и других мелкомягких программах параметр задавался неявно, для Лазаруса пришлось дополнительно давать команду SET ANSI_NULL_DFLT_ON ON;
https://docs.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql?redirectedfrom=MSDN&view=sql-server-ver15
Через точку с запятой все нормально работает.
Спасибо.
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 620
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: TSQLQuery. Несколько команд за один раз

Сообщение jsa » 15.06.2020 17:01:34

В тексте запроса может быть любой скрипт, но быть команды GO не должно.
Если хранимая процедура имеет в составе select то запрос вернет данные.
Соответственно нужно использовать именно TSQLQuery
Лучше завести привычку и все необходимые установки SET делать всегда в своих приложениях.
Ну или вообще не опираться на установки по умолчанию при написании скрипта.
Т.е. вместо SET dateformat ymd везде прописывать convert(datetime,'2020-06-15', 120) кау вас и сделано в примере.
Но некоторые вещи придется указывать (например при работе с расписаниями типа таких SET datefirst 1 )
Имея такую привычку не придется потом тратить время на разбирательства почему работает не так, или вообще не работает, если база переедет на MS SQL сервер с другими установками по умолчанию.
jsa
постоялец
 
Сообщения: 181
Зарегистрирован: 28.11.2017 13:46:04

Re: TSQLQuery. Несколько команд за один раз

Сообщение GAMER » 15.06.2020 19:12:47

SET ANSI_NULL_DFLT_ON ON;
Я об этом даже и не подозревал, и это завело меня в ступор.
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 620
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: MailRu[bot] и гости: 8

Рейтинг@Mail.ru