【问题标题】:Using CAST, CONCAT and COLLATE with a LEFT OUTER JOIN将 CAST、CONCAT 和 COLLATE 与 LEFT OUTER JOIN 结合使用
【发布时间】:2019-01-17 13:01:49
【问题描述】:

我正在尝试 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

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

【问题讨论】:

    标签: sql-server tsql sql-server-2012


    【解决方案1】:

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

    您需要弄清楚这些列上的排序规则是什么。 Dave Pinal 有一个很好的write up on this on his blog. 你也可以通过其他一些方式来做到这一点。 See the docs for that.

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

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

    您可以找到更多COLLATE WITH CONCAT in this answerthis one 的示例

    【讨论】:

    • 您好,非常感谢您的回复!我浏览了您发布的一些博客和问题,它们确实帮助我更多地了解了 COLLATE 的工作原理。我尝试了您的修复,但我仍然收到错误“表达式类型 smallint 对于 COLLATE 子句无效”,我相信它来自 TransactionNumber 列。我尝试使用 CAST 将其更改为 nvarchar,但它似乎不起作用。再次感谢您的帮助!
    猜你喜欢
    • 2021-09-22
    • 1970-01-01
    • 2014-08-10
    • 2010-09-29
    • 2014-01-07
    • 1970-01-01
    • 2013-03-10
    • 2014-10-23
    相关资源
    最近更新 更多