【问题标题】:Error while converting varchar to bigint将 varchar 转换为 bigint 时出错
【发布时间】:2016-10-12 13:48:05
【问题描述】:

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

消息 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

【问题讨论】:

  • CatAtt.ChID 是什么数据类型?这可能就是问题所在。
  • CatAtt.ChID 的数据类型为 bigint。
  • 您的一个联接有一个不是数字的VARCHAR 值。我猜app.UserIdentifier。对于 SQL Server 2012+,您可以使用TRY_CONVERT() 找出购买的产品。否则,您将不得不更深入地挖掘,因为如果您不太了解ISNUMERIC,它可能会出现问题。所以试试select UserIdentifier from Parent where TRY_CONVERT(bigint,UserIdentifier) is null
  • 首先你应该使用 ANSI-92 风格的连接而不是旧的逗号分隔列表。最重要的是,您不应该在单个查询中混合使用两种样式。 sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/…

标签: sql-server common-table-expression


【解决方案1】:

尝试转换而不是强制转换

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

【讨论】:

  • 您能解释一下为什么您认为这会有所不同吗?错误消息是关于将 varchar 转换为 bigint。
  • 所以我认为 "convert(bigint , '0')chID" 会将零转换为 bigint
  • 是的,我再次验证,发现错误在替换方法中,其中 ka.Name 是 nvarchar 而不是 null,ka.type 是 bigint 而不是 null,dt.ownerid 是 bigint 而不是空值。在 oracle 中,语法是“REPLACE(ka.Name, ka.Type || '', dt.ownerid || '') = rg.Name”,它有效并得到了结果。我通过删除 Replace 方法在 SQL 中验证并执行,结果显示出来,当我保持条件时,我得到了错误。
  • @Ashu 是正确的,但这不是 OP 遇到的问题。他们的代码将 0 转换为 bigint。里面没有varchar。错误在他们代码的其他地方。
  • @Sean 我明白你的意思了,现在我已经对之前给出错误的 REPLACE 函数进行了更改
猜你喜欢
  • 2017-01-20
  • 1970-01-01
  • 2012-06-05
  • 1970-01-01
  • 2021-05-22
  • 1970-01-01
  • 2012-04-11
相关资源
最近更新 更多