Как выполнить sqlcmd из powershell? - PullRequest
18 голосов
/ 15 марта 2012

У меня есть строка в powershell, которая содержит собственную команду sqlcmd. Сама команда может быть успешно выполнена в cmd.exe. Я испытываю трудности при выполнении их в PowerShell. Кто-нибудь может помочь? Спасибо.

Это sql.sql

select @@servername
go
select @@servicename

Это результат, когда я выполняю команду sqlcmd из cmd.exe

C:\Users\test>sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql"

--------------------------------------------------
thesimpsons\INSTANCE1

(1 rows affected)

--------------------------------------------------
INSTANCE1

(1 rows affected)

C:\Users\test>

Это скрипт powershell для вызова команды sqlcmd.

$sql = @"
sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql"
"@

Invoke-Command $sql

Когда я выполняю этот скрипт powershell, я получаю следующую ошибку.

PS C:\TEMP> $sql = @"
sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql"
"@

Invoke-Command $sql
Invoke-Command : Parameter set cannot be resolved using the specified named parame
ters.
At line:5 char:15
+ Invoke-Command <<<<  $sql
    + CategoryInfo          : InvalidArgument: (:) [Invoke-Command], ParameterBin 
   dingException
    + FullyQualifiedErrorId : AmbiguousParameterSet,Microsoft.PowerShell.Commands 
   .InvokeCommandCommand

Ответы [ 7 ]

22 голосов
/ 15 марта 2012

Для вызова исполняемого файла Win32 вы хотите использовать оператор вызова &, например:

& sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql"
17 голосов
/ 28 января 2015

Вы также можете прекратить использовать внешний файл 'SQLCMD.EXE' и использовать вместо него Invoke-Sqlcmd :

Invoke-Sqlcmd - это командлет SQL Server, который запускает сценариикоторые содержат операторы из языков (Transact-SQL и XQuery) и команды, поддерживаемые утилитой sqlcmd

Просто откройте утилиту sqlps и запустите

Invoke-Sqlcmd -InputFile "C:\temp\sql.sql"

см. Запуск SQL Server PowerShell

Вы также можете загрузить оснастки SQL Server вручную в PowerShell перед использованием «Invoke-Sqlcmd»;
для MS SQL Server 2012 это можно сделатьзапустив
Import-Module SqlPs

5 голосов
/ 15 марта 2012

Вот как я строю некоторые внешние команды в своих скриптах

$scriptblock = {fullpath\sqlcmd -S `"(local)\instance1`" <# comment option -S #>`
                                -U a `
                                -P a `
                                -i `"c:\temp\sql.sql`" }
Invoke-Command -ScriptBlock $scriptBlock

После этого вы можете использовать переменную $ args и даже запустить ее удаленно.

$scriptblock = {fullpath\sqlcmd -S `"(local)\instance1`" <# comment option -S #>`
                                -U a `
                                -P a `
                                -i `"$($args[0])`" }
Invoke-Command -ScriptBlock $scriptBlock -argumentList "c:\temp\sql.sql" -computer "remote1"

Примечание:

Это позволяет комментировать каждый параметр.

Будьте осторожны, чтобы не забыть "` "и не ставить после них места, где они находятся в конце строки.

3 голосов
/ 15 марта 2012

Используйте Invoke-Expression вместо Invoke-Command

2 голосов
/ 15 марта 2012

Первый позиционный параметр команды invoke - -scriptblock, и он ожидает аргумент блока скрипта. Чтобы использовать здесь-строку для построения команды и затем запустить ее с помощью invoke-command, вам нужно преобразовать здесь-строку в блок скрипта:

$sql = @"
sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql"
 "@

 Invoke-Command ([scriptblock]::create($sql))
0 голосов
/ 28 сентября 2017

Это то, что мне помогло использовать sqlcmd из скрипта powershell с помощью оператора &, см. Пример для создания файла csv:

& cmd / c "sqlcmd -S $ sv -i $ PROCFILE -s, -v varDB = $ dbclean -o $ filename "

$sv имеет имя сервера как SERVERNAME\INSTANCE

$PROCFILE похоже на d:\TSTSQL\Sqlquery.SQL

$filename - d:\TSTSQL\Desiredoutfilename.CSV

$dbclean - параметр, передаваемый в файл sql

0 голосов
/ 18 апреля 2015

И имя экземпляра, и имя пользователя должны быть полностью квалифицированными

<domain_name>\Instanc_name и <domai_name>\Username.Только имя вашего экземпляра правильно написано в сценарии.

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