Sql server 具有用户定义类型参数的Powershell存储过程

Sql server 具有用户定义类型参数的Powershell存储过程,sql-server,powershell,Sql Server,Powershell,我的SQL Server存储过程如下所示: CREATE PROCEDURE ProcessAssessments @assessmentIds AssessmentList READONLY, @failed BIT AS UPDATE dbo.table SET IsProcessed = 1, dbo.ProcessFailed = @failed, dbo.ProcessDate = GETDATE() WHERE

我的SQL Server存储过程如下所示:

CREATE PROCEDURE ProcessAssessments 
    @assessmentIds AssessmentList READONLY,
    @failed BIT
AS
    UPDATE dbo.table
    SET IsProcessed = 1,
        dbo.ProcessFailed = @failed,
        dbo.ProcessDate = GETDATE()
    WHERE
        dbo.ID IN (SELECT AssessmentId FROM @assessmentIds)
GO
在Powershell中:在全局定义下,我声明
$connection
ArrayList

$connection = New-Object System.Data.SqlClient.SqlConnection($connectionString)
$connection.Open()
$processedAssessments.Add("1")
$processedAssessments.Add("2")
$processedAssessments.Add("3")
UpdateAssessments($processedAssessments, 0)
在方法内部,我将
ArrayList
转换为
DataTable
,并将其作为参数提供给存储过程

function UpdateAssessments([System.Collections.ArrayList] $assessments,[bool] $failed) {
    $table = New-Object System.Data.DataTable
    $table.Columns.Add("AssessmentId", "System.String") | Out-Null

    foreach($assessmentId in $assessments) {
        $row = $table.NewRow()
        $row.AssessmentId = $assessmentId
        $table.Rows.Add($row)
    }

    $command = New-Object System.Data.SqlClient.SqlCommand
    $command.CommandType = [System.Data.CommandType]::StoredProcedure
    $command.CommandText = "ProcessKySpecialAssessments"
    $command.Connection = $connection

    $command.Parameters.Add("@assessmentIds", $table)
    $command.Parameters.Add("@failed", $failed)

    $Command.ExecuteNonQuery()
}
但是,当我执行此操作时,会出现以下异常:

使用“0”参数调用“ExecuteOnQuery”时出现异常:“将nvarchar值'System.Collections.ArrayList'转换为数据类型int时,转换失败。” 表值参数“@assessmentIds”的数据与参数的表类型不符。
SQL Server错误为:245,状态:1

我真的不确定我做错了什么。

阅读后,我修改了
SqlParameters
,并且我能够让它工作

$command.Connection = $connection
    $command.CommandType = [System.Data.CommandType]::StoredProcedure
    $command.CommandText = "ProcessKySpecialAssessments"

    $assessmentIdsParam = New-Object('system.data.sqlclient.sqlparameter')
    $failedParam = New-Object('system.data.sqlclient.sqlparameter')

    $assessmentIdsParam.ParameterName = "assessmentIds"
    $assessmentIdsParam.SqlDBtype = [System.Data.SqlDbType]::Structured
    $assessmentIdsParam.Direction = [System.Data.ParameterDirection]::Input
    $assessmentIdsParam.value = $table

    $failedParam.ParameterName = "failed"
    $failedParam.SqlDBtype = [System.Data.SqlDbType]::Bit
    $failedParam.Direction = [System.Data.ParameterDirection]::Input
    $failedParam.value = $failed

    $command.parameters.add($assessmentIdsParam);
    $command.parameters.add($failedParam);

    $command.ExecuteNonQuery()

您有:$table.Columns.Add(“AssessmentId”,“System.String”),但您的SQL表类型似乎是int?可能这需要与SQL数据类型匹配。我认为您还需要为参数指定一个显式类型(结构化),但我承认我从C#就知道,我从未在Powershell中尝试过。顺便说一句:请避免伪方法语法:使用
New Object SomeType[-arg1,…)
,而不是
New Object SomeType[-ArgumentList]arg1,…
-Powershell cmdlet和函数像shell命令一样被调用(无括号、空格分隔的参数),与方法不同。