在 SQL 查询中使用 BCP
Posted
技术标签:
【中文标题】在 SQL 查询中使用 BCP【英文标题】:Using BCP in a SQL query 【发布时间】:2015-07-13 20:59:44 【问题描述】:我有一个存储过程,它更新一个表中的几个列,然后选择这些列,以便我可以将它们保存出来以用于我运行的报告。目前我正在手动进行导出和保存,方法是将“查询选项”中的列大小设置为 333,关闭所有其他选项,将结果转换为文本,然后使用名称和格式保存文件。我知道必须有一种方法可以通过导出和保存过程自动执行此操作。
我研究过使用带有 Vb 脚本的作业,但这是一个按需运行而不是按计划运行的简单报告;所以一份工作似乎是矫枉过正。我发现的另一个选项是 BCP,它看起来像我需要的。虽然我只知道这是一个 CMD 工具,但不太清楚如何在 SQL 查询中利用它。如果需要,这里是我的存储过程正在执行的示例。任何帮助表示赞赏,并提前感谢您。我正在使用 SQL 2008 R2 顺便说一句。
UPDATE Table#1 SET Column1 = '' WHERE Column1 = 'XX'
UPDATE Table#1 SET Column2 = '' WHERE Column2 = '000000'
SELECT Column1 +
Column2 +
Column3
FROM Table#1 Where Column4 = 'T'
【问题讨论】:
请提供更多关于您的餐桌设计的信息。您只想按需导出一些数据吗?如果是这样,这是一张平板吗? 该表是一个平面表,由从其他几个规范化表中获取的数据组成(这是由我编写的不同存储过程完成的)。然后我对这个过程所做的就是更新一些列,以便获得此报告的人可以理解它,然后导出他们需要的数据。我希望这会有所帮助。 您是否想过通过 Excel 进行 ODC(如果这适合您)?您可以在那里定义 SQL 语句,结果将被保存到 Excel 表中。如果需要,您也可以将其存储为 CSV。 我已经想到了,但是使用它的人需要文本格式的结果。 一个问题可能是,您需要 BCP 的某些权限。我自己使用 Excel 来检索列表数据,并使用一个小的 VBA 程序在自动关闭时将其编写为“csv”。 【参考方案1】:BCP 是一个命令行实用程序,但是可以使用 XP Command Shell 通过 SQL 访问它,因此您需要启用 xp_cmdshell。以下是如何在 SQL 内部调用 this 的参数化示例
DECLARE @Server varchar(50) = 'ServerName' /* Source SQL Server */
DECLARE @FileName varchar(50) = ''
DECLARE @SourceProc varchar(50) = ''
DECLARE @sql varchar(8000)
DECLARE @RunDate varchar(10) = REPLACE(CONVERT(date, getdate()), '-','')
DECLARE @FilePath as varchar(255) = '\\UNCPathtoOutputFile\'
DECLARE @StartDate as Date = (select dateadd(month,datediff(month,0,GETDATE())-2,0))--'1/1/2013' /* Example of required Date as parameter */
DECLARE @EndDate as Date = (SELECT dateadd(month,datediff(month,0,GETDATE())-0,-1))--'2/1/2013' /* Example of required Date as parameter */
-- BCP Export
SET @SourceProc = '[Schema].[StoredProcName]'
SET @FileName = 'SomeOutputFile' + @RunDate + '.txt'
SET @FilePath = @FilePath + @FileName
SET @sql = 'bcp "EXEC [Database].' + @SourceProc + ' ''' + CONVERT(varchar(10),@StartDate, 101) + ''',''' + CONVERT(varchar(10),@EndDate, 101) + '''" QUERYOUT "' + @FilePath + '" -c -t"|" -r\n -S' + @Server + ' -T'
--PRINT(@SQL)
exec master.dbo.xp_cmdshell @sql
【讨论】:
太棒了,非常感谢。我知道必须有一种方法可以访问它,但在任何地方都找不到。这很有帮助。以上是关于在 SQL 查询中使用 BCP的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 BCP 或 Sql Server Management Studio 从 Sql Server 中获取 BLOB 数据?