具有不同排序规则的 SqlBulkCopy
我需要将数据从一个数据库迁移到另一个数据库。我选择使用 SqlBulkCopy,但有一个问题,因为源数据库的排序规则与目标数据库不同,所以,我遇到了一个例外:
System.InvalidOperationException: The locale id '1049' of the source column 'Id' and the locale id '1033' of the destination column 'Id' do not match.
at System.Data.SqlClient.SqlBulkCopy.AnalyzeTargetAndCreateUpdateBulkCommand(BulkCopySimpleResultSet internalResults)
at System.Data.SqlClient.SqlBulkCopy.WriteToServerInternal()
at System.Data.SqlClient.SqlBulkCopy.WriteRowSourceToServer(Int32 columnCount)
at System.Data.SqlClient.SqlBulkCopy.WriteToServer(IDataReader reader)
at MigrateToNormalized.DirectMapCommand.Migrate(SqlConnection source, SqlConnection destination, SqlTransaction transaction) in D:\Projects\APS\DTE\MigrateTo
Normalized\MigrateToNormalized\MigrateToNormalized\DirectMapCommand.cs:line 53
at MigrateToNormalized.Program.Main(String[] args) in D:\Projects\APS\DTE\MigrateToNormalized\MigrateToNormalized\MigrateToNormalized\Program.cs:line 32
谁能告诉我,如何在 SQL 查询中不直接使用 COLLATE 语句的情况下解决此问题?是否有一些简单的方法可以更改源数据库中所有列的排序规则?
I need to migrate data from one DB to another. I choosed to use SqlBulkCopy, but have a problem with it, because source database has different collation than destination, so, I've got an exception:
System.InvalidOperationException: The locale id '1049' of the source column 'Id' and the locale id '1033' of the destination column 'Id' do not match.
at System.Data.SqlClient.SqlBulkCopy.AnalyzeTargetAndCreateUpdateBulkCommand(BulkCopySimpleResultSet internalResults)
at System.Data.SqlClient.SqlBulkCopy.WriteToServerInternal()
at System.Data.SqlClient.SqlBulkCopy.WriteRowSourceToServer(Int32 columnCount)
at System.Data.SqlClient.SqlBulkCopy.WriteToServer(IDataReader reader)
at MigrateToNormalized.DirectMapCommand.Migrate(SqlConnection source, SqlConnection destination, SqlTransaction transaction) in D:\Projects\APS\DTE\MigrateTo
Normalized\MigrateToNormalized\MigrateToNormalized\DirectMapCommand.cs:line 53
at MigrateToNormalized.Program.Main(String[] args) in D:\Projects\APS\DTE\MigrateToNormalized\MigrateToNormalized\MigrateToNormalized\Program.cs:line 32
Can anyone tell me, how to resolve this issue without direct usage of COLLATE statements in SQL query? Is there some easy way to change collation for all columns in source database?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
没错,当我们使用SqlBulkCopy时,有时会出现错误,这是使用SqlBulkCopy时映射列的最佳方法。
我以前的代码:
该代码给我的错误为:
现在,在列映射之后,我的代码已成功运行。
我修改后的代码是:
此代码运行成功。
It is right that when we use SqlBulkCopy, sometimes it gives an error, the best way to map the columns when you are using SqlBulkCopy.
My Privious Code :
The Code Was giving me the Error as :
Now After Column Mapping my Code Is Running Successfully.
My Modified Code is :
This code is running Successfully.
您可以选择具有不同排序规则的列:
这会将列 Foo 的排序规则转换为新的排序规则。在上面的示例中,列 Foo 被转换为排序规则
SQL_Latin1_General_CP1_CI_AS
并在查询中命名为 Bar。然后,您需要为批量复制命令的新列添加列映射:
You can select columns with different collation:
This will convert collation of column Foo to the new collation. In the example above, the column Foo is converted to collation
SQL_Latin1_General_CP1_CI_AS
and named as Bar in the query.You then need to add columnmapping for your new column for your bulkcopy command:
简单添加列映射对我来说不起作用。我已经通过 SqlBulkCopy 和 DataTable 实现了插入 - 这个工作正常。
Simple adding column mapping didn't work for me. And I've implemented insert through SqlBulkCopy and DataTable - this one works fine.
您可以更改用于 sqlbulkcopy 的表中列的排序规则。
例如
You can change the collations for the columns in the table you are using for the sqlbulkcopy.
For Example