2014-10-30 57 views
-1

我得到了我的代码以下错误,当失败:转换为varchar值时错误转换转换为varchar值为int

转换失败“(CASE WHEN ROW_NUM =”数据类型为int

我在做什么错

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


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

EXEC SP_EXECUTESQL 
    @SQL 
+3

当然,在THEN之前缺少一个空格。 – 2014-10-30 14:26:46

+2

你需要在你的字符串连接中使用'CAST(@I AS VARCHAR(12))'。 – gotqn 2014-10-30 14:27:38

+0

我改变了代码为以下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)'; SET I = @ I + 1; END EXEC SP_EXECUTESQL SQL和获取跟随错误“Msg 156,Level 15,State 1,Line 1 关键字'CASE'附近的语法不正确。 – Var 2014-10-30 14:38:54

回答

0

试试这个:你需要Cast int to varchar并尝试执行SQL印制为ER ror探针

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 
+0

@ganesh_develkar我试着运行你的代码,我得到以下错误。 “(CASE WHEN ROW_NUM = 0 THEN problem ELSE NULL END) Msg 156,Level 15,State 1,Line 1 关键字'CASE'附近的语法错误 ” – Var 2014-10-30 14:51:28

+0

@Var粘贴错误 – 2014-10-30 14:51:56

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