2012-03-15 4 views
13

У меня есть строка в powershell, которая содержит встроенную команду sqlcmd. Сама команда может быть успешно выполнена в cmd.exe. Я испытываю трудности с их исполнением в powershell. Кто-нибудь может помочь? Благодарю.Как выполнить sqlcmd из 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 
+0

связанные: http://stackoverflow.com/questions/1015038/powershell-sqlcmd –

ответ

18

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

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

Использование Invoke-Expression вместо Invoke-Command

+0

Я не понимаю, почему люди пытаются использовать Invoke-Expression при вызове исполняемых файлов Win32 ... Для этого используется оператор вызова. –

+0

@ Andy - Invoke-Expression позволяет сначала сгенерировать всю команду в виде строки, что может быть полезно в зависимости от обстоятельств. См. Http://stackoverflow.com/questions/6604089/dynamically-generate-command-line-command-then-invoke-using-powershell –

+1

Да, но этого здесь не происходит. Используйте выражение Invoke-Expression только при наличии выражения, которое необходимо оценить. –

5

Это, как я строю некоторые внешние команды в моем сценарии

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

Вы можете en использует переменную $ 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" 

Примечание:

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

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

2

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

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

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

Все, что нужно сделать, это вернуть значение в $ sql, он фактически не выполнит его (по крайней мере, не на моей машине). –

+0

Вы правы. Я обновлю этот ответ. – mjolinor

13

Вы также можете отказаться от использования внешнего «SQLCMD ,EXE»и использовать Invoke-Sqlcmd cmdlet вместо:

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

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

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

Пожалуйста, см Running SQL Server PowerShell

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

+1

Хотя ответ Анди Арисменди является хорошим и напрямую отвечает на выполнение исполняемого файла sqlcmd, я считаю, что это должен быть принятый ответ. Если вы запускаете скрипты sqlcmd через powershell, это сэкономит вам время, усилия и нажатия клавиш, чтобы просто использовать Invoke-Sqlcmd. – ascary

+4

1. Invoke-Sqlcmd не выполняет все команды, доступные в SQLCMD. 2. Invoke-Sqlcmd не входит в базовую установку Powershell – DonBecker

+0

Invoke-Sqlcmd добавляет точку с запятой в конец хранимых процедур, что вызывает проблемы с инструментами сравнения. См. Https://social.msdn.microsoft.com/Forums/sqlserver/en-US/74d8acd4-9788-48e5-93bc-fa165a573ee2/powershell-invokesqlcmd-adding-semicolon?forum=sqltools и https: //www.reddit ,com/r/PowerShell/comments/5v29o2/options_for_executing_sql_server_script/ – kevinpo

0

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

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

0

Это то, что работает для меня с помощью SQLCMD из сценария PowerShell с помощью оператора & см образец для генерации CSV файл:

& CMD/с «SQLCMD -S $ св -I $ PROCFILE -s, -v varDB = $ dbclean -o $ имя_файла»

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

$PROCFILE, как d:\TSTSQL\Sqlquery.SQL

$filename является d:\TSTSQL\Desiredoutfilename.CSV

$dbclean является параметр, передаваемый в файл SQL

Смежные вопросы