sql-server - 通过函数抛出位置参数错误调用 sqlcmd
问题描述
我正在尝试使用函数来运行查询,但它似乎不接受我的服务器实例并给出错误:“Run-SqlCommand:找不到接受参数'mydbservername'的位置参数。”
当我在函数之外执行相同的 invoke-sqlcmd 时,它工作正常。
功能:
function Run-SqlCommand
{
[CmdletBinding()]
Param
(
[parameter(Position=0, Mandatory=$True, ParameterSetName="Query")]
[string]$Query,
[parameter(Position=1, Mandatory=$True, ParameterSetName="DatabaseServerName")]
[string]$DatabaseServerName,
[parameter(Position=2, Mandatory=$True, ParameterSetName="Database")]
[string]$Database,
[parameter(Position=3, Mandatory=$True, ParameterSetName="Username")]
[string]$Username,
[parameter(Position=4, Mandatory=$True, ParameterSetName="Password")]
[string]$Password
)
try {
$result = Invoke-SqlCmd -query $Query -serverinstance $DatabaseServerName -Database $Database -Username $Username -Password $Password -ErrorAction Stop
}
catch {
Write-Warning $_.Exception.Message
}
}
在另一个脚本中,我定义了查询、服务器、数据库和用户/密码,并调用传递这些变量的函数:
$SuperUserQuery =@"
select uid,username,first_name,last_name,ad_username,active
from users
where (superuser = 'Y' AND active = '1')
Order by username Asc
"@
$DatabaseServerName = "mydbservername"
$Database = "dbname"
$Username = "dbuser"
$Password = "dbpass"
Run-SqlCommand $SuperUserQuery $DatabaseServerName $Database $Username $Password
当我这样做时,我得到了上面提到的错误:
“Run-SqlCommand:找不到接受参数‘mydbservername’的位置参数。”
如果我只是在脚本中直接运行 invoke-sqlcmd,我会尝试调用该函数——它工作得很好。
$result = Invoke-SqlCmd -query $SuperUserQuery -serverinstance $DatabaseServerName -Database $Database -Username $Username -Password $Password -ErrorAction Stop
为什么直接调用时它起作用,但通过我的函数调用时不起作用?
好吧,我真的不明白为什么仍然希望有人帮助我理解....但是我通过更改参数来修复它...
[parameter(Mandatory=$True)]
[string]$Query,
[parameter(Mandatory=$True)]
[string]$DatabaseServerName,
[parameter(Mandatory=$True)]
[string]$Database,
[parameter(Mandatory=$True)]
[string]$Username,
[parameter(Mandatory=$True)]
[string]$Password
当我改变它时它起作用了。我想也许我不明白“位置”或“参数集名称”。
解决方案
我认为您正在尝试做的是所谓的Splatting。通过 splatting,您可以构建易于阅读/维护的代码,尤其是当它涉及需要大量参数的 cmdlet 时。
为此,您创建一个 Hashtable 对象并将您要用于Invoke-Sqlcmd
cmdlet 的所有参数放入其中,如下所示:
$sqlQuery = @"
SELECT uid,
username,
first_name,
last_name,
ad_username,
active
FROM users
WHERE ( superuser = 'Y'
AND active = '1' )
ORDER BY username ASC
"@
$sqlParams = @{
'Query' = $sqlQuery
'ServerInstance' = 'mydbservername'
'Database' = 'dbname'
'Username' = 'dbuser'
'Password' = 'dbpass'
# you can even add common parameters in there like
'ErrorAction' = 'Stop'
}
然后你像这样使用它:
try {
$result = Invoke-Sqlcmd @sqlParams
}
catch {
Write-Warning $_.Exception.Message
}
推荐阅读
- javascript - 如何根据月份和年份获取日期名称和天数
- c# - 令牌响应成功返回:unsupported_grant_type
- angular - Angular 5 -> Angular 6 Rxjs .map() 到 .pipe(map())
- redirect - 使用 React native 在获取请求中禁用重定向
- django - Django - 如何通过外键的属性过滤查询,外键也是外键
- android - 自定义操作栏主页按钮没有响应
- css - 在父 div 的中心对齐图片元素使图像向左对齐
- javascript - 如何将 js 包含到 php/html 页面中
- raku - perl6 是否有与 MAIN sub 等效的类方法?
- javascript - 我们如何更新 wordcloud Highchart 中的数据