2017-07-27 38 views
-1

任何人都可以看到我在做什麼錯誤的語法是越來越語法STUFF/FOR XML PATH

消息156,級別15,狀態1,行 'FOR' 關鍵字近33
不正確的語法。

我歸結我的可讀性查詢和我仍然得到錯誤以各種方式我試圖執行它:

SELECT 
    STUFF((SELECT * 
      FROM 
       (SELECT N',' + N'first' 
       UNION 
       SELECT N',' + N'second') 
      FOR XML PATH('')), 1, 1, '') 

也試過:

SELECT 
    STUFF((SELECT * 
      FROM 
       (SELECT N',' + N'first' 
       UNION 
       SELECT N',' + N'second')) 
      FOR XML PATH(''), 1, 1, '') 

對於而我越來越

FOR XML子句在視圖,內聯函數,de rived表和子查詢,當它們包含set操作符時。要解決此問題,請使用派生表語法將包含集合運算符的SELECT包裝起來,並在其上應用FOR XML。

但修改代碼爲每ExactHelp's post

UPDATE

基於從@NenadZivkovic答案,我想出了其做了什麼,我一直在尋找做到以下幾點:

WITH CTE_perca_categories AS 
(
    SELECT 
     category = STUFF((SELECT ', ' + category 
          FROM perca_categories 
          FOR XML PATH('')), 1, 2, '') 
) , CTE_perca_tags AS 
(
    SELECT tag = (SELECT ', ' + tag from perca_tags FOR XML PATH('')) 
) 
SELECT 
    CONCAT((SELECT * FROM CTE_perca_categories), 
      (SELECT * FROM CTE_perca_tags)) 

輸出(其中標籤開始,「食品」):

Charitable Giving, Nondiscretionary Spending, Saving, Discretionary Spending, Food, Dining, Groceries, Bills 
+1

你從頭開始寫這篇文章?記憶?有數百篇博客文章和答案以及這種語法的工作示例。爲什麼不採取其中一個並適應它? –

回答

1

您的錯誤與STUFFFOR XML都沒有關係。這只是從子查詢中選擇的語法錯誤。

SELECT * FROM (SELECT N',' + N'first' UNION SELECT N',' + N'second') 

你需要給別名查詢:

SELECT * FROM (SELECT N',' + N'first' UNION SELECT N',' + N'second') AS x 

後,你會得到你需要命名的「X」的第1列的錯誤,所以你應該補充的是別名好。

SELECT * FROM (SELECT N',' + N'first' as Col1 UNION SELECT N',' + N'second') x 

你的整個查詢會是這個樣子的:

SELECT STUFF((SELECT * FROM 
(SELECT N',' + N'first' AS Col1 UNION SELECT N',' + N'second') AS x FOR XML PATH('')), 1, 1, '') 

它的工作,但我敢肯定它給出的結果是不是正是你所期待的。

(No column name) 
-------------------------------------- 
Col1>,first</Col1><Col1>,second</Col1> 

你可能想要連接你的子查詢中的字符串? 這應該是這個樣子:

WITH CTE_Source AS 
(
    SELECT N',' + N'first' AS Col1 UNION SELECT N',' + N'second' 
) 
SELECT DISTINCT STUFF 
(
    (SELECT '' + Col1 FROM CTE_Source FOR XML PATH ('')), 1, 1, '' 
) 
FROM CTE_Source 

獲得:

(No column name) 
--------------- 
first,second 
+0

你的回答幫了我很多,謝謝。查看我的最新動態。 –

1

這裏是討論它的微軟文檔。

https://docs.microsoft.com/en-us/sql/t-sql/functions/stuff-transact-sql

所以,問題是:

是下列有效一個character_expression?

(SELECT * FROM (SELECT N',' + N'first' UNION SELECT N',' + N'second') FOR XML PATH('')) 

的一個character_expression必須評估以獲得單個數據值。

For XML - SQL Server

FOR XML子句可以在頂級查詢和子查詢中使用。頂級FOR XML子句只能在SELECT語句中使用。在子查詢中,可以在INSERT,UPDATE和DELETE語句中使用FOR XML。它也可以用在賦值語句中。

+0

雖然這個鏈接可能回答這個問題,但最好在這裏包含答案的重要部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/ review/low-quality-posts/16853635) –

1

你也可以改變你的查詢

select stuff(
    (select ','+a from 
     (SELECT 'first' a UNION ALL 
     SELECT 'second') ttt 
    FOR XML PATH('') 
),1,1,'') b; 

由於內納德指出,重要的是子查詢的列一個名稱,並且for XML path子句的連接列確實是而不是有一個列名。