Сценарий Powershell с использованием команды Invoke-SQL, необходимой для задания SQL, версия Powershell для SQL Server несколько повреждена, есть ли обходной путь?

Полный вопрос: у вас есть сценарий Powershell, использующий команду Invoke SQL, используя snappins, мне нужно, чтобы они были включены в задание SQL, версия Powershell для SQL Server несколько повреждена, кто-нибудь знает обходной путь?

Из того, что я собрал, версия powershell для SQL Management Studio недостаточно мощная, не позволяет использовать оснастки, поэтому она не распознает командлеты, которые я использовал в сценарии. Я попытался запустить его в задании как приглашение командной строки, а не сценарий Powershell, из-за чего код несколько работает, однако я проверяю историю задания, и он говорит, что invoke-sql по-прежнему не является распознанным командлетом. Я предполагаю, что, поскольку я запускаю код на удаленном сервере с учетными данными, отличными от моих стандартных, мой профиль с предварительно загруженными снимками не загружается, хотя это несколько сомнительно.

Кроме того, поскольку я новичок в powershell, буду очень признателен за любые советы по улучшению практики кодирования / оптимизации моего кода!

Код выглядит следующим образом:

# define parameters
param
(
$file = "\\server\folder\file.ps1"
)

"invoke-sqlcmd -query """ | out-file "\\server\folder\file.ps1"

# retrieve set of table objects
$path = invoke-sqlcmd -query "select TableName from table WITH (NoLock)" -database db -server server

[reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
$so = New-Object Microsoft.SqlServer.Management.Smo.ScriptingOptions

 $so.DriPrimaryKey = $false
 $so.Nocollation = $true
 $so.IncludeIfNotExists = $true
 $so.NoIdentities = $true
 $so.AnsiPadding = $false

# script each table
foreach ($table in $path)
{
#$holder = $table
$table =  get-item sqlserver:\sql\server\default\databases\database\tables\dbo.$($table.TableName)
$table.script($so) | out-file -append $file 
}


(get-content "\\server\folder\file.ps1") -notmatch "ANSI_NULLS"  | out-file "\\server\folder\file.ps1" 
(get-content "\\server\folder\file.ps1") -notmatch " AS "| out-file "\\server\folder\file.ps1" 
(get-content "\\server\folder\file.ps1") -notmatch "Quoted_" | out-file "\\server\folder\file.ps1"
(get-content "\\server\folder\file.ps1") -replace "\) ON \[PRIMARY\].*", ")" | out-file "\\server\folder\file.ps1"
(get-content "\\server\folder\file.ps1") -replace "\[text\]", "[nvarchar](max)" | out-file "\\server\folder\file.ps1"
(get-content "\\server\folder\file.ps1") -replace " SPARSE ", "" | out-file "\\server\folder\file.ps1"
(get-content "\\server\folder\file.ps1") -replace "COLUMN_SET FOR ALL_SPARSE_COLUMNS", "" | out-file "\\server\folder\file.ps1"


""" -database database -server server" | out-file "\\server\folder\file.ps1" -append

person Jerome    schedule 07.07.2011    source источник


Ответы (3)



Вы должны добавлять оснастки каждый раз. В вашем редакторе вы, вероятно, уже загрузили их из другого скрипта/вкладки/сеанса. В SQL Server вам нужно будет добавить что-то вроде этого в начало скрипта:

IF ( (Get-PSSnapin -Name sqlserverprovidersnapin100 -ErrorAction SilentlyContinue) -eq $null )
    {
        Add-PsSnapin sqlserverprovidersnapin100
    }
IF ( (Get-PSSnapin -Name sqlservercmdletsnapin100 -ErrorAction SilentlyContinue) -eq $null )
    {
        Add-PsSnapin sqlservercmdletsnapin100
    }
person JNK    schedule 07.07.2011
comment
Проблема в том, что сервер sql не позволяет использовать оснастки, поскольку такие get-pssnapin и add-pssnapin не распознаются, о чем свидетельствует ошибка: - person Jerome; 07.07.2011
comment
Шаг задания получил ошибку в строке 1 сценария PowerShell. Соответствующая строка — «IF ((Get-PSSnapin -Name sqlserverprovidersnapin100 -ErrorAction SilentlyContinue) -eq $null)». Исправьте сценарий и перепланируйте работу. PowerShell возвращает следующую информацию об ошибке: «Термин «Get-PSSnapin» не распознается как имя командлета, функции, файла сценария или исполняемой программы. Проверьте правильность написания имени или, если был указан путь, убедитесь, что путь указан правильно, и повторите попытку. '. Код завершения процесса -1. - person Jerome; 07.07.2011
comment
@user - это SQL Server 2008 r2 или не r2? - person JNK; 07.07.2011
comment
это SQL Server 2008 r2 точно - person Jerome; 07.07.2011

Я не уверен, что вы пытаетесь исправить ошибку, можете ли вы опубликовать это?

Вы пробовали это из командной строки PowerShell?

Add-PSSnapin SqlServerCmdletSnapin100

person Matt    schedule 07.07.2011
comment
Да, у меня есть, он отлично работает в командной строке powershell, проблема в том, что он не работает в версии powershell SQL Management Studios, которая не разрешает оснастки. - person Jerome; 07.07.2011