web-dev-qa-db-ja.com

ビューでデータ型nvarcharを数値に変換中にエラーが発生しました

私は見解を持っています:

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」などの他の一部の列では正常に機能しています。

なんでこんなことが起こっているの?

5
ricardocasares

問題はこの割り当てにあります:

o.ID = v.STRINGVALUE

修正してください。問題は解決します。問題を修正するための可能な方法は、ISNUMERICを使用することです。

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

(ELSEでは、テーブル 'o'と結合しないことが保証されている他の番号を使用できます。つまり、0を使用できます)

6
cha

このエラーは、タイプがnvarcharの列があり、数値(たとえば、int)に変換しようとしていることを意味します。
[〜#〜] but [〜#〜]少なくとも返された行では、その値を数値に変換することはできません。

たとえば、「abcd」を数値に変換しようとすると、そのエラーが発生します。

指定したクエリでは、おそらく次の行にあります:CAST (ji.issuetype AS INT) AS issuetype

ji.issuetypeのデータのいずれかが数値の文字列表現ではないかどうかを確認してください...

3
Blachshma

もう1つ試すことができるのは、ARITHABORTを使用して、SQLにキャストできないNULL値だけを指示することです。

たとえば、ビューから選択する前にSET ARITHABORT OFFSET ANSI_WARNINGS OFFを使用すると、(例外をスローする代わりに)キャストに失敗した値をNULLにする必要があります。これにより、どの行(次にどの値)が提供されているかを確認できます。あなたは悲しみます。

1
HeavenCore