在SQL Server中排序

order sqlbulkcopy sql-server-2008

我有一种情况,我从文本文件导入许多行数据。导入过程使用SqlBulkCopy进行,并最初加载到临时表中。

我对这些数据执行了一些验证,并希望能够在验证失败时向用户报告该文件的哪一行出错。我希望在我的临时表上简单地使用ROW_NUMBER()以及SELECT的默认顺序,但是在SO上有一些 问题表明我将无法做到这一点。

作为允许我保留输入文件原始顺序的方法,您会建议什么?输入文件格式为TSV。我是否需要创建一个指示文件行的模拟值?

有没有办法按原始插入的顺序报告查询结果?鉴于我使用SqlBulkCopy来加载日期,我能依靠这个吗?

热门答案

我发现我能够使用BULK INSERT将源表顺序保存到文件中,然后添加标识。

给定一个制表符分隔的表C:\MyTable.txt ,我故意按行顺序移动行:

FileName    FileType
wmsetup log
bar txt
wmsetup10   log
WMSysPr9    prx
WMSysPrx    prx
Wudf01000Inst   log
xpsp1hfm    log
_default    pif
0   log
002391_ tmp
005766_ tmp

我运行以下内容并保留SQL Server中的文本文件顺序:

IF EXISTS(
    SELECT 1
    FROM sys.tables t
    INNER JOIN sys.schemas s on s.schema_id=t.schema_id
    WHERE t.name='myTable'
    AND t.[type]='U'
    AND s.name='dbo'
)
DROP TABLE myTable
GO

CREATE TABLE dbo.myTable(FileName VARCHAR(80), FileType VARCHAR(30))
GO

BULK INSERT myTable FROM 'C:\MyTable.txt' WITH (
firstrow=2
, fieldterminator='\t'
, rowterminator='\n'
)
GO

ALTER TABLE myTable ADD ID INT IDENTITY(1,1)
GO

SELECT * FROM myTable
GO

结果:

FileName        FileType ID
--------------- -------- -----------
wmsetup         log      1
bar             txt      2
wmsetup10       log      3
WMSysPr9        prx      4
WMSysPrx        prx      5
Wudf01000Inst   log      6
xpsp1hfm        log      7
_default        pif      8
0               log      9
002391_         tmp      10
005766_         tmp      11



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因