使用CAST,CONCAT和COLLATE与左外部联接

时间:2019-01-17 13:01:50

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

我正在尝试对两列进行CONCAT,也使用CAST和COLLATE,但是当我尝试以自己认为可行的方式修复它们时,会不断收到许多不同的错误。

基本上,我试图将两列合并在一起,但是却出现了排序规则冲突。因此,然后,我尝试对两列进行COLLATE,然后得到一个数据类型无效的COLLATE错误。在此之后,我尝试对列进行CAST处理,这给了我将其更改为varchar的错误,但它不起作用。我只是不确定如何使这三个一起工作。

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列进行CONCAT,但是我不确定如何克服我遇到的错误。就COLLATE而言,我仍在某种程度上保证它的工作原理,我只知道解决我需要做的整理错误。我是T-SQL的新手,并且在过去的一个半月中才编写它,因此,任何建议都将非常有帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

排序规则是一种设置,该设置确定DB在服务器,数据库或列级别上应如何对待字符数据。 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的更多示例