【问题标题】:How can I convert "SQL_Latin1_ General" Collate Using an SSIS Package?如何使用 SSIS 包转换“SQL_Latin1_General”排序?
【发布时间】:2012-10-22 05:24:59
【问题描述】:

我们刚刚注意到我们的 2 个服务器已使用 SQL_Latin1_General_CP1_CI_ASLatin1_General_CI_AS 设置。

我创建了一个脚本,它再次比较两个数据源(因为它是一个简单的 SELECT 语句,我没有包含它,它使用相同的列但来自不同的来源)当我尝试将它们联合在一起时我收到整理错误。

消息 468,第 16 级,状态 9,第 2 行 无法解决之间的排序规则冲突 UNION 操作中的“SQL_Latin1_General_CP1_CI_AS”和“Latin1_General_CI_AS”。

其中一个来源是由 SSIS 包填充的表,有没有一种方法可以调整 SSIS 项目以在发送到之前将“SQL_Latin1_General_CP1_CI_AS”格式转换为“Latin1_General_CI_AS”目标表?

谢谢!

【问题讨论】:

  • 嗨 Siva,我从两个不同的来源获取数据,然后在两个 select 语句上使用联合。其中一个来源来自具有不同排序规则类型的不同服务器。我不想尝试使用“collat​​e database_default”修复脚本中的问题,而是想使用 SSIS 整理其中一个源表,以确保它们都匹配为“SQL_Latin1_General_CP1_CI_AS”。对不起,如果我不清楚。

标签: sql sql-server-2008 ssis collate


【解决方案1】:

您可以在使用 SQL_Latin1_General_CP1_CI_AS 的表中的每一列之后使用句子COLLATE Latin1_General_CI_AS,如下所示。

SELECT COLUMN_A COLLATE Latin1_General_CI_AS AS COL1 
FROM TABLE

【讨论】:

    【解决方案2】:

    您的错误消息看起来像是您的 UNION 在单个 SQL 语句中? 例如 SELECT ... UNION ... SELECT

    如 Shiva 所述,在您的 SSIS 数据流中,您可以使用两个(或更多)OLE DB 源对象并将它们与“Union All”转换结合起来。每个 OLE DB 源对象将只有一个没有 UNION 子句的 SELECT。这种设计在设计/维护(列名上的联合,无需从每个来源填充每一列)和运行时吞吐量方面也具有优势。

    我认为您还需要在 OLE DB Source 对象上使用这种技术。 http://blog.stevienova.com/2009/04/16/ssis-pulling-data-from-a-non-default-collation-db-to-a-default-collation-db/

    【讨论】:

    • 嗨,迈克,感谢您的回复。我想我需要进一步澄清一下,我正在使用两个单独的数据库,此时我正在尝试使用 union 将两个 select 语句合并在一起。然而,每台服务器都使用不同的格式,即“SQL_Latin1_General_CP1_CI_AS”和“Latin1_General_CI_AS”我想知道的是,如果我使用 SSIS,我是否可以从“Latin1_General_CI_AS”第二台服务器中清除该数据,将其更改为“SQL_Latin1_General_CP1_CI_AS”格式然后将它放在第一台服务器上的新表中,这样我就可以从同一台服务器上的两个表中执行选择语句?
    • 何必呢? SSIS 可以愉快地从两个原始表(带有两个 OLE DB 源对象)中进行选择,并将它们合并在一起。
    猜你喜欢
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多