【问题标题】:Ordering in SQL Server在 SQL Server 中排序
【发布时间】:2012-05-26 14:32:53
【问题描述】:

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

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

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

有没有办法按照原始插入的顺序报告查询的结果?鉴于我使用 SqlBulkCopy 批量加载日期,我可以依赖这个吗?

【问题讨论】:

    标签: sql-server-2008 sqlbulkcopy


    【解决方案1】:

    我发现我可以使用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
    

    【讨论】:

    • 感谢您的回复。到目前为止,我所读到的一切都表明这不是真的。 This SO post 表明它不适用于 SqlBulkCopy,并且有 other posts 表明几乎无法确保插入顺序。我遇到的唯一有希望的事情是blogs.msdn.com/b/sqltips/archive/2005/07/20/441053.aspx 的第 4 点,但这对批量插入没有帮助。谢谢。
    • 如果批量插入 + 标识对您不起作用,就像在这里对我所做的那样,您唯一剩下的选择可能是在批量插入之前将 RowID 计数器直接插入平面文件的 shell 脚本。 Perl 让这种事情变得简单。
    • 谢谢约翰。我最终做了和你建议的差不多的事情。在读取时编辑输入以附加 RowNumber 列。我只是希望有某种方法可以绕过它。话虽如此,值得进一步研究您自己的解决方案,但要确保它的行为符合您的预期。如前所述,似乎有明确的方法可以在批量插入期间或通过 SqlBulkCopy 保留顺序,除非在源文件中定义了顺序。此外,除非您有关联的 order by 子句,否则您不能保证您选择的订单。再次感谢。
    猜你喜欢
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多