首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >具有用户定义类型参数的Powershell存储过程

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

Stack Overflow用户
提问于 2019-03-05 02:10:28
回答 1查看 858关注 0票数 2

我的SQL Server存储过程如下:

代码语言:javascript
复制
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中:在全局定义下,我声明了$connectionArrayList

代码语言:javascript
复制
$connection = New-Object System.Data.SqlClient.SqlConnection($connectionString)
$connection.Open()
$processedAssessments.Add("1")
$processedAssessments.Add("2")
$processedAssessments.Add("3")
UpdateAssessments($processedAssessments, 0)

在方法内部,我将ArrayList转换为DataTable,并将其作为参数提供给我的存储过程。

代码语言:javascript
复制
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“参数调用"ExecuteNonQuery”时出现

异常:“将nvarchar值'System.Collections.ArrayList‘转换为数据类型int时转换失败。

表值参数@assessmentIds的数据与该参数的表类型不一致。

SQL Server错误为: 245,状态:1

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-05 03:01:43

在阅读了this post之后,我修改了SqlParameters,并且我能够让它正常工作。

代码语言:javascript
复制
$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()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54989137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档