【问题标题】:Conversion failed when converting the nvarchar value to int将 nvarchar 值转换为 int 时转换失败
【发布时间】:2011-01-09 22:00:15
【问题描述】:

声明@count nvarchar(max)

set @count ='select COUNT(*) from '+ @tablename+''

if( @count =0 )
begin 
  print 'fail'
end
else
begin
  print 'success'
end
end

@count 变量没有得到值 0。它显示错误为

将 nvarchar 值 'select COUNT(*) from tablename' 转换为数据类型 int 时转换失败。

【问题讨论】:

  • 这不起作用,因为@COUNT 是具有值SELECT COUNT(*) FROM xxxx 的varchar,它不是一个有效的数字:)。使用答案中描述的动态 SQL。

标签: sql-server stored-procedures


【解决方案1】:
DECLARE @Count INTEGER
DECLARE @nSQL NVARCHAR(1000)
SET @nSQL = 'SELECT @Count = COUNT(*) FROM ' + @tablename
EXECUTE sp_executesql @nSQL, N'@Count INTEGER OUT', @Count OUT

-- Now check @Count

当您打开自己的 sql 注入时,请格外小心这样的动态 sql。因此,请确保 @tablename 已清理。

在尝试动态查询之前,通过使用参数化查询确保表存在,以确保安全:

DECLARE @Count INTEGER
DECLARE @nSQL NVARCHAR(1000)
SET @nSQL = 'IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME=@TableName) 
    SELECT @Count = COUNT(*) FROM ' + @tablename + '
ELSE
    SELECT @Count = -1'

EXECUTE sp_executesql @nSQL, N'@TableName NVARCHAR(128), @Count INTEGER OUT', @TableName, @Count OUT

如果@Count 然后出现在-1,你知道这是因为表名无效

编辑:
对 sp_executesql 的引用是here

【讨论】:

    【解决方案2】:

    这应该可行:

    DECLARE @SQLString nvarchar(500);
    DECLARE @ParmDefinition nvarchar(500);
    DECLARE @count int
    
    SET @SQLString = N'SELECT @CountOUT = COUNT(*) FROM ' + @tablename;
    SET @ParmDefinition = N'@CountOUT int OUTPUT';
    
    EXECUTE sp_executesql @SQLString, @ParmDefinition, @CountOUT=@count OUTPUT;
    
    SELECT @count;
    

    【讨论】:

    • 但是你能告诉我这两行吗? '输出' SET @ParmDefinition = N'@CountOUT int OUTPUT';和@CountOUT=@count 输出;
    • sp_executesql 接受参数列表,这在此处的变量@ParmDefinition 中定义。输出表示如果在查询中“填充”了数据并且可以在查询完成时使用的变量。
    【解决方案3】:

    查看 Erland 在Dynamic SQL 上的标准文章。你也是Data Type Precedences的“受害者”

    【讨论】:

      【解决方案4】:

      尝试将@count 声明为int

      DECLARE @count AS INT
      SELECT @count = COUNT(*) FROM YourTable
      

      问题是如果你这样做了

      SELECT @countAsString = 'SELECT ...'
      

      那么@countAsString(作为一个字符串)将不会保存查询的结果,而是字符串本身。

      使用EXEC 实际执行动态创建的查询。

      【讨论】:

      • 是的,我已经尝试过了,同样的问题我在将 varchar 值转换为数据类型 int 时遇到转换失败
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-17
      • 2011-08-29
      • 2015-06-20
      • 2016-02-02
      • 1970-01-01
      相关资源
      最近更新 更多