簡體   English   中英

Powershell Script using Invoke-SQL command,needed for SQL job, the SQL Server version of Powershell is somewhat crippled, is there a workaround?

[英]Powershell Script using Invoke-SQL command,needed for SQL job, the SQL Server version of Powershell is somewhat crippled, is there a workaround?

Full Question: Have Powershell Script using Invoke SQL command, using snappins, I need them to be included in a SQL job, the SQL Server version of Powershell is somewhat crippled, does anyone know a workaround?

根據我收集到的信息,SQL Management Studio 版本的 powershell 功能不足,不允許使用 snappin,因此它無法識別我在腳本中使用的 cmdlet。 我嘗試在作業中將其作為命令行提示符而不是 Powershell 腳本運行,這會導致代碼在一定程度上起作用,但是我檢查了作業的歷史記錄,它說 invoke-sql 仍然不是可識別的 cmdlet。 我推測,因為我在遠程服務器上運行代碼,使用的憑據與我的標准不同,我的預加載 snappin 的配置文件沒有被加載,盡管這有點令人懷疑。

另外,由於我是 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

所以我想出了我自己問題的答案。 使用本網站: http://www.mssqltips.com/tip.asp?tip=1684http://www.mssqltips.com/tip.asp?tip=1199

我發現他可以使用 SQL 服務器代理代理來做到這一點,所以我沿着黃磚路走,基本上我為我的帳戶設置了一個代理,並且能夠通過一個功能使用外部 powershell。 請注意,您需要在 object 資源管理器的“證券”選項卡下創建一個憑證,然后才能在創建代理時使用 select 一個。 基本上,我最終使用 powershell 子系統創建了一個名為 powershell 的代理,並使用我的登錄信息來創建憑據。 瞧!

您必須每次都添加管理單元。 在您的編輯器中,您可能已經從另一個腳本/選項卡/會話中加載了它們。 在 SQL 服務器中,您需要在腳本的開頭添加如下內容:

IF ( (Get-PSSnapin -Name sqlserverprovidersnapin100 -ErrorAction SilentlyContinue) -eq $null )
    {
        Add-PsSnapin sqlserverprovidersnapin100
    }
IF ( (Get-PSSnapin -Name sqlservercmdletsnapin100 -ErrorAction SilentlyContinue) -eq $null )
    {
        Add-PsSnapin sqlservercmdletsnapin100
    }

我不確定您要解決的錯誤-您可以發布嗎?

您是否從 PowerShell 提示符嘗試過這個?

添加-PSSnapin SqlServerCmdletSnapin100

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM