首页 > 解决方案 > 将 CAST、CONCAT 和 COLLATE 与 LEFT OUTER JOIN 结合使用

问题描述

我正在尝试 CONCAT 两列并且还使用 CAST 和 COLLATE 但是当我尝试以我认为可行的方式修复它们时不断收到许多不同的错误。

基本上我试图将两列连接在一起,但我遇到了排序规则冲突。然后,我尝试整理这两列,然后我得到一个数据类型对 COLLATE 错误无效。在此之后,我尝试 CAST 列给我将其更改为 varchar 的错误,但它不起作用。我只是不确定如何使所有 3 个一起工作。

SELECT TransactionHeader.TransactionType,
TransactionHeader.TicketStub,
CAST ( TransactionHeader.TransactionNumber AS nvarchar(8)) AS [TN],
TransactionHeader.ActualAmount,
Currencies.SwiftCode,
TransactionHeader.CurrencyID,
Divisions.ShortName,
DealHeader.StartDateNumber,
DealHeader.EndDateNumber,

CONCAT (TransactionHeader.TicketStub,                 
TransactionHeader.TransactionNumber) AS [DealRef]

FROM   Company.dbo.TransactionHeader TransactionHeader
LEFT OUTER JOIN Company.dbo.DealHeader DealHeader
    ON TransactionHeader.THDealID=DealHeader.DHDealID
LEFT OUTER JOIN Company.dbo.Currencies Currencies
    ON TransactionHeader.CurrencyID=Currencies.CRRecordID
LEFT OUTER JOIN Company.dbo.Divisions Divisions
    ON TransactionHeader.PrimaryPartyID=Divisions.DVRecordID

WHERE TransactionHeader.TicketStub COLLATE DATABASE_DEFAULT
= TransactionHeader.TransactionNumber COLLATE DATABASE_DEFAULT

总而言之,我只想连接 TicketStub 和 TransactionNumber 列,但我不确定如何克服我遇到的错误。就整理而言,我仍然有点不确定它是如何工作的,我只知道要修复我需要做的整理错误。我对 T-SQL 非常陌生,并且在过去的一个半月里才开始编写它,所以请,任何建议都会非常有帮助。谢谢!

标签: sql-servertsqlsql-server-2012

解决方案


排序规则是一种设置,用于确定数据库应如何在服务器、数据库或列级别处理字符数据。在red-gate 上有一个非常好的博客。. 每个服务器和数据库都有一个排序规则。数据库和服务器匹配是很常见的,因为默认情况下,数据库将从数据库继承此设置model。看到列级排序规则并不常见,但这似乎就是您在这里所拥有的,因为您的所有表都来自同一个DATABASE

您将需要弄清楚这些列上的排序规则。Dave Pinal在他的博客上对此进行了很好的阐述。您也可以通过其他几种方式做到这一点。请参阅文档。

整理好之后,就可以整理CONCAT. 它看起来像下面这样。在这里,我只使用DATABASE_DEFUALTwhich 可能适用于您的情况:

CONCAT(TransactionHeader.TicketStub COLLATE DATABASE_DEFAULT,TransactionHeader.TransactionNumber COLLATE DATABASE_DEFAULT) AS [DealRef]

COLLATE WITH CONCAT您可以在此答案答案中找到更多示例


推荐阅读