Подтвердить что ты не робот

Как выполнить sqlcmd из powershell?

У меня есть строка в 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 script для вызова команды sqlcmd.

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

Invoke-Command $sql

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

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
4b9b3361

Ответ 1

Чтобы вызвать исполняемый файл Win32, вы хотите использовать оператор вызова & следующим образом:

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

Ответ 2

Вы также можете перестать использовать внешний 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

Ответ 3

Вот как я создаю команду externals в своих скриптах

$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"

Примечание:

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

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

Ответ 4

Используйте Invoke-Expression, а не Invoke-Command

Ответ 5

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

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

 Invoke-Command ([scriptblock]::create($sql))

Ответ 6

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

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

Ответ 7

Это то, что сработало для меня для использования sqlcmd из powershell script с помощью оператора and, см. образец для создания файла 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