在 bcp 导出期间将白色 space 附加到文件
Append white space to file during bcp export
我正在开发一个程序,该程序将 SQL 数据库中的一堆文件加载到 table 中,平均行数总计超过 150,000 + 条记录,然后运行一个进程来匹配SSN 编号基于 SSN 在 table 中出现的次数。一旦该过程完成 运行,那 150,000 多条记录将导出到一个文本文件,然后我们将其发送给一家公司进行处理。我正在使用带有格式文件的 BCP(批量复制)实用程序将记录加载到 table 并在过程结束时将处理过的记录导出到文本文件。
我面临的问题是文件导出生成了我们想要的记录,但字符数不对,因为文件中的每条记录只有 99 个字符长,而本应是 102 个字符的日志。由于缺少其他字符,我们将文件发送到的公司无法对其进行处理。
我的问题是,如何添加额外的白色 space 而不向我当前的流程添加太多额外的步骤,因为它有点占用资源。我的第一个想法是修改我正在使用的当前格式文件,在每一行的末尾添加三个额外的白色 space,但在阅读互联网上的评论时,我不确定这是否可行。我的下一个想法是遍历文本文件中的每一行以添加额外的白色 space,但这似乎有点低效,因为在文件中添加白色 space 会更容易export 发生而不是遍历所有记录,因为我确信这是非常耗费资源的。什么是最好的方法?
Format File
<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<FIELD ID="1" xsi:type="CharFixed" LENGTH="4" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="2" xsi:type="CharFixed" LENGTH="1" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="3" xsi:type="CharFixed" LENGTH="14" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="4" xsi:type="CharFixed" LENGTH="20" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="5" xsi:type="CharFixed" LENGTH="9" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="6" xsi:type="CharFixed" LENGTH="9" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="7" xsi:type="CharFixed" LENGTH="3" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="8" xsi:type="CharFixed" LENGTH="8" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="9" xsi:type="CharFixed" LENGTH="8" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="10" xsi:type="CharFixed" LENGTH="16" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="11" xsi:type="CharTerm" MAX_LENGTH='6' TERMINATOR="\n" />
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="Agency" xsi:type="SQLCHAR" />
<COLUMN SOURCE="2" NAME="Fund" xsi:type="SQLCHAR" />
<COLUMN SOURCE="3" NAME="Account" xsi:type="SQLCHAR" />
<COLUMN SOURCE="4" NAME="LName" xsi:type="SQLCHAR" />
<COLUMN SOURCE="5" NAME="FName" xsi:type="SQLCHAR" />
<COLUMN SOURCE="6" NAME="SSN" xsi:type="SQLCHAR" />
<COLUMN SOURCE="7" NAME="Prior" xsi:type="SQLCHAR" />
<COLUMN SOURCE="8" NAME="BalDue" xsi:type="SQLCHAR" />
<COLUMN SOURCE="9" NAME="DRSBal" xsi:type="SQLCHAR" />
<COLUMN SOURCE="10" NAME="Fill1" xsi:type="SQLCHAR" />
<COLUMN SOURCE="11" NAME="FileDate" xsi:type="SQLNCHAR" />
</ROW>
</BCPFORM>
处理文件导出的存储过程
DECLARE @fileName varchar(75) = 'ITAS_FILENAME';
DECLARE @processTime varchar(14) = REPLACE(Convert(varchar, getdate(), 108), ':', '');
DECLARE @processDate varchar(8) = CONVERT(varchar, GETDATE(), 112);
DECLARE @bulkCopyCmd varchar(512);
DECLARE @filePath varchar(100) = 'E:\DRSFILE\OUT\';
SET @fileName = @fileName + @processDate + @processTime + '.txt';
SET NOCOUNT ON;
-- To allow advanced options to be changed.
EXEC sp_configure 'show advanced options', 1
-- To update the currently configured value for advanced options.
RECONFIGURE
-- To enable the feature.
EXEC sp_configure 'xp_cmdshell', 1
-- To update the currently configured value for this feature.
RECONFIGURE
SET @bulkCopyCmd = 'bcp "Execute dbo.sp_process_file_export "processResult"" queryout "'
+ @filePath
+ @fileName + '"'
+ ' -S [Server IP] -T -d "DRSFile" -f "E:\DRSFILE\Utilites\drsFile_SQL_FormatFile.xml"'
--Insert File Details
INSERT INTO FileExportDetails (userName, fileName, runDate)
VALUES (@userName, @fileName, @processDate + @processTime)
--Run Bulk Copy Command
EXEC master..xp_cmdshell @bulkCopyCmd
IF @@ROWCOUNT = 0
--Error, something went wrong
SET @processResults = 0
ELSE
--Success
SET @processResults = 1
只需在您的格式文件中添加另一个字段并进行查询。
对于您的查询,只需添加一个新的最后一列
select
col_a
, col_b
, ...
, Filedate
, cast( '' as char( 3 ) ) Fill2 -- add this new column
from your_table
然后也添加到您的格式文件中:
<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<FIELD ID="1" xsi:type="CharFixed" LENGTH="4" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="2" xsi:type="CharFixed" LENGTH="1" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="3" xsi:type="CharFixed" LENGTH="14" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="4" xsi:type="CharFixed" LENGTH="20" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="5" xsi:type="CharFixed" LENGTH="9" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="6" xsi:type="CharFixed" LENGTH="9" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="7" xsi:type="CharFixed" LENGTH="3" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="8" xsi:type="CharFixed" LENGTH="8" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="9" xsi:type="CharFixed" LENGTH="8" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="10" xsi:type="CharFixed" LENGTH="16" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="11" xsi:type="CharFixed" LENGTH="6" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="12" xsi:type="CharTerm" MAX_LENGTH='3' TERMINATOR="\n" />
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="Agency" xsi:type="SQLCHAR" />
<COLUMN SOURCE="2" NAME="Fund" xsi:type="SQLCHAR" />
<COLUMN SOURCE="3" NAME="Account" xsi:type="SQLCHAR" />
<COLUMN SOURCE="4" NAME="LName" xsi:type="SQLCHAR" />
<COLUMN SOURCE="5" NAME="FName" xsi:type="SQLCHAR" />
<COLUMN SOURCE="6" NAME="SSN" xsi:type="SQLCHAR" />
<COLUMN SOURCE="7" NAME="Prior" xsi:type="SQLCHAR" />
<COLUMN SOURCE="8" NAME="BalDue" xsi:type="SQLCHAR" />
<COLUMN SOURCE="9" NAME="DRSBal" xsi:type="SQLCHAR" />
<COLUMN SOURCE="10" NAME="Fill1" xsi:type="SQLCHAR" />
<COLUMN SOURCE="11" NAME="FileDate" xsi:type="SQLNCHAR" />
<COLUMN SOURCE="12" NAME="Fill2" xsi:type="SQLCHAR" />
</ROW>
</BCPFORM>
我正在开发一个程序,该程序将 SQL 数据库中的一堆文件加载到 table 中,平均行数总计超过 150,000 + 条记录,然后运行一个进程来匹配SSN 编号基于 SSN 在 table 中出现的次数。一旦该过程完成 运行,那 150,000 多条记录将导出到一个文本文件,然后我们将其发送给一家公司进行处理。我正在使用带有格式文件的 BCP(批量复制)实用程序将记录加载到 table 并在过程结束时将处理过的记录导出到文本文件。
我面临的问题是文件导出生成了我们想要的记录,但字符数不对,因为文件中的每条记录只有 99 个字符长,而本应是 102 个字符的日志。由于缺少其他字符,我们将文件发送到的公司无法对其进行处理。
我的问题是,如何添加额外的白色 space 而不向我当前的流程添加太多额外的步骤,因为它有点占用资源。我的第一个想法是修改我正在使用的当前格式文件,在每一行的末尾添加三个额外的白色 space,但在阅读互联网上的评论时,我不确定这是否可行。我的下一个想法是遍历文本文件中的每一行以添加额外的白色 space,但这似乎有点低效,因为在文件中添加白色 space 会更容易export 发生而不是遍历所有记录,因为我确信这是非常耗费资源的。什么是最好的方法?
Format File
<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<FIELD ID="1" xsi:type="CharFixed" LENGTH="4" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="2" xsi:type="CharFixed" LENGTH="1" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="3" xsi:type="CharFixed" LENGTH="14" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="4" xsi:type="CharFixed" LENGTH="20" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="5" xsi:type="CharFixed" LENGTH="9" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="6" xsi:type="CharFixed" LENGTH="9" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="7" xsi:type="CharFixed" LENGTH="3" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="8" xsi:type="CharFixed" LENGTH="8" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="9" xsi:type="CharFixed" LENGTH="8" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="10" xsi:type="CharFixed" LENGTH="16" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="11" xsi:type="CharTerm" MAX_LENGTH='6' TERMINATOR="\n" />
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="Agency" xsi:type="SQLCHAR" />
<COLUMN SOURCE="2" NAME="Fund" xsi:type="SQLCHAR" />
<COLUMN SOURCE="3" NAME="Account" xsi:type="SQLCHAR" />
<COLUMN SOURCE="4" NAME="LName" xsi:type="SQLCHAR" />
<COLUMN SOURCE="5" NAME="FName" xsi:type="SQLCHAR" />
<COLUMN SOURCE="6" NAME="SSN" xsi:type="SQLCHAR" />
<COLUMN SOURCE="7" NAME="Prior" xsi:type="SQLCHAR" />
<COLUMN SOURCE="8" NAME="BalDue" xsi:type="SQLCHAR" />
<COLUMN SOURCE="9" NAME="DRSBal" xsi:type="SQLCHAR" />
<COLUMN SOURCE="10" NAME="Fill1" xsi:type="SQLCHAR" />
<COLUMN SOURCE="11" NAME="FileDate" xsi:type="SQLNCHAR" />
</ROW>
</BCPFORM>
处理文件导出的存储过程
DECLARE @fileName varchar(75) = 'ITAS_FILENAME';
DECLARE @processTime varchar(14) = REPLACE(Convert(varchar, getdate(), 108), ':', '');
DECLARE @processDate varchar(8) = CONVERT(varchar, GETDATE(), 112);
DECLARE @bulkCopyCmd varchar(512);
DECLARE @filePath varchar(100) = 'E:\DRSFILE\OUT\';
SET @fileName = @fileName + @processDate + @processTime + '.txt';
SET NOCOUNT ON;
-- To allow advanced options to be changed.
EXEC sp_configure 'show advanced options', 1
-- To update the currently configured value for advanced options.
RECONFIGURE
-- To enable the feature.
EXEC sp_configure 'xp_cmdshell', 1
-- To update the currently configured value for this feature.
RECONFIGURE
SET @bulkCopyCmd = 'bcp "Execute dbo.sp_process_file_export "processResult"" queryout "'
+ @filePath
+ @fileName + '"'
+ ' -S [Server IP] -T -d "DRSFile" -f "E:\DRSFILE\Utilites\drsFile_SQL_FormatFile.xml"'
--Insert File Details
INSERT INTO FileExportDetails (userName, fileName, runDate)
VALUES (@userName, @fileName, @processDate + @processTime)
--Run Bulk Copy Command
EXEC master..xp_cmdshell @bulkCopyCmd
IF @@ROWCOUNT = 0
--Error, something went wrong
SET @processResults = 0
ELSE
--Success
SET @processResults = 1
只需在您的格式文件中添加另一个字段并进行查询。
对于您的查询,只需添加一个新的最后一列
select
col_a
, col_b
, ...
, Filedate
, cast( '' as char( 3 ) ) Fill2 -- add this new column
from your_table
然后也添加到您的格式文件中:
<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<FIELD ID="1" xsi:type="CharFixed" LENGTH="4" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="2" xsi:type="CharFixed" LENGTH="1" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="3" xsi:type="CharFixed" LENGTH="14" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="4" xsi:type="CharFixed" LENGTH="20" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="5" xsi:type="CharFixed" LENGTH="9" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="6" xsi:type="CharFixed" LENGTH="9" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="7" xsi:type="CharFixed" LENGTH="3" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="8" xsi:type="CharFixed" LENGTH="8" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="9" xsi:type="CharFixed" LENGTH="8" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="10" xsi:type="CharFixed" LENGTH="16" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="11" xsi:type="CharFixed" LENGTH="6" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="12" xsi:type="CharTerm" MAX_LENGTH='3' TERMINATOR="\n" />
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="Agency" xsi:type="SQLCHAR" />
<COLUMN SOURCE="2" NAME="Fund" xsi:type="SQLCHAR" />
<COLUMN SOURCE="3" NAME="Account" xsi:type="SQLCHAR" />
<COLUMN SOURCE="4" NAME="LName" xsi:type="SQLCHAR" />
<COLUMN SOURCE="5" NAME="FName" xsi:type="SQLCHAR" />
<COLUMN SOURCE="6" NAME="SSN" xsi:type="SQLCHAR" />
<COLUMN SOURCE="7" NAME="Prior" xsi:type="SQLCHAR" />
<COLUMN SOURCE="8" NAME="BalDue" xsi:type="SQLCHAR" />
<COLUMN SOURCE="9" NAME="DRSBal" xsi:type="SQLCHAR" />
<COLUMN SOURCE="10" NAME="Fill1" xsi:type="SQLCHAR" />
<COLUMN SOURCE="11" NAME="FileDate" xsi:type="SQLNCHAR" />
<COLUMN SOURCE="12" NAME="Fill2" xsi:type="SQLCHAR" />
</ROW>
</BCPFORM>