2011-04-28 69 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