Почему в данном случае @sql является переменной nvarchar (max) и как это влияет на оператор?(SQL Server) - PullRequest
0 голосов
/ 25 июня 2019

Относительно этого кода:

DECLARE @sql NVARCHAR(MAX);

...

BEGIN TRANSACTION loadTempWorkingTime;

    DROP TABLE IF EXISTS ##tempWorkingTime;

    SET @query = 'SELECT 
                    u_iv_1,
                    personnel_number,
                    date,
                    department_name,
                    alran_department_id,
                    CONVERT(begin_time, CHAR) AS begin_time,
                    CONVERT(end_time, CHAR) AS end_time,
                    break,
                    ordinary_hours,
                    total_working_time,
                    paid_nonworking_time,
                    workday,
                    Approved_by_user,
                    Approved_by_admin,
                    Approved_by_user_1,
                    working_time_total_balance,
                    holiday,
                    holiday_balance,
                    LOGA_AS_anpassung
                FROM pm_altran.altran_pm_working_time_overview 
                WHERE Date BETWEEN "' + CAST(@firstDayToConsider AS VARCHAR(10)) + '" AND "' + CAST(@lastDayToConsider AS VARCHAR(10)) + '" 
                    AND active=1 AND personnel_number<>""''';
        SET @sql = N'select * into ##tempWorkingTime
                    from OPENQUERY(
                            [SRV_Timetac],''';
        SET @sql = @sql + @query + ')';
        EXEC (@sql);
        COMMIT TRANSACTION loadTempWorkingTime;

Особенно эта часть:

SET @sql = N'select * into ##tempWorkingTime
                    from OPENQUERY(
                            [SRV_Timetac],''';
        SET @sql = @sql + @query + ')';

Контекст:

В настоящее время я начинаю изучать SQL в целом, и я пытаюсьвыяснить, какая процедура вызывает, какие и так далее.Я искал заявления EXEC, чтобы получить более близкое представление, но я сталкиваюсь с этим утверждением довольно часто, и мне кажется, что я не могу обернуть это вокруг.

Так что похоже, что @sqlвременный стол.

Теперь мы выбираем данные из pm_altran.altran_pm_working_time_overview и вставляем их в @sql.

Я здесь?

Особенно в этой строке:

SET @sql = N'select * into ##tempWorkingTime

Этот "N'select" действительно беспокоит меня.

Если бы вы, ребята, могли бы немного подробнее объяснить, что здесь происходит, я был бы очень, очень рад :)

Спасибо, друзья!

1 Ответ

2 голосов
/ 25 июня 2019

@sql не является временной таблицей, это просто переменная, которая содержит значение nvarchar(max).Этот тип данных предназначен для строк Unicode, а max означает, что нет (строго говоря, чрезмерно высокого) ограничения на объем текста, который он может содержать.Это имеет последствия по сравнению с указанием числового предела (например, nvarchar(500)), но это детали для другого времени.

Выделенное вами утверждение:

SET @sql = N'select * into ##tempWorkingTime
                    from OPENQUERY(
                            [SRV_Timetac],''';
        SET @sql = @sql + @query + ')';

просто строитсяоператор SQL в переменной @sql, путем объединения текста, содержащегося в @sql и @query, а затем закрывающей скобки.Результат этой конкатенации сохраняется обратно в переменную @sql, перезаписывая предыдущее значение.Префикс N' сообщает SQL Server, что следующий текст будет в юникоде.

Как только полный оператор SQL будет создан и сохранен в переменной @sql, он выполняется для базы данных через EXEC(@sql)в конце вашего сценария.

Это создание сценария SQL на лету, а затем его выполнение называется Динамический SQL , поскольку содержимое выполняемого оператора может измениться..

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