【问题标题】:SQL Query conversion nvarchar to data type int got error in stored procedureSQL Query 将 nvarchar 转换为数据类型 int 在存储过程中出错
【发布时间】:2015-09-21 04:08:09
【问题描述】:

我对此有疑问,我不知道为什么我在存储过程中使用它时总是收到此错误。

转换 nvarchar 值时转换失败 '3,25,26,27,28,33,34' 转换为 int 数据类型。

这是我使用的查询。

@idList nvarchar(max)

@idList='3,25,26,27,28,33,34'

update tSpecScaleValidation set LastTriggeredTime=getdate() where id in (@idList)

但是,当我在不使用存储过程的情况下进行更新时,它工作正常。

【问题讨论】:

    标签: sql-server stored-procedures


    【解决方案1】:

    问题是变量@idList='3,25,26,27,28,33,34' 被整体转换为int。它没有像你想象的那样转换。你不能直接这样做。解决方法是使用动态查询:

    declare @sql nvarchar(2000)
    set @sql = 'udate tSpecScaleValidation set LastTriggeredTime=getdate() where id in (' + @idList + ')'
    exec(@sql)
    

    小心sql注入!坏消息是你不能参数化这个查询,所以如果你从客户端传递一些带有变量@idList的数据时要小心。

    【讨论】:

      【解决方案2】:

      因为@idListNVARCHAR 并且WHERE 子句被评估为 id = '3,25,26,27,28,33,34'。由于idINT 并且higher data type precedenceNVARCHAR'3,25,26,27,28,33,34' 被转换为INT,然后导致错误:

      转换 nvarchar 值时转换失败 '3,25,26,27,28,33,34' 转换为 int 数据类型。

      另一种方法是使用动态 sql:

      declare @sql nvarchar(max) 
      set @sql= N'update tSpecScaleValidation set LastTriggeredTime = getdate() where id in (' + @idList + ');'
      
      exec(@sql)
      

      或使用 CSV 拆分器。这是来自 Aaron Bertrand 的article

      CREATE FUNCTION dbo.SplitStrings_XML
      (
         @List       NVARCHAR(MAX),
         @Delimiter  NVARCHAR(255)
      )
      RETURNS TABLE
      WITH SCHEMABINDING
      AS
         RETURN 
         (  
            SELECT Item = y.i.value('(./text())[1]', 'nvarchar(4000)')
            FROM 
            ( 
              SELECT x = CONVERT(XML, '<i>' 
                + REPLACE(@List, @Delimiter, '</i><i>') 
                + '</i>').query('.')
            ) AS a CROSS APPLY x.nodes('i') AS y(i)
         );
      

      并在您的 UPDATE 声明中使用它

      update tSpecScaleValidation 
          set LastTriggeredTime=getdate() 
      where id in (
          select item
          from dbo.SplitStrings_XML(@idList, ',')
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-14
        • 2016-03-14
        • 1970-01-01
        • 1970-01-01
        • 2015-02-15
        • 2018-04-06
        • 2015-03-14
        • 2015-12-24
        相关资源
        最近更新 更多