在内连接中使用like

时间:2011-04-28 15:33:43

标签: sql sql-server

我必须在两个数据库之间同步数据(在同一台服务器上)并实现我正在使用存储过程。

来自数据库A的id是int,来自数据库B的id是char(25)并采用以下形式:Item。例如,如果A.Id为42,则B.Id为Item42

在执行查询以加入两个数据库时,会发生最奇怪的行为:

SELECT A.Id, B.id
FROM A.dbo.table as A
LEFT OUTER JOIN B.dbo.table as B on (B.id like 'Item42')

像预期的那样工作但

DECLARE @id nvarchar;    
SET @id = '42';

SELECT A.Id, B.id
FROM A.dbo.table as A
LEFT OUTER JOIN B.dbo.table as B on (B.id like 'Item' + @id)

在B.Id上返回null。

为什么会这样?

3 个答案:

答案 0 :(得分:2)

没有长度说明符的

NVARCHAR被视为NVARCHAR(1),无法容纳42并将其截断为4

DECLARE @id nvarchar;    
SET @id = '42';

SELECT  @id

--
4

@id指定更长的长度:

DECLARE @id NVARCHAR(20)

最终,您的查询应如下所示:

SELECT  A.Id, B.id
FROM    A.dbo.table as A
LEFT OUTER JOIN
        B.dbo.table as B
ON      B.id = 'Item' + CAST(a.id AS VARCHAR(20))

这比LIKE更好,因为相等运算符是可以理解的。

答案 1 :(得分:2)

我想你想要这样的东西:

select a.id, b.id
from A.dbo.table as a
left join B.dbo.table as b
  on b.id = 'Item' + convert(varchar, a.id)

否则,你实际上是在进行交叉连接,因为你没有在B的join子句中引用A.

答案 2 :(得分:1)

你不应该这样做吗?:

SELECT A.Id, B.id
FROM A.dbo.table as A
LEFT OUTER JOIN B.dbo.table as B 
ON B.id = 'Item' + CAST(A.id AS VARCHAR(10))

如果您没有使用通配符LIKE,为什么使用'%'?为什么要为JOIN使用带静态值的ID?