使用xp_cmdshell从T-SQL脚本执行SQLPS或PowerShell时出现问题



我最初创建了一组脚本,用于使用SQLCMD从CSV的动态查询系统中提取结果。然而,由于数据集中包含大量格式化代码的大型文本字段,CSV文件变得难以处理。然后我转而使用SQLPS或PowerShell,它们在格式化输出文件方面做得很好。不幸的是,当从SSMS手动运行T-SQL文件时,我无法保存我的提取CSV文件。我可以将相同的输出代码粘贴到SQLPS中,使用PowerShell.exe或SQLPS.exe可以很好地工作。

我检查了提取文件夹上的文件权限,尝试了SQLPS和PowerShell的不同选项,并在Process Monitor中查看了执行情况,但我不明白为什么这不起作用。

SET @Cmd = 'sqlps 
$FromDate = "' + @FromDate + '";
$ToDate = "' + @ToDate + '";
$IncidentTypeName = "' + @IncidentTypeName + '";
$DateField = "' + @DateField + '";
$QueryType = "' + @QueryType + '";
$PersonTypeID = "' + @PersonTypeID + '";
$var = "FromDate=$FromDate", "ToDate=$ToDate", "IncidentTypeName=$IncidentTypeName", "DateField=$DateField", "QueryType=$QueryType", "PersonTypeID=$PersonTypeID";
invoke-sqlcmd -ServerInstance ' +@Server+ ' -Database ' +@Database+ ' -Username '+@Login+' -Password '+@Password + ' -QueryTimeout 0 ' +
' -InputFile "'+@SqlScriptFolder+@InputFileType+'" -Variable $var | export-csv -Delimiter "," -NoTypeInformation -Path "'+@ExtractFolder+@OutputFile+'.csv"'
print @Cmd
EXEC master..xp_cmdshell @Cmd

我的要求是提取一个标准的CSV文件,不幸的是,当我使用SQLCMD时,我正试图利用我在项目早期组合的大量T-SQL代码。它还需要是一个自动化的过程,这就是为什么我试图利用PowerShell或SQLPS。我在运行Windows 10的开发机器上使用SQL Server 2019。

关于这个有什么想法吗?

好吧,在对我的疯狂过程进行了大量研究之后,我发现了解决方案,即

  1. (反斜杠(转义"(双引号(
  2. 使用SET @Cmd = REPLACE(REPLACE(@Cmd, NCHAR(13), N''), NCHAR(10), N' ');替换回车和换行

与xp cmdshell 一起使用时,invoke sqlcmd不起作用

最新更新