Sql server 具有用户定义类型参数的Powershell存储过程
我的SQL Server存储过程如下所示: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
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命令一样被调用(无括号、空格分隔的参数),与方法不同。