我必须在两个数据库之间同步数据(在同一台服务器上)并实现我正在使用存储过程。
来自数据库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。
为什么会这样?
答案 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?