【问题标题】:error Conversion failed when converting the varchar value to int将 varchar 值转换为 int 时出现错误转换失败
【发布时间】:2014-10-30 14:23:37
【问题描述】:

我的代码出现以下错误:

转换 varchar 值时转换失败 '(CASE WHEN ROW_NUM = ' 到数据类型 int。

我做错了什么?

DECLARE @N          INT = 6, 
        @I          INT = 0, 
        @SQL        NVARCHAR(MAX) 


BEGIN
 SET @SQL = '(CASE WHEN ROW_NUM = '+@I+'THEN problem ELSE NULL END) ';
 SET @I = @I+1;
END

EXEC SP_EXECUTESQL 
  @SQL 

【问题讨论】:

  • THEN 之前肯定少了一个空格。
  • 你需要在你的字符串连接中做CAST(@I AS VARCHAR(12))
  • 我将代码更改为以下 DECLARE @N INT = 6, I INT = 0, SQL NVARCHAR(MAX) BEGIN SET SQL = '(CASE WHEN ROW_NUM = '+CAST(@I AS VARCHAR (12))+'THEN DX_NAME ELSE NULL END)';设置我 = @I+1; END EXEC SP_EXECUTESQL SQL 并出现以下错误“消息 156,级别 15,状态 1,第 1 行关键字'CASE'附近的语法不正确。”
  • @vdohnal 我在 THEN 之前添加了空格但同样的错误......
  • @Var 请用新代码编辑问题。

标签: sql sql-server tsql int varchar


【解决方案1】:

仅根据您发布的代码,您缺少 SELECT 语句和 FROM 子句。您还假设您有一个名为 ROW_NUM 的列和一个名为 problem 的列:

DECLARE @N          INT = 6, 
        @I          INT = 0, 
        @SQL        NVARCHAR(MAX) 


BEGIN

  SET @SQL = 'SELECT CASE WHEN ROW_NUM = '+CAST(@I as VARCHAR(10))+' 
  THEN problem ELSE NULL END FROM MyTable';
 SET @I = @I+1;

END
print @SQL
EXEC SP_EXECUTESQL @SQL 

但是,您似乎也在尝试执行 WHILE 循环而不实际定义 WHILE,您可以这样做:

DECLARE @N          INT = 6, 
        @I          INT = 0, 
        @SQL        NVARCHAR(MAX) 

WHILE @I <= @N   -- new code

 BEGIN
  SET @SQL = 'SELECT CASE WHEN ROW_NUM = '+CAST(@I as VARCHAR(10))+' THEN problem ELSE NULL END FROM MyTable';
  SET @I = @I+1;
  PRINT @SQL
  EXEC SP_EXECUTESQL @SQL 
 END

我认为您实际上正在寻找这样的东西:

SELECT 'Problem', *
FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY ROW_NUM) rn FROM MyTable) s
WHERE rn <> ROW_NUM

带有虚拟数据的示例:

DECLARE @MyTable TABLE (ROW_NUM INT, SomeData VARCHAR(5))
INSERT INTO @MyTable (ROW_NUM, SomeData) VALUES (1, 'foo')
INSERT INTO @MyTable (ROW_NUM, SomeData) VALUES (2, 'zip')
INSERT INTO @MyTable (ROW_NUM, SomeData) VALUES (3, 'yak')
INSERT INTO @MyTable (ROW_NUM, SomeData) VALUES (5, 'lop')
INSERT INTO @MyTable (ROW_NUM, SomeData) VALUES (6, 'cow')
INSERT INTO @MyTable (ROW_NUM, SomeData) VALUES (7, 'moo')


SELECT 'Problem', *
FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY ROW_NUM) rn FROM @MyTable) s
WHERE rn <> ROW_NUM

【讨论】:

    【解决方案2】:

    试试这个:您需要Cast int to varchar 并尝试执行打印的 SQL 以查找错误探测

    DECLARE @N          INT = 6, 
            @I          INT = 0, 
            @SQL        NVARCHAR(MAX) 
    
    
    BEGIN
    
      SET @SQL = '(CASE WHEN ROW_NUM = '+CAST(@I as VARCHAR(10))+' 
      THEN problem ELSE NULL END) ';
     SET @I = @I+1;
    END
    print @SQL
    EXEC SP_EXECUTESQL @SQL 
    

    【讨论】:

    • @ganesh_develkar 我尝试运行您的代码,但出现以下错误。 "(CASE WHEN ROW_NUM = 0 THEN problem ELSE NULL END) Msg 156, Level 15, State 1, Line 1 关键字'CASE'附近的语法错误。”
    猜你喜欢
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    相关资源
    最近更新 更多