【问题标题】:How to populate csv file from SQL Server stored procedure?如何从 SQL Server 存储过程填充 csv 文件?
【发布时间】:2019-06-11 01:18:52
【问题描述】:

如何从 SQL Server 存储过程填充.csv 文件?

我们在服务器上没有 Office。 .CSV 文件必须从存储过程结果集中填充。

如何在不使用 SSIS 包的情况下导出到.CSV

最终结果,我必须通过将此 CSV 文件作为报告附加来生成电子邮件警报。

我将不得不使用批量复制程序实用程序 (BCP),我正在寻找 BCP 的示例以生成 csv 文件

【问题讨论】:

  • 假设您想要自动化的东西。如果您不反对 PowerShell,那将很容易做到。
  • bcpsqlcmd?
  • 不理解这个问题,您想创建一个 csv 文件并使用 storeprecedure 将其保存到磁盘,或者您只想将表数据转换为 csv 字符串,然后使用 C# 或其他任何方法来创建文件
  • 不涉及c#。
  • 好的,也许这可以帮助stackoverflow.com/questions/14275493/…

标签: sql sql-server csv tsql export-to-csv


【解决方案1】:

有两种方法可以实现:

(1) 使用 OPENROWSET

尝试实现类似的逻辑:

INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0','Text;Database=D:\;HDR=YES;FMT=Delimited','SELECT * FROM [FileName.csv]')
EXEC Sp_TEST

(2) 使用 bcp

来自参考部分的第三个链接:

queryout 方法允许您从存储过程的结果中进行 BCP,这开辟了很多可能性并提供了对文件格式的大量控制。除了简单的表格提取之外,我倾向于使用这种方法而不是视图。我还将格式化存储过程中的每一行。这意味着格式可以独立于文件创建进行测试

declare @sql varchar(8000)
select @sql = 'bcp "exec sp_Test"
   queryout c:\bcp\sysobjects.csv -c -t, -T -S'
+ @@servername
exec master..xp_cmdshell @sql

参考文献

  1. How To Export Data To the .csv file using Sql server Stored Procedure.
  2. How to produce an csv output file from stored procedure in SQL Server
  3. Creating CSV Files Using BCP and Stored Procedures
  4. Exporting a csv file via stored procedure
  5. Writing select result to a csv file

【讨论】:

    【解决方案2】:

    看看下面的代码。创建一个存储过程,然后将其用作 BCP 命令中的源。然后生成一个文本文件。分隔符在链接中的代码示例中进行了讨论。

    取自Creating CSV Files Using BCP and Stored Procedures的代码示例

    use tempdb
    go
    create proc s_bcpMasterSysobjects
    as
       select   '"' + name + '"'
                + ',' + '"' + convert(varchar(8), crdate, 112) + '"'
                + ',' + '"' + convert(varchar(8), crdate, 108) + '"'
       from master..sysobjects
       order by crdate desc
    go
    declare @sql varchar(8000)
    select @sql = 'bcp "exec tempdb..s_bcpMasterSysobjects"
           queryout c:\bcp\sysobjects.txt -c -t, -T -S'
    + @@servername
    exec master..xp_cmdshell @sql
    

    【讨论】:

      【解决方案3】:

      我会使用BCP

      查看示例

      declare @sql varchar(2000)
      select @sql = 'bcp "SQL QUERY HERE" queryout '+@fileLocation+@fileName+'.csv -c -t, -T -S' + @@servername
          exec master..xp_cmdshell @sql, NO_OUTPUT    
      

      如果您需要查看任何错误或它在做什么,只需删除 ", NO_OUTPUT"

      【讨论】:

      • 谢谢。我正在使用此语法生成直接输出 .. exec master..xp_cmdshell N'sqlcmd -E -Q"set nocount on; select top 10 * from testtable;" -s","-W -o"c:\MyFolder\output.csv"' 现在,当我尝试传递带有参数的存储过程时,例如 (exec sp_GetReport 'Inboundfile.txt') 而不是 Select query 。 . 我收到语法错误
      【解决方案4】:

      创建一个小脚本,csv 是一个简单的格式:csv = 逗号分隔值。用逗号分隔您的值。

      【讨论】:

      • 这确实没有解决问题。 OP 询问如何从存储过程输出到 csv,而不是 csv 是什么。
      • @Error_2646 我认为这实际上解决了 OP 的问题。 OP 似乎不知道 CSV 是什么,并试图与 Office 建立关联。
      • @JohnCappelletti,想到 CSV,你能告诉我为什么服务器上需要 Microsoft.ACE.OLEDB 吗?
      • @JohnCappelletti,我不确定你知道你在说什么。为什么我需要在服务器上安装 Microsoft.ACE.OLEDB 才能使用 CLR?可能与其说“例如”,不如给出一些可靠的理由。
      猜你喜欢
      • 1970-01-01
      • 2023-03-05
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多