Invoke-Sqlcmd 'не распознается как имя командлета

Недавно мы начали использовать Sql server 2012 SP3 и строить SQL server 2012 с помощью сценария powershell. В нашей автоматизации есть требование запускать несколько сценариев базы данных на базе данных, и я считал Invoke-Sqlcmd очень надежным, пока не обнаружил эту проблему. Когда я запускаю Invoke-sqlcmd с правильным набором параметров в режиме отладки PowerShell в системе, в которой недавно был установлен SQL-сервер. У меня нет проблем. PowershellCommand: Invoke-Sqlcmd -InputFile $ sStrJBSPExecRolePath -ServerInstance $ sStrSQLName -ErrorAction Stop Но когда я выполняю тот же запрос через сценарий автоматизации PowerShell после восстановления того же сервера, я получаю ошибку ниже

Термин Invoke-Sqlcmd не распознается как имя командлета, функции, файла сценария или работающей программы. Проверьте написание имени или, если был включен путь, убедитесь, что он правильный, и повторите попытку.

Я провел исследование в Интернете, многие предлагали импортировать sqlps и т.д., поэтому для тестирования я добавил ниже в свой скрипт

get-pssnapin -Registered Import-Module «sqlps» -DisableNameChecking

Даже после добавления в скрипт выше. Я все еще получаю ту же ошибку. Но когда я запускаю тот же сценарий вручную, он работает отлично. Я не мог понять, что может быть не так. Сценарий автоматизации powershell - этот сценарий устанавливает .Net Framework 3.5, SQL Server 2012, SQL server 2012 SP3, а затем загружает сборку smo, которую я использую для изменения настроек sql, таких как ограничение максимальной памяти SQL.


person Gau    schedule 15.06.2016    source источник
comment
рассмотрите возможность публикации вашего сценария. возможно, вы запускаете его как Local-System, когда он выходит из строя?   -  person No Refunds No Returns    schedule 15.06.2016
comment
Да, служба SQL-сервера работает под локальной системой. Но когда я запускаю PowerShell вручную в режиме отладки, она запускается без каких-либо проблем. конечно, я могу поместить часть скрипта $ sStrSQLName = $ env: COMPUTERNAME $ sStrSPWIAFilePath = D: _ISD \ Installs \ Scripts \ SQL_Install \ SQL Scripts \ sp_WhoIsActive.sql Invoke-Sqlcmd -InputFileName -SStrSPWIAFilerstction -SStrSPWIAFilerSQL   -  person Gau    schedule 15.06.2016
comment
вы запускаете сценарий как часть автоматизированного процесса и именно тогда вы видите сбой? Ваш профиль пользователя может не совпадать с профилем пользователя, который используется, когда вы видите сбой. Можете ли вы использовать RUNAS или PSEXEC для запуска сеанса в контексте пользователя, у которого произошел сбой вашего скрипта. В качестве альтернативы вы можете запустить свой процесс со своими учетными данными, если он вам подходит.   -  person No Refunds No Returns    schedule 17.06.2016


Ответы (2)


Откройте PowerShell от имени администратора и установите модуль sqlserver, используя Install-Module sqlserver

После установки модуля команды модуля, включая Invoke-sqlcmd, должны быть легко доступны.

Вы можете проверить то же самое с помощью Get-Command -ModuleName sqlserver.

Если этот модуль недоступен, вы можете Import-Module sqlserver после его установки.

person Akash Masand    schedule 12.09.2018
comment
Обратите внимание: мне пришлось сделать это в терминале PowerShell в VSCode, чтобы решить там ту же проблему. - person Neil Barnwell; 21.05.2020
comment
Мне пришлось включить в свой скрипт `Import-Module sqlserver ' - person Michael Freidgeim; 11.05.2021

Это не полное решение, а просто работа, которая у меня работает. вы можете попробовать это.

когда вы выполняете запрос из автоматизации, пользователь, который выполняет, но не имеет доступа к sqlcmd, выполняет вашу команду для каталога, в котором находится ваш sqlcmd.exe. просто поставьте CD "C:\Program Files (x86)\Microsoft SQL Server\Client SDK\ODBC\130\Tools\Binn".

чтобы получить местоположение для sqlcmd, найдите местоположение для SQLCMD.exe в поле поиска. если он не найден, вам нужно установить, что он отсутствует, но в вашем случае я думаю, что он присутствует, просто нужно указать правильное местоположение

Также вам нужно будет установить переменную пути для пользователя, выполняющего сценарий автоматизации, иначе он распознает только sqlcmd, но не выполнит его.

$env:Path   += ";C:\Program Files (x86)\Microsoft SQL Server\130\DTS\Binn\"

вы можете получить этот путь от своего локального пользователя, для которого он работает, $Env:Path

надеюсь, что это сработает

person Amey    schedule 05.12.2016