根据您发布的代码,您缺少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
当然,在THEN之前缺少一个空格。 – 2014-10-30 14:26:46
你需要在你的字符串连接中使用'CAST(@I AS VARCHAR(12))'。 – gotqn 2014-10-30 14:27:38
我改变了代码为以下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