2011-04-28 70 views
2

我必须同步两个数据库(在同一台服务器上)的数据,并实现我使用的存储过程。使用像在一个内部联接

来自数据库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.

这是怎么发生的?

+0

此查询的工作方式:SELECT A.Id,B.id FROM A.dbo.table as A LEFT OUTER JOIN B.dbo.table as B on(B.id like'Item'+ 42)? – 2011-04-28 15:36:28

回答

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的加入A项。

+0

你的答案导致我的问题。我正在使用nvarchar而不是varchar = $傻我 – dcarneiro 2011-04-28 15:48:01

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更好,因为平等运营商是优化搜索。

+0

你是对的,但它仍然没有解决问题。 – dcarneiro 2011-04-28 15:47:18

+0

编辑是正确的。我必须将它转换为varchar而不是nvarchar – dcarneiro 2011-04-28 15:50:03

+0

@Daniel:请发布两张表格中的相关记录,这些记录应该在您的意见中返回。 – Quassnoi 2011-04-28 15:50:28

1

你不应该做这样的事情为什么,如果你不使用通配符'%'?您使用LIKE ?:

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)) 

,为什么你与一个静态值做一个JOIN ID?

+0

我正在使用LIKE,因为数据库B Id比Item 复杂一点。它涉及另一个变量,事实上我正在这样做:像'%,'+ convert(varchar,B.id)。我只是给出一个更清晰的例子,这样就很容易找到问题=) – dcarneiro 2011-04-28 15:53:25