Sql server 使用OPENROWSET跳过最后一行
我正在使用以下命令(我将其略为缩写)相当直接地导入由供应商提供的.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我看到两个选项: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
背景: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