Вызов * File * команд T-SQL из скрипта T-SQL - PullRequest
0 голосов
/ 29 мая 2018

Мне нужно «внедрить» файл , который содержит процедуру T-SQL, во многие сценарии T-SQL.Что-то вроде:

EXECUTE  '../CSV_From_Sql.sql', #CsvFileCreator <other parameters>

, где #CsvFileCreator - это точка входа (т.е. имя процедуры) в '../CSV_From_Sql.sql'.

Обратите внимание, что результаты, полученные с помощью #CsvFileCreator, должны находиться в пределах (доступной) области действия / пространства имен вызывающего сценария.

В настоящий момент мне не разрешено создаватьхранимые процедуры.Чтобы соответствовать требованиям области видимости, #CsvFileCreator должен быть «внедрен» (скопирован) в каждый скрипт.Это должно быть сделано так, чтобы #CsvFileCreator мог одновременно обновляться во всех запросах (и в конечном итоге преобразовываться в хранимую процедуру).

По сути, желаемый эффект - это операция «вставить текст здесь» (т. Е. Заменить оператор EXECUTE содержимым файла).Что должно быть чрезвычайно просто сделать, за исключением того, что документация Microsoft, похоже, не допускает этого.

Некоторый контекст: в моем случае SQL-сервер используется в качестве серверной части для генератора отчетов Python 3.X GUI.Конечные пользователи не имеют абсолютно никакого доступа к коду SQL, и нет возможности для внедрения.Все, что могут сделать пользователи, - это сделать свой выбор (с помощью флажков, спин-боксов и т. Д.) И нажать кнопку «Создать отчеты» (это приводит к тому, что python вызывает SQL-сервер).Кроме того, сама природа приложения означает, что оно НИКОГДА не будет находиться в сети, подключенной к внешнему миру.

По причинам, в которые я не буду вдаваться, могут использоваться только «чистые» команды T-Sql и любой тип ручного управления (например, использование таких инструментов, как SSMS, bcp, sqlcmd и т. Д.)это невозможно.В моем случае я мог автоматически вставить эту «стандартную процедуру» перед вызовом каждого запроса.

Существует ли чистый T-SQL способ получить эффект «выполнить файл» или «скопировать файл»?

1 Ответ

0 голосов
/ 29 мая 2018

Насколько я знаю, невозможно открыть текстовый файл из хранимого процесса и выполнить его содержимое.И, как было отмечено в комментариях, это имеет БОЛЬШИЕ последствия для безопасности.

Сказав это, можно выполнить динамический SQL, используя sp_execute_sql.(См. здесь для получения полной информации.) И где вы получите кусок текста, который вы выполняете, зависит от вас.

Итак, некоторые возможности включают в себя:

  • Передача текста в скрипт в качестве параметра
  • Возврат текста в скрипт как результат скалярной функции.(Никогда этого не делал, но это должно быть возможно.)
  • Чтение текста для выполнения из таблицы

Вы ссылаетесь на «сценарии», а также называете их «запросами».».Поэтому я предполагаю, что они выполняются различными способами, и у вас нет одной центральной прикладной подпрограммы, которая выполняет их (и может быть изменена для выполнения других задач заранее).

Заключительная мысль.T-SQL не является языком / средой, в которой легко выполняется ввод-вывод файлов или обработка текста, и он не допускает самоанализа.Но Windows (или другие операционные системы) отлично подходят для этого.

Если эти сценарии живут как «сценарии» - текстовые файлы - вы можете написать программу в Windows для их предварительной обработки и вывести файл, содержащий объединенный SQL, который вы затем выполните.Именно то, что вы хотели, за исключением того, что это происходит в Windows, а не в T-SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...