使用Azure Runbook中的参数调用存储过程

时间:2016-06-13 09:40:59

标签: sql-server powershell azure stored-procedures parameters

我试图从Azure Runbook中调用维护SP:

   inlinescript {
        .........
        $Cmd = New-object System.Data.SqlClient.SqlCommand
        $Cmd.Connection = $Conn
        $Cmd.CommandText = "EXEC [dbo].[BackupLogTable] @tableName, @olderThan"

        $Cmd.Parameters.AddWithValue("@tableName", $TableName)
        $Cmd.Parameters.AddWithValue("@olderThan", $OlderThan)

        $Cmd.ExecuteNonQuery()
        .....
    }

SP声明如下:

alter procedure [dbo].[BackupLogTable] (
    @tableName nvarchar(512),
    @olderThan int
)
with execute as owner as

我可以在我的Runbook使用的同一用户下从SSMS成功运行它。但是在Azure门户中测试时,我收到以下错误:

  

异常调用" ExecuteNonQuery"用" 0"参数:" The   参数化查询'(@ tableName nvarchar(4000),@ olderThan   nvarchar(4000))EXEC [dbo]。'期望参数' @ tableName',哪个   没有供应。"

我尝试了传递网上发现的参数的所有其他变体,如下所示:

$Cmd.CommandText = "[BackupLogTable]"
$Cmd.CommandType = [System.Data.CommandType]::StoredProcedure

$Cmd.Parameters.Add("@tableName", [System.Data.SqlDbType]::NVarChar, 512) | Out-Null
$Cmd.Parameters["@tableName"].Value = $TableName

$Cmd.Parameters.Add("@olderThan", [System.Data.SqlDbType]::Int) | Out-Null
$Cmd.Parameters["@olderThan"].Value = $OlderThan

和其他许多人但总是失败:

  

异常调用" ExecuteNonQuery"用" 0"参数:"程序   或功能' BackupLogTable'期望参数' @ tableName',哪个   没有供应。"

我做错了什么?

1 个答案:

答案 0 :(得分:1)

如何将参数传递给内联脚本?

有一些限制;例如Get-AutomationVariable / AutomationCredential在InlineScript中不可用。

" InlineScript活动在单独的非工作流会话中运行一个命令块,并将其输出返回到工作流。当工作流中的命令发送到Windows Workflow Foundation进行处理时,Windows PowerShell会处理InlineScript块中的命令。该活动使用标准工作流通用参数,包括PSComputerName和PSCredential,允许您指定代码块在另一台计算机上运行或使用备用凭据。"

因此,如何传递和获取变量存在一些限制。

但是,您可以使用$ Using将值传递给inlinescript。

例如:InlineScript {Write-output $ using:TableName}

希望能够做到这一点。

另请参阅有关inlinescript的建议:https://technet.microsoft.com/en-us/library/dn469257(v=sc.16).aspx#bkmk_InlineScript