1

完整问题: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 

回答

1

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

我想通了,他能够做到这一点使用SQL Server代理的代理,所以我跟着黄砖路,基本上我成立了一个代理到我的帐户,并能够通过功能使用外部PowerShell。注意,您需要在对象浏览器的证券选项卡下创建凭证,然后才能在创建代理时选择一个凭证。基本上我最终创建了一个名为powershell的代理,使用powershell子系统,并使用我的登录信息创建凭证。瞧!

0

你必须每次添加snapins。在您的编辑器中,您可能已经从另一个脚本/选项卡/会话中加载了它们。在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 
    } 
+0

看到的问题是,SQL服务器不允许使用管理单元,因为这样get-pssnapin和add-pssnapin不会被错误所证实: – Jerome

+0

@user - 你没有发布你的错误。你能做到吗? – JNK

+0

作业步骤在PowerShell脚本的第1行收到错误。相应的行是'IF((Get-PSSnapin -Name sqlserverprovidersnapin100 -ErrorAction SilentlyContinue)-eq $ null)'。纠正脚本并重新安排作业。 PowerShell返回的错误信息是:'术语'Get-PSSnapin'不被识别为cmdlet,函数,脚本文件或可操作程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试。 ”。处理退出代码-1。 – Jerome

0

我不知道你试图要解决的错误 - 你可以张贴?

你是否在PowerShell提示符下试过这个?

附加PSSnapin SqlServerCmdletSnapin100

+0

是的,我有,它在一个PowerShell命令提示符下工作正常,问题是它不能在PowerShell的SQL管理工作室版本,它不允许管理单元。 – Jerome

+0

@ user823694你得到的错误是什么? – Matt

相关问题