2015-04-17 188 views
2

我想做一個查詢,我得到一些ID,然後用逗號分開,並將其放在我的where子句中。WHERE子句與STUFF函數

但會出現以下錯誤

消息245,級別16,狀態1,行轉換nvarchar的值「2998,2999,3000,3001,3002,3003,3004當10
轉換失敗, 3005,3006,3007,3008,3009,3010,3011,3012,3013,3482,3483,3484,3485,3486,3487,3488,3489,3490,3491,3492,3493,3494,3495,...

我嘗試了一些演員,但沒有奏效。

樣品查詢:

SELECT A.ID, A.ID_PERIODO_GESTAO, A.ID_FILIAL, A.ID_RESPONSAVEL_AREA, A.ID_PARENT, A.ID_SOURCE, A.COD_AREA, A.DESC_AREA, A.ATIVO, A.USER_LOGIN_RESP, A.NOME_RESP, A.DESC_FILIAL, A.COD_AREA_SUP, A.FOTO_PATH, 
A.COLABORADOR_ID, 
CASE WHEN (SELECT COUNT(B.ID_COLABORADOR) FROM COLABORADOR_AREA B WHERE B.ID_AREA = A.ID GROUP BY B.ID_AREA) IS NULL THEN 0 ELSE 
(SELECT COUNT(B.ID_COLABORADOR) FROM COLABORADOR_AREA B WHERE B.ID_AREA = A.ID GROUP BY B.ID_AREA) END AS QTD_COLABORADORES, 
A.LEVEL_TREE,LEN(A.LEVEL_TREE), 

STUFF(
      (SELECT ',' + CAST(VW.ID AS VARCHAR(10)) 
      FROM VW_AREA VW 
      WHERE LEN(VW.LEVEL_TREE) > LEN(A.LEVEL_TREE) 
      AND VW.ID_PERIODO_GESTAO = 2     
      FOR XML PATH('')), 1, 1, '') 

FROM VW_AREA A 
LEFT JOIN dbo.COLABORADOR_AREA ON dbo.COLABORADOR_AREA.ID_COLABORADOR = A.COLABORADOR_ID   
WHERE A.ID_FILIAL IN (9) AND A.ID_PERIODO_GESTAO = 2 

UNION 

SELECT A.ID, A.ID_PERIODO_GESTAO, A.ID_FILIAL, A.ID_RESPONSAVEL_AREA, A.ID_PARENT, A.ID_SOURCE, A.COD_AREA, A.DESC_AREA, A.ATIVO, A.USER_LOGIN_RESP, A.NOME_RESP, A.DESC_FILIAL, A.COD_AREA_SUP, A.FOTO_PATH, 
A.COLABORADOR_ID, 
CASE WHEN (SELECT COUNT(B.ID_COLABORADOR) FROM COLABORADOR_AREA B WHERE B.ID_AREA = A.ID GROUP BY B.ID_AREA) IS NULL THEN 0 ELSE 
(SELECT COUNT(B.ID_COLABORADOR) FROM COLABORADOR_AREA B WHERE B.ID_AREA = A.ID GROUP BY B.ID_AREA) END AS QTD_COLABORADORES, 
A.LEVEL_TREE, LEN(A.LEVEL_TREE), 

    STUFF(
      (SELECT ',' + CAST(VW.ID AS VARCHAR(10)) 
      FROM VW_AREA VW 
      WHERE LEN(VW.LEVEL_TREE) > LEN(A.LEVEL_TREE) 
      AND VW.ID_PERIODO_GESTAO = 2   
      FOR XML PATH('')), 1, 1, '') AS 

FROM VW_AREA A 
LEFT JOIN dbo.COLABORADOR_AREA ON dbo.COLABORADOR_AREA.ID_COLABORADOR = A.COLABORADOR_ID 
JOIN CTE4 ON A.ID = CTE4.ID_PARENT 
WHERE A.ID_PERIODO_GESTAO = 2 
AND (A.ID IN (CTE4.ID_PARENT)) 

結果

QTD_COLABORATOR LEVEL_TREE  QTD_CARACTER_IN_LEVEL_TREE 
1     002   3 

最後一列,用那東西的功能,將含有這樣的

2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008,3009,3010,3011,3012,3013,3014,3015,3016,3017

這是所有數據ID tha t在LEVEL_TREE中包含多於3個字符

+0

您能否向我們提供存儲在您的VW_AREA視圖中的ID的一些示例值? – FutbolFan

+0

您沒有最後一列的別名。 –

回答

3

這絕不會起作用。你試圖在一個字符串中使用一個比較器。因此,語法錯誤。有沒有理由不能這樣做?

SELECT SUM(A.ID) 
FROM COLABORATOR A 
WHERE A.ID IN (SELECT VW.ID FROM VW_AREA VW) 
+0

我更新了我的查詢,現在我可以告訴你這不是那麼簡單。 Unfortunelly。 –

+0

與最初的問題相比,更新後的SQL並沒有多大意義。它有一些明顯不相關的語法錯誤,並沒有顯示你最初描述的問題。你能重新檢查一下嗎? – Necreaux

0

嗨STUFF會讓你的價值觀逗號分隔,並且IN子句將期待一個結果集的int,所以它崩潰, 你也許可以用動態字符串執行這樣做:

SET @sqlCommand = 'SELECT ' + @columnList + ' FROM customers WHERE City = ' + @city 
EXEC (@sqlCommand)