Что означает команда EXECUTE? - PullRequest
0 голосов
/ 06 мая 2019

Я довольно новичок в использовании SQL, и у меня возникают трудности с пониманием старых запросов и их повторным использованием. Особенно полезность команд EXECUTE и OPENQUERY при работе на связанных серверах.

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

Я читал документацию, подобную этой (https://docs.microsoft.com/fr-fr/sql/t-sql/language-elements/execute-transact-sql?view=sql-server-2017), но я все еще не могу понять, почему EXEC необходим при работе на связанном сервере.

EXEC('
SELECT  Cell_id,
        CAST(Trafic_Voix as float) as Trafic_Voix

        FROM OPENQUERY(myperf_ora,''

            SELECT  Cell_id,
                    MAX( (TFTRALACC+THTRALACC)/360 ) as Trafic_voix

                    FROM VIRTUO.ERI_CELL_TF_CHAN_FR_TAB_V
                    WHERE tstamp  BETWEEN '''''+@DATE_DE_DEBUT+''''' AND '''''+@DATE_DE_FIN+'''''

                    GROUP BY Cell_id                        
                                '')
    ')

Если это что-то изменит, я использую Microsoft SQL Server Management Studio.

Когда я убираю EXEC из запроса, он больше не работает и показывает мне сообщения об ошибках. Я хотел бы знать, почему использование этой команды является обязательным?

То же самое для OPENQUERY

Ответы [ 2 ]

0 голосов
/ 06 мая 2019

EXEC (или EXECUTE) используются для выполнения динамически сгенерированных операторов SQL.

Приведенный здесь запрос не настолько сложен.Так что можно убрать EXEC.Но вы должны заменить двойные одинарные кавычки ('') в (объединенной) строке (строках) на одинарные одинарные кавычки (').

Таким образом, в основном вы хотите выполнить это:

SELECT
    Cell_id,
    CAST(Trafic_Voix as float) as Trafic_Voix
FROM
    OPENQUERY(myperf_ora,'
        SELECT Cell_id,
               MAX( (TFTRALACC+THTRALACC)/360 ) as Trafic_voix
        FROM VIRTUO.ERI_CELL_TF_CHAN_FR_TAB_V
        WHERE tstamp  BETWEEN ''' + @DATE_DE_DEBUT + ''' AND ''' + @DATE_DE_FIN + '''
        GROUP BY Cell_id
    ')

Редактировать (в ответ на комментарий):

На самом деле ... это невозможно.Сожалею.: (

Похоже, что функция набора строк OPENQUERY принимает строковые литералы только для своего второго параметра. Это делает оператор EXEC необходимым: таким образом, динамически генерируемый запрос SQL будет содержать строковый литерал для второго параметрафункция OPENQUERY.

Дэн Гузман уже добавил комментарий к вашему исходному сообщению по этому вопросу.

0 голосов
/ 06 мая 2019

Он выполняет динамические запросы SQL.Этот код создает запрос SQL, например SELECT Cell_id, MAX( (TFTRALACC+THTRALACC)/360 ) as Trafic_voix ..., и выполняет его.Результат запроса доступен курсором myperf_ora.

Зачем им это было нужно?Поскольку переменные DATE_DE_DEBUT и DATE_DE_FIN являются параметрами в запросе, и автор обнаружил, что их проще всего включить в запрос таким образом .

Конечно, есть более элегантные способы сделать это.

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