完整问题:Powershell脚本使用调用SQL命令,使用snappins,我需要将它们包含在SQL作业中,SQL Server版本的Powershell有些瘫痪,有谁知道解决方法吗?使用Invoke-SQL命令的PowerShell脚本,SQL作业所需的Powershell的SQL Server版本有点残缺,有没有解决方法?
从我收集的信息来看,SQL Management Studio的版本powershell功能不足,不允许使用snappins,因此它无法识别我在脚本中使用的cmdlet。我已经尝试在作业中将其作为命令行提示符运行,而不是Powershell脚本,这会使代码起作用,但是我检查了作业中的历史记录,并说invoke-sql仍然不是公认的cmdlet。我推测,因为我正在远程服务器上运行代码,使用不同于我的标准的凭据,我的配置文件中预装的snappins未加载,尽管这有点可疑。
此外,由于我是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
看到的问题是,SQL服务器不允许使用管理单元,因为这样get-pssnapin和add-pssnapin不会被错误所证实: – Jerome
@user - 你没有发布你的错误。你能做到吗? – JNK
作业步骤在PowerShell脚本的第1行收到错误。相应的行是'IF((Get-PSSnapin -Name sqlserverprovidersnapin100 -ErrorAction SilentlyContinue)-eq $ null)'。纠正脚本并重新安排作业。 PowerShell返回的错误信息是:'术语'Get-PSSnapin'不被识别为cmdlet,函数,脚本文件或可操作程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试。 ”。处理退出代码-1。 – Jerome