我在StackOverflow的另一篇文章中发现了一个脚本,看起来它会完全符合我的需要,但是,当我在SSMS中尝试从PowerShell执行.ps1文件类型时,我收到错误。
环境是SQL Server 2014。
我的FindBrokenObjectsInSQLServer.ps1文件定义为:
$server = "APPDEV2014"
cls
Import-Module "sqlps" -DisableNameChecking
$databases = Invoke-Sqlcmd -Query "select name from sys.databases where name not in ('master', 'tempdb', 'model', 'msdb')" -ServerInstance $server
foreach ($db in $databases) {
$dbName = $db.name
$procedures = Invoke-Sqlcmd -Query "select SCHEMA_NAME(schema_id) as [schema], name from $dbName.sys.procedures" -ServerInstance $server
foreach ($proc in $procedures) {
if ($schema) {
$shortName = $proc.schema + "." + $proc.name
$procName = $db.name + "." + $shortName
try {
$result = Invoke-Sqlcmd -Database $dbName -Query "sys.sp_refreshsqlmodule '$shortName'" -ServerInstance $server -ErrorAction Stop
Write-Host "SUCCESS|$procName"
}
catch {
$msg = $_.Exception.Message.Replace([Environment]::NewLine, ",")
Write-Host "FAILED|$procName|$msg" -ForegroundColor Yellow
}
}
}
}
我正在执行的命令是:
PS SQLSERVER:\SQL\APPDEV2014\DEFAULT> PowerShell -command
"H:\SQLScripts\FindBrokenObjectsInSQLServer.ps1"
最后我得到的错误是:
Import-Module : A positional parameter cannot be found that accepts argument
'?'.
At H:\SQLScripts\FindBrokenObjectsInSQLServer.ps1:3 char:1
+ Import-Module "sqlps"? -DisableNameChecking
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Import-Module], ParameterB
indingException
+ FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell
.Commands.ImportModuleCommand
任何建议/方向将不胜感激。这是我第一次尝试使用PowerShell。感谢。
答案 0 :(得分:1)
检查您是否正确保存了脚本。看起来在包含Import-Module
的行上有一个额外的问号。仔细看看它抱怨的那条线:
+ Import-Module "sqlps"? -DisableNameChecking
注意"sqlps"
参数后面的额外问号?删除它。
答案 1 :(得分:0)
您尝试导入计算机上可能不存在的模块,因为它原生于SQL Server 2016,但不是SQL Server 2014的原生模块。
您可能需要安装SQL Server 2014 Feature Pack SP1,可在此处找到: https://www.microsoft.com/en-us/download/details.aspx?id=46696
尝试执行
等操作时会出现相同的错误Import-Module ActiveDirectory
在Windows功能下未安装和启用RSAT工具时。