【问题标题】:"Error converting data type nvarchar to bigint" when executing a stored procedure执行存储过程时“将数据类型 nvarchar 转换为 bigint 时出错”
【发布时间】:2025-12-25 00:25:19
【问题描述】:

我正在尝试执行一个存储过程,该过程输入从查询中选择的 3 个参数。前 2 个存储过程参数应该是 intbigint,但 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] 表的结构是什么?
  • 检查所有比较语句。您正在将BIGINTNVARCHAR 进行比较?
  • @Squirrel 不,脚本中没有比较语句。即使将存储过程参数类型更改为 bigint 也会引发该错误\
  • 好,现在通过添加 fnc_GetNetworkRiskAssessmentList 的代码来更新问题。
  • 能否把fnc_GetNetworkRiskAssessmentList的代码也发一下?

标签: sql-server stored-procedures


【解决方案1】:

问题是您试图将字符串值推入列NetworkRiskAssessmentListID,实际上是BIGINT,因此SQL 不允许转换。

只是一个向您展示问题的示例代码

CREATE TABLE #Test
(
Patient BIGINT,
Network BIGINT
)

GO

DECLARE @Patient NVARCHAR(100)
DECLARE @Network NVARCHAR(100)

SET @Patient = '1234'
SET @Network = 'List'

INSERT INTO #Test VALUES (@Patient,@Network)

希望这有帮助,尝试更改表的数据类型并试一试。

【讨论】:

    【解决方案2】:

    也许您的数据包含 Enter 字符或 Tab 字符,因此请使用如下代码:

       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 cast(replace(replace(Answer, char(13), ''), char(10), '') as bigint) as Answer from @temp) q
            where not exists
            (
            select 1 from PatientRiskAssessmentQuestionsList x 
            where x.NetworkRiskAssessmentListID = NetworkRiskAssessmentListID and x.PatientRiskAssessmentQuestionsID = @PatientRiskAssessmentQuestionsID
            );
    

    【讨论】:

      【解决方案3】:

      您将PatientRiskAssessmentQuestionsID 值传递给@PatientRiskAssessmentQuestionsID nvarchar(100) 参数

      然后你在下一个代码中使用它

      select 1 from PatientRiskAssessmentQuestionsList x 
              where x.NetworkRiskAssessmentListID = NetworkRiskAssessmentListID 
              and x.PatientRiskAssessmentQuestionsID = @PatientRiskAssessmentQuestionsID
      

      所以AND 条件中的问题在这里

      and x.PatientRiskAssessmentQuestionsID = 'PatientRiskAssessmentQuestionsID'
      

      x.PatientRiskAssessmentQuestionsID 是 bigint

      而@PatientRiskAssessmentQuestionsID 是nvarchar (100)

      它的价值 [PatientRiskAssessmentQuestionsID]

      所以修复这个,一切都会好起来的。

      【讨论】:

      • 如何进行比较,因为我无法将 nvarchar 转换为 bigint 类型。
      最近更新 更多