Sql server SQL-将Varchar值转换为Int数据类型时,转换失败

Sql server SQL-将Varchar值转换为Int数据类型时,转换失败,sql-server,tsql,join,split,Sql Server,Tsql,Join,Split,如果这是一个简单的问题,我很抱歉。我不是SQL最好的,我还在学习,但我喜欢学习新东西 我有一个派生的varchar列,当从中选择时,该列如下所示: |Ref1 | |0145972358-0001| |5823647892-0002| |1697412356-0003| |6312548982-0004| ----- etc. ------ 在我的查询中,我试图根据参考文献1中“-”右侧的所有内容连接到另一个表。由于另一个表中的PK PackageId是一个Varchar,

如果这是一个简单的问题,我很抱歉。我不是SQL最好的,我还在学习,但我喜欢学习新东西

我有一个派生的varchar列,当从中选择时,该列如下所示:

|Ref1           |
|0145972358-0001|
|5823647892-0002|
|1697412356-0003|
|6312548982-0004|
----- etc. ------
在我的查询中,我试图根据参考文献1中“-”右侧的所有内容连接到另一个表。由于另一个表中的PK PackageId是一个Varchar,并且没有前导0,因此我需要减少前导0,否则连接两个Varchar数据类型将失败,因为'0001'!='1'

以下是我迄今为止尝试的查询片段:

SELECT * FROM DatabaseNameOne.SchemaOne.FileDetail fd
LEFT OUTER join DatabaseNameTwo.SchemaTwo.Packages p
    ON (SUBSTRING(
                     RIGHT(fd.Ref1, CHARINDEX('-', REVERSE(fd.Ref1) - 1)),
                     PATINDEX('%[^0]%', RIGHT(fd.Ref1, CHARINDEX('-', REVERSE(fd.Ref1) - 1))),
                     LEN(RIGHT(fd.Ref1, CHARINDEX('-', REVERSE(fd.Ref1) - 1)))
                 )
       ) = p.PackageId
下面是我尝试过的另一个问题:

SELECT * FROM DatabaseNameOne.SchemaOne.FileDetail fd
LEFT OUTER JOIN DatabaseNameTwo.SchemaTwo.Packages p
ON (REPLACE(LTRIM(REPLACE(RIGHT(fd.Ref1, CHARINDEX('-', REVERSE(fd.Ref1) - 1)), '0', '')), '', '0')) = p.PackageId
当我同时运行这两个命令时,我收到以下错误:将varchar值转换为int数据类型时,转换失败


我知道我可能错过了一些非常愚蠢的事情,但我已经走到了死胡同。在此方面的任何帮助都将不胜感激!谢谢

如果我们可以假设它始终是最后4位数字,只需将varchar转换为int,而不是尝试将int转换为varchar,这正是导致前导零问题的原因:

SELECT * FROM DatabaseNameOne.SchemaOne.FileDetail fd
LEFT OUTER JOIN DatabaseNameTwo.SchemaTwo.Packages p
ON cast(right(fd.Ref1,4) as int) = p.PackageId

这比你想象的要容易得多,只需将其转换为int即可删除零:

SELECT CONVERT(int,'0001') --Outputs 1
如果-的位置可能发生变化,这将起作用:

SELECT CONVERT(INT,RIGHT('0145972358-0001',LEN('0145972358-0001') - CHARINDEX('-','0145972358-0001')))
否则,您可以简单地:

SELECT CONVERT(int,RIGHT('0145972358-0001', 4))

你说的那个愚蠢的错误是你的“-1”的位置,它应该在结束括号之后。所以看起来应该是这样的

SELECT * FROM DatabaseNameOne.SchemaOne.FileDetail fd
LEFT OUTER join DatabaseNameTwo.SchemaTwo.Packages p
    ON (SUBSTRING(
                     RIGHT(fd.Ref1, CHARINDEX('-', REVERSE(fd.Ref1)) - 1),
                     PATINDEX('%[^0]%', RIGHT(fd.Ref1, CHARINDEX('-', REVERSE(fd.Ref1)) -1)),
                     LEN(RIGHT(fd.Ref1, CHARINDEX('-', REVERSE(fd.Ref1)) - 1))
                 )
       ) = p.PackageId

我在我这边试过了,效果如你所料

选择CASTRIGHT'0145972358-0001',4作为INT结果1类似的东西?结尾总是4位数吗?我知道这很愚蠢!我试了一下,效果也不错。谢谢你的帮助!很乐意帮忙。如果它有效,你可以将它标记为答案。