在 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>