Sql server 将varchar转换为bigint时出错

Sql server 将varchar转换为bigint时出错,sql-server,common-table-expression,Sql Server,Common Table Expression,我正在执行下面的查询。在查询中,ChID不是Cat表的列。为此,我将0放置为ChID,并将其转换为bigint数据类型,以匹配列的数据类型CatAtt。但我得到了以下错误: Msg 8114,第16级,第5状态,第1行 将数据类型varchar转换为bigint时出错 我在Oracle中执行了类似的查询,并进行了与Oracle相关的更改,得到了结果 WITH rg (ID, ChID, Name) AS ( SELECT ID, CAST(0 AS bi

我正在执行下面的查询。在查询中,ChID不是Cat表的列。为此,我将0放置为ChID,并将其转换为bigint数据类型,以匹配列的数据类型CatAtt。但我得到了以下错误:

Msg 8114,第16级,第5状态,第1行
将数据类型varchar转换为bigint时出错

我在Oracle中执行了类似的查询,并进行了与Oracle相关的更改,得到了结果

WITH rg (ID, ChID, Name) AS 
(
    SELECT
        ID,
        CAST(0 AS bigint) ChID,
        Name
    FROM Cat
    WHERE ID = 1000

    UNION ALL

    SELECT
        c.ID,
        c.ChID,
        k.Name
    FROM CatAtt c
    JOIN rg p ON (c.ChID = p.ID)
    JOIN Cat k ON (c.ID = k.ID)
)
SELECT DISTINCT
    ka.ID
FROM 
    rg, Parent app
JOIN 
    Cat ka ON (ka.ID = app.UserIdentifier)
JOIN 
    Owner dt ON (dt.ID = app.ID)
WHERE 
    app.ID = 25773
    AND app.aprroved = 0
    AND REPLACE(ka.Name, ka.Type + '_', dt.OwnerID + '_') = rg.Name

尝试转换而不是强制转换

WITH rg (ID, ChID, Name) AS 
(
SELECT
    ID,
    CONVERT(bigint , '0') ChID,
    Name
FROM Cat
WHERE ID = 1000

UNION ALL

SELECT
    c.ID,
    c.ChID,
    k.Name
FROM CatAtt c
JOIN rg p ON (c.ChID = p.ID)
JOIN Cat k ON (c.ID = k.ID)
)
SELECT DISTINCT
ka.ID
FROM 
rg, Parent app
JOIN 
Cat ka ON (ka.ID = app.UserIdentifier)
JOIN 
Owner dt ON (dt.ID = app.ID)
WHERE 
app.ID = 25773
AND app.aprroved = 0
AND REPLACE(ka.Name, cast((ka.Type) as nvarchar(max)) + '_', cast((dt.OwnerID as nvarchar(max)) + '_')) = rg.Name

什么数据类型是CatAtt.ChID?这可能就是问题所在。CatAtt.ChID的数据类型是bigint。您的一个联接的
VARCHAR
值不是数字。我猜是
app.UserIdentifier
。您可以使用SQL Server 2012+的
TRY\u CONVERT()
查找购买哪一款。否则,您将不得不深入挖掘,因为如果您不能很好地理解,
ISNUMERIC
可能会有问题。因此,尝试类似于
从父级选择UserIdentifier这样的操作,其中try\u CONVERT(bigint,UserIdentifier)为null
首先,您应该使用ANSI-92样式的联接,而不是旧的逗号分隔列表。最重要的是,您不应该在一个查询中混合使用这两种样式。你能解释一下为什么你认为这会有什么不同吗?错误消息是关于将varchar转换为bigint的。因此我认为“convert(bigint,'0')chID”会将零转换为bigint是的,我再次验证了,发现错误在Replace方法中,其中ka.Name是nvarchar而不是null,ka.type是bigint而不是null,dt.ownerid是bigint而不是null。在oracle中,语法是“REPLACE(ka.Name,ka.Type | |“”,dt.ownerid | |“”)=rg.Name”,它起作用并得到结果。我通过删除Replace方法在SQL中进行验证并执行,结果显示出来,当我保留条件时,我得到了错误。@Ashu这是正确的,但这不是OP的问题。他们的代码正在将0转换为bigint。这里面没有varchar。错误在他们代码的其他地方。@Sean我明白你的意思了,现在我对先前给出错误的REPLACE函数进行了更改