根據您發佈的代碼,您缺少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