【问题标题】:Powershell Stored Procedure with User-defined type parameter具有用户定义类型参数的 Powershell 存储过程
【发布时间】:2019-03-05 04:13:37
【问题描述】:

我的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 中:在全局定义下,我声明了 $connectionArrayList

$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”参数调用“ExecuteNonQuery”时出现异常:“将 nvarchar 值 'System.Collections.ArrayList' 转换为数据类型 int 时转换失败。
表值参数“@assessmentIds”的数据不符合参数的表类型。
SQL Server 错误为:245,状态:1

我真的不知道我做错了什么。

【问题讨论】:

  • 你有这个: $table.Columns.Add("AssessmentId", "System.String") 但是你的 SQL 表类型似乎是 int?也许这需要匹配 SQL 数据类型
  • 另外我认为你需要给参数一个显式类型(结构化),但我承认我知道从 C# 中,我从未在 Powershell 中尝试过。
  • 顺便说一句:请避免使用伪方法语法:不要使用 New-Object SomeType(arg1, ...),而是使用 New-Object SomeType [-ArgumentList] arg1, ... - PowerShell cmdlet 和函数的调用方式类似于 shell 命令(无括号、空格- 分隔的参数),不像 methods.

标签: sql-server powershell


【解决方案1】:

阅读this post 后,我更改了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()

【讨论】:

    猜你喜欢
    • 2013-09-02
    • 2021-11-04
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    相关资源
    最近更新 更多