Sql server 使用OPENROWSET跳过最后一行

Sql server 使用OPENROWSET跳过最后一行,sql-server,csv,openrowset,nocount,Sql Server,Csv,Openrowset,Nocount,我正在使用以下命令(我将其略为缩写)相当直接地导入由供应商提供的.csv文件: 插入到。。。作为BulkLoadFile从OPENROWSET(大容量“CSVFileName”,FORMATFILE='XMLFormatFileName',FIRSTROW=2,MAXERRORS=0)中 CSV文件格式如下所示(您可能需要单击以查看图像,因为我是StackOverflow的新手,无法直接发布图像): 我的问题是计数的最后一行。。。它导致导入失败 仅供参考>>>是的,我知道您可以使用“SET N

我正在使用以下命令(我将其略为缩写)相当直接地导入由供应商提供的.csv文件:

插入到。。。作为BulkLoadFile从OPENROWSET(大容量“CSVFileName”,FORMATFILE='XMLFormatFileName',FIRSTROW=2,MAXERRORS=0)中

CSV文件格式如下所示(您可能需要单击以查看图像,因为我是StackOverflow的新手,无法直接发布图像):

我的问题是计数的最后一行。。。它导致导入失败

仅供参考>>>是的,我知道您可以使用“SET NOCOUNT ON”,但我不生成此文件,因此这不是一个选项

现在我打开文件并删除最后一行,然后在导入之前重新保存。(注意:我还删除了显示为绿色的前两行,因为我已经在文件中,但前两行不是问题,因为我可以使用FIRSTROW=4开关跳过这些行)

因此,我的问题是:

有没有办法跳过最后一行?

有没有办法获取行计数,并使用最后一行开关?i、 e.最后一行=myCSVfile中的计数(*)

因为它总是以“Total”开头,所以是否还要添加WHERE子句?i、 e.其中第一列中的值与“总计:%”不同

这是SSIS可以更好地处理的事情吗?如果是这样,我可以将此导入例程移到SSIS

先谢谢你。。。我期待着真正的自动化,而不是每次导入时都打开这个文件(一天多次)

D3Y

我看到两个选项:

  • 将数据插入临时表,清除不需要的行,然后插入最终(生产表)。这只能使用T-SQL完成

  • 使用SSIS包(特别是数据流任务),您可以使用条件拆分过滤掉不需要的行。e、 g

  • 找到解决方法

    我使用的是MAXERRORS=0

    如果我假设(是的,我知道这里关于假设的笑话)我将有1个(预期)错误与最后一行相关,我可以使用MAXERRORS=1,并且我的数据导入很好。最后一行(总计:xxxx)已导入到我的表中,但当我在更新管道中进一步使用该行时,我可以忽略该行

    另外值得注意的是…如果没有指定max_errors,默认值为10,因此我甚至可以通过不使用MAXERRORS开关来避免这一点。。。算了吧


    背景:MSDN()指定取消批量导入操作之前数据中允许的最大语法错误数。大容量导入操作无法导入的每一行都将被忽略并计为一个错误

    我刚刚在需要知道最后一行的行之前发出了一个openrowset命令,并将其指向相关文件。将formatfile设置为仅具有描绘符(一列),设置行终止符(在本例中为\n)。这是我非常简单的格式文件:

    <?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="CharTerm" TERMINATOR="\n" MAX_LENGTH="10000" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
     </RECORD>
     <ROW>
      <COLUMN SOURCE="1" NAME="Column0" xsi:type="SQLVARYCHAR"/>
     </ROW>
    </BCPFORMAT>
    

    感谢您的反馈,但这些解决方案并没有解决我的问题。。。由于最后一行的原因,我无法导入文件(到临时表或生产表)。您是否收到任何类型的错误?根据您提供的信息,我看不出有任何障碍,因为最后一行无法导入并删除(未移动)到最终/生产表。ivankristof,您是正确的。。。这更多的是关于我错误地使用MAXERRORS开关。谢谢你的反馈!
    DECLARE @File VARCHAR(200);
    
    SET @File = '''Dir\path\';
    SET @File += 'filename.txt''';
    
    DECLARE @SQL4Rows NVARCHAR(max)
    
    SET @SQL4Rows = (
            'select count (*) FROM OPENROWSET(BULK 
            ' + @file + 
            ', 
            FORMATFILE = 
            ''\\fullformatfilepath_rowCountOnly.xml'') T'
            )
    
    DECLARE @SQL4RowsTable AS TABLE (col INT)
    
    INSERT INTO @SQL4RowsTable
    EXECUTE sp_executesql @SQL4Rows
    
    DECLARE @Rows VARCHAR(6)
    
    SET @Rows = (
            SELECT *
            FROM @SQL4RowsTable
            ) - 1 --the last line of the files is the row count, thus the minus 1
    
    DECLARE @SQL4Results NVARCHAR(max) --main sql to get results
    
    SET @SQL4Results = (
            '
    SELECT column,etc,
    INTO #inlinetemp
    FROM OPENROWSET(BULK ' + @File + 
            ', 
            FORMATFILE = 
            ''\\fullformatfilepath.xml'',LASTROW = ' + @Rows + 
            ') T
    WHERE column = ''la''
    SELECT DISTINCT columns
    FROM #inlinetemp ab
    LEFT JOIN db..tblaccounts a
        ON ab.accountnumber = a.AccountNumber
    ORDER BY column asc '
            )
    
    EXECUTE sp_executesql @SQL4Results