Ответ 1
Чтобы вызвать исполняемый файл Win32, вы хотите использовать оператор вызова &
следующим образом:
& sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql"
У меня есть строка в 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
Чтобы вызвать исполняемый файл Win32, вы хотите использовать оператор вызова &
следующим образом:
& sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql"
Вы также можете перестать использовать внешний 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
Вот как я создаю команду 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"
Примечание:
Это позволяет прокомментировать каждый параметр.
Соблюдайте осторожность, чтобы не забыть "`", и после них нет места, где они находятся в конце строки.
Используйте Invoke-Expression
, а не Invoke-Command
Первым позиционным параметром команды invoke является -scriptblock, и он ожидает аргумент блока script. Чтобы воспользоваться этой строкой для создания команды, а затем запустить ее с помощью команды invoke, вам нужно преобразовать эту строку в блок script:
$sql = @"
sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql"
"@
Invoke-Command ([scriptblock]::create($sql))
И имя экземпляра и имя пользователя должны быть полностью
<domain_name>\Instanc_name
и <domai_name>\Username
. Только ваше имя экземпляра правильно написано.
Это то, что сработало для меня для использования 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