【问题标题】:Powershell function executing a stored procedure returns a -1 and does not load data in table执行存储过程的 Powershell 函数返回 -1 并且不加载表中的数据
【发布时间】:2021-08-28 16:55:35
【问题描述】:

以下是 PowerShell 脚本中用于执行存储过程的函数,该存储过程填充数据库中的表。执行时,输出显示-1。并且该表没有加载任何数据。是否有任何其他调试语句可以添加以找出存储过程似乎不执行的原因? 在 SSMS 中执行存储过程时,它会按预期将数据加载到表中,但使用下面的脚本执行时,它不会在表中加载任何内容。

function ExecuteStoredProcedure(
        [string] $storedProcedureName,
        [string] $connectionString
)
{ 
    try
    {
        $conn = New-Object System.Data.SqlClient.SqlConnection
        $conn.ConnectionString = $connectionString
        $close=($conn.State -eq [System.Data.ConnectionState]'Closed')

        if ($close) {
            $conn.Open()
        }
    }
    catch
    {
        Write-Host "$($_.InvocationInfo.ScriptName)($($_.InvocationInfo.ScriptLineNumber)): $($_.InvocationInfo.Line) Exception: $($_.Exception)"
    }

    try
    {
        $cmd = new-object system.Data.SqlClient.SqlCommand($sql,$conn)
        $cmd.CommandType = [System.Data.CommandType]::StoredProcedure
        $cmd.CommandText = $storedProcedureName
        $cmd.CommandTimeout = 0
        $cmd.ExecuteNonQuery()

        Write-Output $cmd

        if ($close) {
            $conn.Close()
        }
    }
    catch
    {
        Write-Host "$($_.InvocationInfo.ScriptName)($($_.InvocationInfo.ScriptLineNumber)): $($_.InvocationInfo.Line) Exception: $($_.Exception)"
    }
}

$storedProcedureName = "[dbo].[spPopulateTable]"
#Usage
ExecuteStoredProcedure -connectionString $connectionString -storedProcedureName $storedProcedureName

这是输出:

PS C:\Users\cenko> function ExecuteStoredProcedure(
        [string] $storedProcedureName,
        [string] $connectionString
)
{ 
    try
    {
        $conn = New-Object System.Data.SqlClient.SqlConnection
        $conn.ConnectionString = $connectionString
        $close=($conn.State -eq [System.Data.ConnectionState]'Closed')

        if ($close) {
            $conn.Open()
        }
    }
    catch
    {
        Write-Host "$($_.InvocationInfo.ScriptName)($($_.InvocationInfo.ScriptLineNumber)): $($_.InvocationInfo.Line) Exception: $($_.Exception)"
    }

    try
    {
        $cmd = new-object system.Data.SqlClient.SqlCommand($sql,$conn)
        $cmd.CommandType = [System.Data.CommandType]::StoredProcedure
        $cmd.CommandText = $storedProcedureName
        $cmd.CommandTimeout = 0
        $cmd.ExecuteNonQuery()

        Write-Output $cmd

        if ($close) {
            $conn.Close()
        }
    }
    catch
    {
        Write-Host "$($_.InvocationInfo.ScriptName)($($_.InvocationInfo.ScriptLineNumber)): $($_.InvocationInfo.Line) Exception: $($_.Exception)"
    }
}

$storedProcedureName = "[dbo].[spPopulateTable]"
#Usage
ExecuteStoredProcedure -connectionString $connectionString -storedProcedureName $storedProcedureName
-1


Connection              : System.Data.SqlClient.SqlConnection
NotificationAutoEnlist  : True
Notification            : 
Transaction             : 
CommandText             : [dbo].[spPopulateTable]
ColumnEncryptionSetting : UseConnectionSetting
CommandTimeout          : 0
CommandType             : StoredProcedure
DesignTimeVisible       : True
Parameters              : {}
UpdatedRowSource        : Both
Site                    : 
Container               : 

【问题讨论】:

  • -1.ExecuteNonQuery()调用的输出,是函数隐式输出的;要抑制此输出,请使用 $null = $cmd.ExecuteNonQuery()
  • 感谢@mklement0 的建议。但是是否有任何其他调试语句可以帮助我解决存储过程不工作的原因?当我在 SSMS 中执行它时,它可以正常工作并按预期加载数据,但是当它从上述脚本执行时,它不会在表中加载任何数据。
  • 不幸的是,我个人对这些类型知之甚少;我注意到的唯一另一件事是您将$sql 传递给system.Data.SqlClient.SqlCommand 构造函数,其值未在函数中定义;话又说回来,你似乎在稍后通过分配给.CommandText 来覆盖。最后的想法:'[dbo].[spPopulateTable]' 的名称格式 - 带有 [] 字符 - 在 .CommandText 参数中真的支持吗?
  • @mklemet0 括号 ([ ]) 不是 .CommandText 参数的问题。我发现这是一个表的插入权限没有授予服务帐户,这阻止了它加载数据。感谢您的帮助。

标签: sql-server powershell stored-procedures


【解决方案1】:

这是阻止它加载数据的表的插入权限问题。一旦服务帐户被授予写入权限,存储过程就会按预期加载数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 2022-01-01
    • 1970-01-01
    • 2015-08-09
    相关资源
    最近更新 更多