【问题标题】:Export stored procedure result set to Excel in SSMS在 SSMS 中将存储过程结果集导出到 Excel
【发布时间】:2018-09-04 12:32:52
【问题描述】:

我正在使用 SSMS 并尝试将存储过程的结果导出到新的 Excel 文件。 SP 接受一个 int 参数,但我找不到在查询中调用它的方法。

最新努力-

EXEC sp_makewebtask 
    @outputfile = 'C:\Users\me\Documents\testing.xls', 
    @query = **ExportAsExcel** N'@id' = 123
    @colheaders =1, 
    @FixedFont=0,@lastupdated=0,@resultstitle='Testing details'

运行存储过程会生成两个数据表,我需要将它们放在单独的工作表上。你们中的任何人都可以建议一个更好的方法来解决这个问题吗?它甚至不需要自动化,我只需要获取正确的数据。 sp 名称在上面加粗。

感谢您的宝贵时间,

H

【问题讨论】:

  • 右键单击数据库节点,任务,导出数据向导
  • 顺便说一句,您没有发布您尝试过的内容。 sp_makewebtask 无关紧要,甚至可能不再可用。它从不生成 Excel 文件
  • 我可能错了,但导出数据向导不允许导出数据库表,而不是 SP?
  • 不要搜索。阅读文档以了解已有的内容以及适合该工作的工具。通过盲目搜索,您试图使用 13 年前消失的东西
  • 顺便说一句,导出向导允许您在 Specify Table Copy or Query 页面中编写任何查询,包括对存储过程的调用

标签: html sql-server excel stored-procedures ssms


【解决方案1】:

我建议您将存储过程拆分为两个过程,每个过程分别返回一个单独的表并将它们调用到不同的工作表。

使用 SQL 将数据返回到 Excel 有多种方法

这是我最喜欢的code by Joshua (你不必使用参数):

  1. 选择 Excel 功能区上的“数据”选项卡,然后在“获取外部数据”组中选择“来自其他来源”下拉菜单。然后选择“来自 Microsoft Query”

  2. 在“选择数据源”弹出框中,选择您的 SQL Server,然后点击确定。

  3. 如有必要,关闭“添加表格”弹出窗口。

  4. 点击“SQL”按钮,或选择查看> SQL,打开SQL弹出编辑器。

  5. 输入以下语法:{CALL myDatabaseName.dbo.myStoredProc (?, ?, ?)}

    例如:{CALL northwind.dbo.spGetMaxCost (?, ?, ?)}

    确保在调用语句周围包含波浪形的大括号。每个问号 (?) 表示一个参数。如果您的存储过程需要更多或更少的参数,请根据需要添加或减去问号。

  6. 点击确定按钮。应该会弹出一个问题框说“SQL Query 无法以图形方式表示,是否继续?”,只需点击 OK 按钮即可。

  7. 现在将要求您提供上面包含的每个问号的示例参数。为您正在查询的数据输入有效的参数值。

  8. 输入最后一个参数后,您应该会在 Microsoft Query 中返回一些结果。如果它们看起来不错,请关闭 Microsoft Query。

  9. 您现在应该正在查看“导入数据”弹出窗口。点击属性按钮,会弹出“连接属性”弹窗。

  10. 选择“定义”选项卡,然后选择“参数”按钮。您现在应该会看到一个“参数”弹出窗口,您可以在其中将参数连接到特定单元格。

  11. 选择从以下单元格获取值,然后通过单击带有箭头的小框连接到 Excel 中将保存您的参数的适当单元格。

  12. 如果您希望每次更改包含参数的单元格时都刷新数据,请选中“单元格值更改时自动刷新”复选框

  13. 对其他参数继续如上。完成后,单击确定,返回连接属性弹出窗口。单击“确定”返回“导入数据”弹出窗口,然后再次单击“确定”。

  14. 您现在应该有一些直接来自存储过程的数据。

您最终会得到类似以下的连接信息:

连接信息

而且,如果您使用工作表中的参数,那么以我为例,

【讨论】:

  • 感谢您,我最终采用了您的解决方案,将其拆分为两个较小的 SP,我可以从 SQL Server 将它们一个一个导出到 excel 中。
【解决方案2】:

这不是您问题的直接答案,但可以使用 Excel VBA 和连接来连接到 SQL Server 存储过程,为其提供参数,并在 Excel 中返​​回 SP 结果集。查看我的文章 Microsoft Excel & SQL Server: Self service BI to give users the data they want 以获取图像和代码繁重的演示。

祝你好运。

在一个 SO 问题中发布的细节太多,否则我会在这里做。

【讨论】:

  • 感谢您的响应,我只是将其分成两个程序并从 excel 中调用它们。谢谢
  • 好交易。很高兴您找到了解决方案。 -吉姆
【解决方案3】:

我开发了 SSMSBoost 插件,我们已经实现了该功能,允许您以 3 种方式将数据导出到 Excel(包括在一个文件中创建多个工作表):

  1. 您可以一次操作将所有结果网格导出为“打开工作表”文件格式,excel 可以正确理解和显示。此文件格式支持多个工作表。 使用方法:右击SSMS中的数据网格,选择“Script grid data”->“Excel”模板->All Grids->ToDisk。 您还可以查看生成的文件以了解其工作原理。如果您想保持独立于加载项,则可以在存储过程中实现相同的功能。下面还提供了示例 XML。 (2个excel表,1个列名和1个值)

<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
	<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
	</ExcelWorkbook>
	<Styles>
		<Style ss:ID="sH1"><Font ss:Bold="1"/></Style>
		<Style ss:ID="sD1"><NumberFormat ss:Format="General Date"/></Style>
		<Style ss:ID="sD2"><NumberFormat ss:Format="Short Date"/></Style>
		<Style ss:ID="sD3"><NumberFormat ss:Format="Short Time"/></Style>
	</Styles>
	<Worksheet ss:Name="GridResults1">
		<Table>
			<Row>
				<Cell ss:StyleID="sH1"><Data ss:Type="String">ColumnNameA</Data></Cell>
			</Row>
			<Row>
				<Cell><Data ss:Type="Number">1</Data></Cell>
			</Row>

		</Table>
	</Worksheet>

	<Worksheet ss:Name="GridResults2">
		<Table>
			<Row>
				<Cell ss:StyleID="sH1"><Data ss:Type="String">ColumnNameB</Data></Cell>
			</Row>
			<Row>
				<Cell><Data ss:Type="Number">1</Data></Cell>
			</Row>

		</Table>
	</Worksheet>

</Workbook>
  1. 您还可以从 SSMS 网格复制粘贴数据,右键单击它并选择“将选择复制为 XML 电子表格 (Excel)”。数据将被复制并保留数据类型。

  2. 更高级的选项是我们的“执行后处理程序”功能。它允许您在查询执行完成后运行某些操作。您也可以在此处安排自动导出到 excel 文件。

希望这会有所帮助,无论是否使用 SSMSBoost ;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 2017-01-08
    相关资源
    最近更新 更多