Add In "WHERE" 子句后的数据转换错误以及 SQL 中 Filter 中的特定数据
Data Conversion Error After Add In "WHERE" clause and for Specific Data In Filter in SQL
目前我遇到一个数据对话错误
"Msg 8114, Level 16, State 5, Line 1 Error converting data type nvarchar to bigint."
我知道这个错误是由于数据类型不兼容造成的。但是,只有当我的 WHERE 子句(过滤条件)仅适用于该特定用户而不适用于其他用户时才会发生这种情况。我想知道出了什么问题。我尝试使用 CAST 并将 bigint 转换为 nvarchar,但它没有帮助。
在第一个连接中,不兼容的数据类型介于 "survey_result.SR_ANSWER" 作为 NVARCHAR 和 "survey_answer.SA_ID" 作为 BIGINT 之间。我将在此处附上代码、成功结果(另一个最终用户数据)和错误。
如有任何帮助或建议,我们将不胜感激。
SELECT
survey_result.SR_SRHRESULTID,
survey_header.SH_CODE AS SURVEY_CODE,
survey_header.SH_DESCRIPTION AS SURVEY_NAME,
survey_result_header.SRH_DATE SURVEY_DATE,
survey_result.SR_DISTRIBUTOR AS DISTRIBUTOR_CODE,
dist.DI_NAME DISTRIBUTOR_NAME,
survey_result_header.SRH_RESPONDENT AS OUTLET_CODE,
ol.OL_NAME AS OUTLET_NAME,
survey_result.SR_SURVEYOR AS SALESPERSON_CODE,
ui.UI_GIVENNAME AS SALESPERSON_NAME,
survey_question.SQ_INDEX AS QUESTION_NO,
survey_question.SQ_DESCRIPTION AS QUESTION,
survey_answer.SA_DESCRIPTION AS RESULT
FROM SURVEYRESULT survey_result LEFT JOIN SURVEYANSWER survey_answer
on survey_result.SR_SQID =survey_answer.SA_SQID AND survey_result.SR_ANSWER = survey_answer.SA_ID
JOIN SURVEYQUESTION survey_question on survey_question.SQ_ID = survey_result.SR_SQID
JOIN SURVEYHEADER survey_header on survey_question.SQ_SHID = survey_header.SH_ID
JOIN SURVEYRESULTHEADER survey_result_header on survey_result_header.SRH_SHID = survey_result.SR_SHID
AND survey_result_header.SRH_RESULTID = survey_result.SR_SRHRESULTID
AND survey_result_header.SRH_DISTRIBUTOR = survey_result.SR_DISTRIBUTOR
JOIN DISTRIBUTOR dist on dist.DI_DISTRICODE = survey_result.SR_DISTRIBUTOR
JOIN OUTLET ol on ol.OL_OUTLETCODE = survey_result_header.SRH_RESPONDENT
AND ol.OL_DISTRICODE = survey_result.SR_DISTRIBUTOR
JOIN USERINFO ui on ui.UI_USERNAME = survey_result.SR_SURVEYOR
WHERE survey_result_header.SRH_DATE >='2015-10-01' AND survey_result_header.SRH_DATE <='2015-10-31'
AND survey_question.SQ_TYPE IN('1','2','8')
AND survey_header.SH_CODE IN ('MONTALL','TONTALL')
AND survey_result.SR_SURVEYOR ='E08-128' /*this line cause error*/
尝试改变这个:
survey_result.SR_ANSWER = survey_answer.SA_ID
至此
survey_result.SR_ANSWER = CAST(survey_answer.SA_ID AS VARCHAR(30))
看看错误是否消失。
如果它真的消失了,你应该:
- 找到导致问题的数据(字段
survey_answer.SA_ID
中的非数值)。你可以用SELECT * FROM survey_answer WHERE ISNUMERIC(SA_ID) = 0
找到它
- 了解这将对您的查询产生什么影响(即这将永远不会匹配
survey_result.SR_ANSWER
中的数据)
从长远来看,您需要通过以下方式解决 table 设计问题:
- 正在更新 survey_answer.SA_ID 中的数据,因此它 是 数字
- 将字段更改为数字数据类型(不是 nvarchar)
- 改变任何插入数据的应用程序,这样您就不能插入非数字数据
目前我遇到一个数据对话错误
"Msg 8114, Level 16, State 5, Line 1 Error converting data type nvarchar to bigint."
我知道这个错误是由于数据类型不兼容造成的。但是,只有当我的 WHERE 子句(过滤条件)仅适用于该特定用户而不适用于其他用户时才会发生这种情况。我想知道出了什么问题。我尝试使用 CAST 并将 bigint 转换为 nvarchar,但它没有帮助。
在第一个连接中,不兼容的数据类型介于 "survey_result.SR_ANSWER" 作为 NVARCHAR 和 "survey_answer.SA_ID" 作为 BIGINT 之间。我将在此处附上代码、成功结果(另一个最终用户数据)和错误。
如有任何帮助或建议,我们将不胜感激。
SELECT
survey_result.SR_SRHRESULTID,
survey_header.SH_CODE AS SURVEY_CODE,
survey_header.SH_DESCRIPTION AS SURVEY_NAME,
survey_result_header.SRH_DATE SURVEY_DATE,
survey_result.SR_DISTRIBUTOR AS DISTRIBUTOR_CODE,
dist.DI_NAME DISTRIBUTOR_NAME,
survey_result_header.SRH_RESPONDENT AS OUTLET_CODE,
ol.OL_NAME AS OUTLET_NAME,
survey_result.SR_SURVEYOR AS SALESPERSON_CODE,
ui.UI_GIVENNAME AS SALESPERSON_NAME,
survey_question.SQ_INDEX AS QUESTION_NO,
survey_question.SQ_DESCRIPTION AS QUESTION,
survey_answer.SA_DESCRIPTION AS RESULT
FROM SURVEYRESULT survey_result LEFT JOIN SURVEYANSWER survey_answer
on survey_result.SR_SQID =survey_answer.SA_SQID AND survey_result.SR_ANSWER = survey_answer.SA_ID
JOIN SURVEYQUESTION survey_question on survey_question.SQ_ID = survey_result.SR_SQID
JOIN SURVEYHEADER survey_header on survey_question.SQ_SHID = survey_header.SH_ID
JOIN SURVEYRESULTHEADER survey_result_header on survey_result_header.SRH_SHID = survey_result.SR_SHID
AND survey_result_header.SRH_RESULTID = survey_result.SR_SRHRESULTID
AND survey_result_header.SRH_DISTRIBUTOR = survey_result.SR_DISTRIBUTOR
JOIN DISTRIBUTOR dist on dist.DI_DISTRICODE = survey_result.SR_DISTRIBUTOR
JOIN OUTLET ol on ol.OL_OUTLETCODE = survey_result_header.SRH_RESPONDENT
AND ol.OL_DISTRICODE = survey_result.SR_DISTRIBUTOR
JOIN USERINFO ui on ui.UI_USERNAME = survey_result.SR_SURVEYOR
WHERE survey_result_header.SRH_DATE >='2015-10-01' AND survey_result_header.SRH_DATE <='2015-10-31'
AND survey_question.SQ_TYPE IN('1','2','8')
AND survey_header.SH_CODE IN ('MONTALL','TONTALL')
AND survey_result.SR_SURVEYOR ='E08-128' /*this line cause error*/
尝试改变这个:
survey_result.SR_ANSWER = survey_answer.SA_ID
至此
survey_result.SR_ANSWER = CAST(survey_answer.SA_ID AS VARCHAR(30))
看看错误是否消失。
如果它真的消失了,你应该:
- 找到导致问题的数据(字段
survey_answer.SA_ID
中的非数值)。你可以用SELECT * FROM survey_answer WHERE ISNUMERIC(SA_ID) = 0
找到它 - 了解这将对您的查询产生什么影响(即这将永远不会匹配
survey_result.SR_ANSWER
中的数据)
从长远来看,您需要通过以下方式解决 table 设计问题:
- 正在更新 survey_answer.SA_ID 中的数据,因此它 是 数字
- 将字段更改为数字数据类型(不是 nvarchar)
- 改变任何插入数据的应用程序,这样您就不能插入非数字数据