如何使用 PowerShell 和 SQLCMD 获取存储过程返回值?

Posted

技术标签:

【中文标题】如何使用 PowerShell 和 SQLCMD 获取存储过程返回值?【英文标题】:How to get the stored procedure return value using PowerShell and SQLCMD? 【发布时间】:2018-10-01 22:39:32 【问题描述】:

我有一个返回结果集和整数返回值的 SQL Server 存储过程。我想使用SQLCMD 执行它,然后 PowerShell 将结果集重定向到一个文本文件,并在 PowerShell 变量中捕获返回值。

我的问题,我无法将返回值捕获到 $RC 变量中。

存储过程:

CREATE PROCEDURE [DBO].[TEST]
AS
BEGIN
  SET NOCOUNT ON;

  DECLARE @MYTABLE TABLE(PARTNO INT, TRANDATE DATE, QUANTITY INT)

  INSERT INTO @MYTABLE 
  VALUES (1, '2018-01-01', 1000), (1, '2018-02-01', 2000),
         (2, '2018-03-01', 3000)

  SELECT * 
  FROM @MYTABLE 

  RETURN @@ROWCOUNT
END

Powershell 脚本类似于:

Param();
Clear-Host; 

$Command = "Exec [test].[dbo].[Test]";
$RC = sqlcmd -Q $Command -s ',' -u -h-1 -W | Out-File "C:\Test.txt";
Write-Host $RC;

提前致谢。

【问题讨论】:

如果你在 powershell 中使用 ADO.Net 而不是 SQLCMD 你可以 【参考方案1】:

如果语句返回 ResultSet,SQLCMD -Q "EXIT(stmt) 将省略返回代码。 在代码示例sqlcmd -Q "EXIT(SELECT COUNT(*) FROM '%1') 下描述了there 此外,SQLCMD 的一些退出代码是保留的。

有一个基于临时文件的解决方法。 你会发现这个拐杖很有帮助。

# Control
$TMP_FILE = [System.IO.Path]::GetTempFileName() # A return code will be placed in that file.
$PROC_NAME = "testdb.dbo.test"
$SQL_BATCH = "set nocount on;
create table #ret_code_store (ret_code int); -- You have to store @ret_code in that temp table because GO will erase ret_code's variable.
declare @ret_code as int; 
exec @ret_code = $PROC_NAME;
insert into #ret_code_store values(@ret_code);
go -- You need it because it separates STDOUT from ret_code's file.
:Out $TMP_FILE
select ret_code from #ret_code_store;
:EXIT()"

# Do work
$RECORD_SET = (sqlcmd -Q $SQL_BATCH -s ',' -u -h-1 -W) # Returns a ResultSet from SP. You can proceed it as you want.
$RET_CODE = [System.Convert]::toint32((Get-Content $TMP_FILE | Select-Object -Last 1))
Remove-Item -Path $TMP_FILE # There is a limit up to 65535. Lets respect OS limitations.

# Results
Write-Output "Return: $RET_CODE`n"
Write-Output "ResultSet:`n"
Write-Output $RECORD_SET

【讨论】:

智能解决方案,谢谢。

以上是关于如何使用 PowerShell 和 SQLCMD 获取存储过程返回值?的主要内容,如果未能解决你的问题,请参考以下文章

Powershell运行Invoke-Sqlcmd命令的先决条件

在 PowerShell 中针对 WID 远程运行 sqlcmd

PowerShell 中对 Invoke-Sqlcmd 的 Unicode 支持

使用在 Azure 中使用 MFA 的帐户调用 Sqlcmd

如何仅将 SQLPlus 错误保存到文件(从 powershell 调用)

Invoke-sqlcmd 等待恢复完成,然后再进行下一个任务