首页 > 解决方案 > 非字符参数的 Powershell SQL 问题

问题描述

我有一个在 SQL Server 2016 数据库中执行存储过程的 PowerShell 函数。它适用于任何 char 变体类型的任何参数,但遇到 int、numeric 或 datetime 等类型的参数时会失败。

我收到类似的错误

将数据类型 varchar 转换为 int、numeric、datetime 时出错

我可以通过将值直接插入 exec 字符串来强制它工作,但显然我想避免这种情况。

另一个问题是,虽然函数处理参数的大小,但我不知道如何处理数值的精度。我发现的其他解决方案和示例并未解决此特定问题。

这是功能;它以字符串形式接收查询语句,以及一个数组数组,这些数组可以保存表单中参数的数据@((name,value,type,size),etc)

function ExecQuery( $sql,$parameters=@()) {
    <#debug#>write-host "query: "$sql
    #create command obj
    $cmd=new-object system.Data.SqlClient.SqlCommand($sql,$Connection)
    $cmd.CommandTimeout=$timeout
    #create and add parameters

    foreach($item in $parameters) {
        #if several params, $item is array
        if($item -is [System.Array]) {
            <#debug#>write-host "key = "$item[0] " ,`tvalue = "$item[1]"`t"$item[1].gettype()
            if($item[3] -eq $null) { #if no size limit
                $cmd.Parameters.Add($item[0], $item[2]).value = $item[1]
            } else { #if size limit
                $cmd.Parameters.Add($item[0], $item[2], $item[3]).Value = $item[1]
            }
        }
        else { #if single param, $item is string
            <#debug#>write-host "key = "$parameters[0] " , value = "$parameters[1]" "$parameters[1].gettype()
            if($parameters[3] -eq $null) { #if no size limit
                $cmd.Parameters.Add($parameters[0], $parameters[2]).Value = $parameters[1]
            } else {
                $cmd.Parameters.Add($parameters[0], $parameters[2], $parameters[3]).Value = $parameters[1]
            }
            break
        }
    }

    $ds=New-Object system.Data.DataSet
    $da=New-Object system.Data.SqlClient.SqlDataAdapter($cmd)
    $da.fill($ds) | Out-Null
    <#debug#>foreach($Row in $ds.Tables[0].Rows){if($($Row[0])){write-host "return: $($Row[0])"}}write-host "" #line space after function output
    return $ds
}

调用语句如下所示:

$result = ExecQuery -sql (  
    "exec procedure_name " +  
    "@param1='%@param1%'," +  
    "@param2='%@param2%'," +  
    "@param3='%@param3%',"  
    ) -parameters (  
    ('param1','foo',[System.Data.SqlDbType]::varchar,3),  
    ('param2',3,[System.Data.SqlDbType]::int,$null), #fail  
    ('param3','2020-02-10 11:30:00',[System.Data.SqlDbType]::datetime,$null) #fail  
    )  

这是语法问题吗?有没有更好的方法可以做到这一点?有什么明显的优化会有所帮助吗?有什么好的深入教程可以解决这些问题吗?

标签: sql-serverpowershellstored-proceduressqlparameter

解决方案


推荐阅读