Sql server 在批量插入中保留行顺序

Sql server 在批量插入中保留行顺序,sql-server,wpf,vb.net,tsql,Sql Server,Wpf,Vb.net,Tsql,我正在尝试从文本文件大容量插入一个表并保留行顺序。我这样做有两个原因: 我需要检查第一行是否是标题,如果是,则将其删除 我正在报告“错误”(列值应该是什么和给定值之间的差异,即字母数字字段中的字母),并需要告诉他们发生在文本文件中的哪一行。同时,我还需要插入这些行,只是在有错误的列上插入空白值 要进行批量插入,我首先将其插入临时表,然后将清理后的值插入主表。但是临时表似乎是随机排列的 输入文件没有任何特定的顺序,因此我无法使用ORDERBY查询解决此问题 有什么建议吗?对于要插入的表或临时表

我正在尝试从文本文件大容量插入一个表并保留行顺序。我这样做有两个原因:

  • 我需要检查第一行是否是标题,如果是,则将其删除
  • 我正在报告“错误”(列值应该是什么和给定值之间的差异,即字母数字字段中的字母),并需要告诉他们发生在文本文件中的哪一行。同时,我还需要插入这些行,只是在有错误的列上插入空白值
要进行批量插入,我首先将其插入临时表,然后将清理后的值插入主表。但是临时表似乎是随机排列的

输入文件没有任何特定的顺序,因此我无法使用ORDERBY查询解决此问题


有什么建议吗?

对于要插入的表或临时表,只需在列中添加


但是,对您来说,更理想的做法是在源文件中创建一个唯一的行号

创建一个带有标识列的表,然后将其大容量插入到该表顶部的视图中,如下所示:

 Using _con As New SqlConnection(ConnectionString)
  _con.Open()
  If Not (String.IsNullOrEmpty(Pkey)) Then
    deleteTbl = "Delete from " & destTableName & " WHERE " & Pkey & " = " & PkeyId
    Using cmdTable As New SqlCommand(deleteTbl, _con)
      cmdTable.ExecuteNonQuery()
    End Using
  End If


  Using bulkCopy As SqlBulkCopy = New SqlBulkCopy(_con)
    bulkCopy.BulkCopyTimeout = 0
    bulkCopy.BatchSize = 50000
    bulkCopy.DestinationTableName = destTableName 'it is a tablename
    bulkCopy.WriteToServer(sourceTable)  'sourceTable is a datatable
  End Using

End Using
CREATE TABLE tb_TextFile (ID int identity(1,1), someColumn varchar(16))
GO

CREATE VIEW vw_TextFile
AS
SELECT someColumn
FROM tb_TextFile
GO

BULK INSERT vw_TextFile
FROM ...

我似乎无法向临时表中添加标识,因为列应该与文本文档匹配。我得到一个类型不匹配错误。如果可能的话,标识是否与文本文件的行号匹配?看起来您不能将其用于批量插入。因此,我只需要在源数据中创建唯一的行号。如果是excel,这很容易。或您可以将大容量插入到临时文件中。移动到另一个具有标识的临时表,然后执行您想要的任何操作。第二个临时表的标识将与文本文件上的行不匹配。向源数据中添加行号不是一个可行的解决方案。这里的响应非常晚,但我最终确实在源文件中添加了行号,将其逐行复制到单独的文本文件中。您使用了错误的工具。SSIS就是为此而设计的,但它是一个复杂的工具。而且,您将报告“错误”的想法毫无意义——除非您计划插入到一个字符串列表中,然后检查RBAR中的数据类型问题。在tsql中这样做将是非常具有挑战性的。@SMor这是在WPF应用程序中进行的。它需要脱机运行并使用本地数据库。我报告“错误”是有意义的,因为我们的审计师想知道是否有空白字段,或者字母,其中应该有数字,而不需要梳理成百上千条记录。我已经使用您描述的方法成功地完成了这项工作,只是没有报告正确的行号。该应用程序运行速度非常快,除了行号问题外,效果非常好。
CREATE TABLE tb_TextFile (ID int identity(1,1), someColumn varchar(16))
GO

CREATE VIEW vw_TextFile
AS
SELECT someColumn
FROM tb_TextFile
GO

BULK INSERT vw_TextFile
FROM ...