PowerShell с командой SQL Server Management Studio WAITFOR DELAY - PullRequest
0 голосов
/ 19 ноября 2018

Я не вижу точного или похожего полезного ответа на такой вопрос, поэтому задаю себе вопрос.

Я использую две строки в Powershell ISE для запуска двух очень простых сценариев SQL, которые я написал. Я проверяю, как можно использовать команду WAITFOR DELAY в SQL для запуска одного сценария SQL ... затем подождать некоторое время, прежде чем запускать второй сценарий SQL.

В моем первом скрипте SQL у меня есть простая команда GETDATE (), которую я запускаю перед командой WAITFOR DELAY .. Во втором скрипте SQL у меня внутри та же команда GETDATE (). Затем Powershell ISE использует Out-File для записи этих двух сценариев в файл .txt, чтобы я мог видеть, соблюдает ли он ограничение по времени, которое я вставил в ЗАДЕРЖКУ WAITFOR в моем первом сценарии SQL.

У меня возникли некоторые проблемы, чтобы избежать ошибки: «Invoke-Sqlcmd: истекло время ожидания выполнения. Время ожидания истекло до завершения операции, или сервер не отвечает». ... Тем не менее, я преуспел в том, чтобы заставить ЗАДЕРЖКУ WAITFOR «00: 01: 00» работать, просто поместив ключевое слово «go» между моими SELECT GETDATE () и моими командами WAITFOR DELAY ... но теперь, когда я пытаюсь заставить мой скрипт ждёт ЛЮБОЙ дольше 1 минуты .. Я получаю ту же ошибку, о которой упоминал выше. даже 1 секунда дольше 1 минуты не будет записываться в данные, введенные в мои текстовые файлы.

Моя цель - получить первый текстовый файл для регистрации времени GETDATE () .. затем дать PowerShell подождать 10 минут, прежде чем выполнить второй сценарий SQL с GETDATE () внутри .., чтобы можно было увидеть разницу в 10 минут между выполнением двух сценариев.

Может ли кто-нибудь помочь с тем, как я могу этого достичь?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Для будущих читателей, имеющих такую ​​же проблему .. вы должны использовать -QueryTimeout 0 точно сразу после вашего

Invoke-Sqlcmd -InputFile '__. Sql' ___________…

чтобы это работало. Это не будет работать где-либо еще.

0 голосов
/ 19 ноября 2018

Если вы используете Invoke-Sqlcmd из модуля SqlServer , доступного в галерее PowerShell, вы сможете указать параметр -QueryTimeout, который позволяет указать время ожидания до 65535 секунд (~ 18 часов).Я не уверен, когда это было добавлено, но я знаю, что оно отсутствует в модуле / оснастке SQLPS из SQL Server 2008 R2.

Если это не сработает, вам нужно будет написать собственную версиюиспользуя класс .Net SqlClient.Проблема в том, что он не понимает GO пакетный разделитель, поскольку это не T-SQL.

Имейте в виду, что сама база данных может иметь свой собственный тайм-аут запроса.

Кроме того, если вы просто хотите подождать 10 минут, этого действительно достаточно:

Invoke-Sqlcmd ...
Start-Sleep -Seconds 600
Invoke-Sqlcmd ...

Наконец, если вы тестируете производительность, имейте в виду, что этот тип теста будетимеют чрезвычайно переменные результаты.Если вашему SQL Server не нужно было использовать память, вполне вероятно, что ваш запрос будет оставаться в пуле кэша в течение 10 минут (или намного дольше).

Например, если вы пытаетесь определить производительность холодного запроса, это не лучший метод.Вам нужно использовать команды DBCC, чтобы заставить сервер игнорировать свой собственный кеш или сделать его недействительным.Я прочитал бы этот вопрос , а также два связанных вопроса в принятом ответе.В частности, я бы согласился с оценкой, что производительность холодных запросов не должна быть такой большой, поскольку, по определению, она выполняется не очень часто.

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