【发布时间】:2025-12-25 00:25:19
【问题描述】:
我正在尝试执行一个存储过程,该过程输入从查询中选择的 3 个参数。前 2 个存储过程参数应该是 int 或 bigint,但 sql 不接受它并告诉我它无法将类型 nvarchar 转换为 bigint。
所以我将参数类型更改为nvarchar,但现在在存储过程中执行查询时出现此错误。我尝试将nvarchar 转换为bigint,但即使参数值为数字,它也不起作用。
这是我执行存储过程的方式:
[dbo].[InsertMultiChoiceList] [PatientRiskAssessmentQuestionsID], NetworkRiskAssessmentQuestionsID, Answer
传递的参数如下所示:
230124| 118 |COPD (Chronic Obstructive Pulmonary Disease), Congestive Heart Failure (CHF), Sleep Apnea
这里是我的存储过程的定义:
ALTER PROCEDURE [dbo].[InsertMultiChoiceList]
@PatientRiskAssessmentQuestionsID nvarchar(100),
@NetworkRiskAssessmentQuestionsID nvarchar(100),
@answer varchar(max)
AS
BEGIN
DECLARE @XML AS XML
DECLARE @Delimiter AS CHAR(1) =','
SET @XML = CAST(('<X>'+REPLACE(@answer , @Delimiter ,'</X><X>')+'</X>') AS XML)
DECLARE @temp TABLE (Answer Varchar(max))
INSERT INTO @temp
SELECT N.value('.', 'Varchar(max)') AS Answer
FROM @XML.nodes('X') AS T(N)
INSERT INTO [dbo].[PatientRiskAssessmentQuestionsList](NetworkRiskAssessmentListID, PatientRiskAssessmentQuestionsID)
SELECT
[dbo].[fnc_GetNetworkRiskAssessmentList](LTRIM(RTRIM(q.Answer)), @NetworkRiskAssessmentQuestionsID, 'List') AS NetworkRiskAssessmentListID,
@PatientRiskAssessmentQuestionsID
FROM
(SELECT Answer FROM @temp) q
WHERE
NOT EXISTS (SELECT 1
FROM PatientRiskAssessmentQuestionsList x
WHERE x.NetworkRiskAssessmentListID = NetworkRiskAssessmentListID
AND x.PatientRiskAssessmentQuestionsID = @PatientRiskAssessmentQuestionsID);
END
这是PatientRiskAssessmentQuestionsList 表的结构
这是fnc_GetNetworkRiskAssessmentList的脚本
ALTER function [dbo].[fnc_GetNetworkRiskAssessmentList]
(@text varchar(max),
@networkriskquestionid bigint,
@type varchar(20)
)
RETURNS BIGINT
AS
BEGIN
declare @id bigint
declare @questionid bigint
declare @count int
set @id = null
set @questionid = null
set @count = 0
if(@type = 'List')
begin
select @count = Count(*)
from NetworkRiskAssessmentList mc
where mc.Answer = @text
and mc.NetworkRiskAssessmentQuestionsID = @networkriskquestionid
if @count > 0
begin
select top(1) @questionid = mc.NetworkRiskAssessmentListID
from NetworkRiskAssessmentList mc
where mc.Answer = @text
and mc.NetworkRiskAssessmentQuestionsID = @networkriskquestionid
set @id = @questionid
end
end
return @questionid
end
【问题讨论】:
-
[PatientRiskAssessmentQuestionsList] 表的结构是什么?
-
检查所有比较语句。您正在将
BIGINT与NVARCHAR进行比较? -
@Squirrel 不,脚本中没有比较语句。即使将存储过程参数类型更改为 bigint 也会引发该错误\
-
好,现在通过添加 fnc_GetNetworkRiskAssessmentList 的代码来更新问题。
-
能否把fnc_GetNetworkRiskAssessmentList的代码也发一下?
标签: sql-server stored-procedures