5

TABLE_A 包含一NVARCHAR(200) NOT NULLName。它的字段由公司名称组成,后跟下划线并以公司 ID 结尾,例如:

MYCOMPANY_102

TABLE_B 的 PK 是一个INT NOT NULL名为的列CompanyID,将包含例如102

我的查询,要内部连接这两个表,其中一个参数以另一个结尾,不会产生任何结果。如果有人想知道显而易见的事情:是的,有匹配的记录。

SELECT * FROM [SERVER1].[DB1].[dbo].[TABLE_A] a
INNER JOIN [SERVER2].[DB2].[dbo].[TABLE_B] b
ON a.Name LIKE '%[_]' + CONVERT(NVARCHAR, b.CompanyID)

任何更正和洞察为什么我的查询不能工作,是最受欢迎的。

编辑:公司名称可以在任何地方包含数字和/或下划线,我只想锁定可能最后一次出现的下划线,然后是任意自然整数。据我所知,可能是_1,可能是_205952。数字后缀中没有前导零

4

5 回答 5

2

您需要做的是从名称中取出该 ID,然后像这里一样加入它。

SELECT * FROM [SERVER1].[dbo].[TABLE_A] a
INNER JOIN [SERVER2].[dbo].[TABLE_B] b
cast(right(a.NAME, len(a.NAME)-charindex('_',A.NAME)) as int) = b.CompanyID
于 2013-05-07T13:39:27.483 回答
2

您的问题可能是公司名称的尾随空格。文档指出:

LIKE 支持 ASCII 模式匹配和 Unicode 模式匹配。当所有参数(match_expression、pattern 和 escape_character,如果存在)都是 ASCII 字符数据类型时,将执行 ASCII 模式匹配。如果任何一个参数是 Unicode 数据类型,则所有参数都将转换为 Unicode 并执行 Unicode 模式匹配。当您将 Unicode 数据(nchar 或 nvarchar 数据类型)与 LIKE 一起使用时,尾随空格很重要;但是,对于非 Unicode 数据,尾随空格并不重要。Unicode LIKE 与 ISO 标准兼容。ASCII LIKE 与早期版本的 SQL Server 兼容。

这只是一种可能。请注意,当您使用varcharornvarcharconvert(),您应该始终包含长度。这不会影响你。

我认为你最好通过这个比较:

cast(SUBSTRING(a.name, charindex('_', a.name)+1, LEN(a.name)) as int) = b.CompanyId

通过在 上使用 equi-join CompanyId,您有机会在该列上使用索引。

于 2013-05-07T13:41:14.003 回答
1
Like '%[_]' +  Cast(b.CompanyID as Varchar(100))

SQL小提琴

于 2013-05-07T13:33:43.833 回答
0

可能这可能会有所帮助:

SELECT * FROM [SERVER1].[dbo].[TABLE_A] a
INNER JOIN [SERVER2].[dbo].[TABLE_B] b
ON a.Name LIKE N'%[_]' + CONVERT(NVARCHAR, b.CompanyID)

我已经测试了您的代码,它对我来说非常完美。唯一可能的原因是没有匹配的记录。

于 2013-05-07T14:14:03.610 回答
0

有些事情可能不像你想象的那样,因为这个页面上的大部分代码(包括你的)应该可以工作,或者至少返回一些东西

我建议将这些表选择到本地临时表中(允许您检查数据类型/长度),ltrim(rtrim(...))即使您认为不需要也运行,使用N将文字标记为 unicode,显式设置字符串的宽度等。任何可以增加简单性或安全性的东西都可以帮助您找到问题所在。

拔毛者通常以拍打头的方式结束。

SELECT Name INTO #TABLE_A FROM [SERVER1].[dbo].[TABLE_A];

SELECT CompanyID INTO #TABLE_B FROM [SERVER1].[dbo].[TABLE_B];

-- Now you can check to see that the columns above are what you believe,
-- and then run your select or any of the selects that have been offered.

SELECT a.Name, b.CompanyID
FROM #TABLE_A AS a
    INNER JOIN #TABLE_B AS b
        ON LTRIM(RTRIM(a.Name)) LIKE N'%[_]' + CAST(b.CompanyID AS NVARCHAR(11))

此外,四部分命名[SERVER1].[dbo].[TABLE_A]看起来很奇怪。你的意思是还是相反?[DB1].[dbo].[TABLE_A][SERVER1].[DB1].[dbo].[TABLE_A]

于 2013-05-07T15:34:04.840 回答