【问题标题】:Error converting data type nvarchar to numeric in view在视图中将数据类型 nvarchar 转换为数字时出错
【发布时间】:2023-04-01 02:29:01
【问题描述】:

我有一个看法:

SELECT
u.display_name AS usuario,
g.parent_name AS grupo,
pr.pkey,
REPLACE(
    CONVERT (VARCHAR, ji.CREATED, 111),
    '/',
    '-'
) AS fecha,
CAST (ji.issuetype AS INT) AS issuetype,
a.customvalue AS aplicativo,
m.customvalue AS modulo
FROM
jiraissue AS ji
JOIN project pr ON pr.ID = ji.PROJECT
JOIN (
SELECT
    ms.*
FROM
    cwd_membership ms
INNER JOIN cwd_group gp ON (
    gp.ID = ms.parent_id
    AND group_name IN (
        'Grupo QA 1',
        'Grupo QA 2',
        'Grupo QA 3',
        'BH Seguros Homo'
    )
)
) g ON g.lower_child_name = ji.REPORTER
JOIN cwd_user u ON g.lower_child_name = u.user_name
JOIN (
SELECT
    ISSUE,
    customvalue
FROM
    customfieldvalue v
INNER JOIN customfield f ON (
    f.ID = v.customfield
    AND f.cfname = 'Aplicativo'
)
INNER JOIN customfieldoption o ON (o.ID = v.STRINGVALUE)
) a ON (a.ISSUE = ji.ID)
JOIN (
SELECT
    ISSUE,
    customvalue
FROM
    customfieldvalue v
INNER JOIN customfield f ON (
    f.ID = v.customfield
    AND f.cfname = 'Módulo'
)
INNER JOIN customfieldoption o ON (o.ID = v.STRINGVALUE)
) m ON (m.ISSUE = ji.ID)
WHERE
ji.issuetype IN (9, 11, 12, 13, 14, 15)
GROUP BY
ji.issuetype,
pr.pkey,
g.parent_name,
u.display_name,
REPLACE(
    CONVERT (VARCHAR, ji.CREATED, 111),
    '/',
    '-'
),
a.customvalue,
m.customvalue

这给了我这样的东西:

usuario             grupo      pkey     fecha       issuetype  aplicativo 
----------------------------------------------------------------------------------
Ricardo A. Casares  Grupo QA 1  GD123   2012-11-23  12  Act-creditos-scheduler  ABM_Suc-backend

然后,当我尝试查询这个视图时,假设一个简单的查询:

SELECT * FROM view
WHERE pkey LIKE '%GD123%'

在某些列中,我收到“将数据类型 nvarchar 转换为数字时出错” 但在其他一些列中,例如“aplicativo”,它运行良好。

为什么会这样?

【问题讨论】:

  • 当您对 pkey 运行上述查询时,您何时收到错误消息?如果不是,哪个查询会返回该错误?
  • jiraissue.issuetype是什么类型的?
  • @user1073631 在 pkey 上是
  • @HamletHakobyan jiraissue.issuetype 是 nvarchar
  • 您确定吗,来自issuetype 的所有数据都可以转换为int

标签: sql sql-server sql-server-2008 tsql sql-server-2008-r2


【解决方案1】:

问题出在这个作业上:

o.ID = v.STRINGVALUE

请纠正它,它将解决问题。纠正此问题的一种可能方法是使用 ISNUMERIC,例如

o.ID = CASE WHEN ISNUMERIC(v.STRINGVALUE) = 1 THEN v.STRINGVALUE ELSE -1 END

(在 ELSE 中,您可以使用其他保证不与表 'o' 连接的数字,即可以使用 0)

【讨论】:

  • OP 声称他在投射 ji.issuetype 列时没有任何问题
  • 所以,肯定是o.ID = v.STRINGVALUE是罪魁祸首
  • 或者,它可能是这样的:ji.issuetype IN (9, 11, 12, 13, 14, 15)。你能评论这行并重新测试吗?
  • @cha 删除该行解决了 pkey where/like 查询,但我仍然遇到其他列的问题,例如 usuario
  • @cha 我认为,正如您所说,问题出在我查询的 o.ID = v.STRINGVALUE 部分。这个 STRINGVALUE 并不总是整数的字符串表示形式。
【解决方案2】:

此错误表示您有一些类型为 nvarchar 的列,并且您正在尝试转换为数值(例如 int)。
但是至少在返回的行中,该值不能转换为数字。

例如 - 尝试将“abcd”转换为数字会引发该错误。

在您提供的查询中,它可能在线:CAST (ji.issuetype AS INT) AS issuetype

检查ji.issuetype 中的任何数据是否不是数字的字符串表示形式...

【讨论】:

  • 嗯,实际上 jiraissue.issuetype 中的所有行都是数字的字符串表示形式。
【解决方案3】:

您可以尝试的另一件事是使用ARITHABORT 告诉 SQL 只能使用它不能转换的 NULL 值。

例如,在从视图中选择之前使用 SET ARITHABORT OFFSET ANSI_WARNINGS OFF 应该 NULL 它无法转换的值(而不是抛出异常) - 然后你可以看到哪些行(以及哪些值)给你悲伤。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 2015-03-14
    相关资源
    最近更新 更多