我需要在我的数据库中找到丢失的数字。我正在比较两个数据库,即在查询中创建的带有数字 1 - 999 的 tempdb 和 MYDAT。
MYDAT 看起来像:
+-------+
| id |
+-------+
| A-001 |
| A-002 |
| A-004 |
| A-... |
| A-952 |
| A-... |
+-------+
我正在运行这个查询:
declare @tempid int
set @tempid = 1
create table tempdb (tempid int)
while @tempid < 1000
begin
insert into tempdb values(@tempid)
set @tempid = @tempid + 1
end
select tempdb.tempid from tempdb
left join MYDAT on tempdb.tempid = CAST(SUBSTRING(MYDAT.ID, 3, 3) as INT)
where
MYDAT.ID IS NULL and
SUBSTRING(MYDAT.ID, 3, 3) <> '' and
SUBSTRING(MYDAT.ID, 3, 3) <> '000'and
SUBSTRING(MYDAT.ID, 3, 3) NOT LIKE '%[^0-9]%'
drop table tempdb
不放弃 temdb,select * from tempdb
看起来不错,我得到了我想要的。
从 MYDAT 选择和转换数据的部分效果很好,我只得到整数
select CAST(SUBSTRING(MYDAT.ID, 3, 3) as INT) fom MYDAT
where
SUBSTRING(MYDAT.ID, 3, 3) <> '' and
SUBSTRING(MYDAT.ID, 3, 3) <> '000'and
SUBSTRING(MYDAT.ID, 3, 3) NOT LIKE '%[^0-9]%'
我收到一个错误“将 varchar 转换为 int”,但我不知道为什么。当我将左连接更改为右连接时,我没有收到任何错误。
我还手动检查了两个数据库,没有字符串或字符,只有整数。
我也尝试了 CONVERT() 但结果相同。
有什么建议或想法有什么问题吗?
编辑:
1 - 我在 rextester 上尝试时发现一个错误。I added MYDAT.ID IS NULL
到查询,所以我得到正确的结果。
2 - 我需要这个的例子:http ://rextester.com/KFG73206
但 CAST 或 CONVERT 似乎不起作用http://rextester.com/WJIAH52304