2011-04-19 25 views
0

我想從下面的全文搜索索引表中獲得xml輸出。但我的代碼產生近工會 我的代碼不正確的語法從Sql Server Express 2005中檢索結構化的XML

SELECT 
Table1.Name 'Table1/Name', 
Table1.Email 'Table1/Email', 
( SELECT 
    Table2.Address 'Address', 
    Table2.Phone 'Phone', 
    FROM Details Table2 
    INNER JOIN Regd Table3 ON Table3.Code = Table2.Code 
    AND (Table3.SubCode = xml.SubCode) AND (Table1.Id = Table3.Id) 
    FOR XML PATH ('Details'),Type) as 'Table1', 
FROM Users Table1 
INNER JOIN CONTAINSTABLE(Users,[Name], @SearchKeys) AS KEY_TBL ON Id = KEY_TBL.[KEY] 
INNER JOIN Regd Table3 ON Table3.Id = Table1.Id, 
OPENXML (@idoc,'/Request/List',2) 
WITH (SubCode NVARCHAR(20)) as xml 
WHERE (xml.SubCode = '' or Table3.SubCode = xml.SubCode) AND (Table3.Id = Table1.Id) 
FOR XML PATH ('List') 
UNION 
SELECT 
SELECT 
Table1.Name 'Table1/Name', 
Table1.Email 'Table1/Email', 
( SELECT 
    Table2.Address 'Address', 
    Table2.Phone 'Phone', 
    FROM Details Table2 
    INNER JOIN Regd Table3 ON Table3.Code = Table2.Code 
    AND (Table3.SubCode = xml.SubCode) AND (Table1.Id = Table3.Id) 
    FOR XML PATH ('Details'),Type) as 'Table1', 
FROM Users Table1 
INNER JOIN CONTAINSTABLE(Users,[Email], @SearchKeys) AS KEY_TBL ON Id = KEY_TBL.[KEY] 
INNER JOIN Regd Table3 ON Table3.Id = Table1.Id, 
OPENXML (@idoc,'/Request/List',2) 
WITH (SubCode NVARCHAR(20)) as xml 
WHERE (xml.SubCode = '' or Table3.SubCode = xml.SubCode) AND (Table3.Id = Table1.Id) 
FOR XML PATH ('List') 

這裏出來把我預計將有

<List> 
<Table1> 
<Name></Name> 
<Email></Email> 
<Details> 
<Address></Address> 
<Phone></Phone> 
</Details> 
</Table1> 
</List> 

我想請求XML參數不會有任何用處的這裏,因爲它是隻是一個語法錯誤

+3

你可以**解釋一下你想做什麼?你只是向我們扔了一個龐大複雜的SQL語句,沒有背景,沒有關於涉及的表的信息,它們的結構,它們的數據等。是你在兩個地方使用的@ idoc ......這些數據是如何填充的?你可能**可以將這個簡化爲一個'SELECT',而現在就省略'UNION'部分!?!? – 2011-04-19 12:20:57

回答

1

你的代碼中有很多語法錯誤,但我認爲他們在那裏,因爲你已經刪除了很多你認爲沒有必要的東西。

你說你得到的錯誤是Incorrect syntax near the keyword 'union'

這會給你的錯誤,

select * 
from YourTable 
for xml path('list') 
union 
select * 
from YourTable 
for xml path('list') 

你必須嵌入查詢,在這樣的select語句。

select 
(select * 
from YourTable 
for xml path('list')) 
union 
select 
(select * 
from YourTable 
for xml path('list')) 

如果你想要的列是XML類型的,你需要添加type和使用union all因爲The xml data type cannot be selected as DISTINCT because it is not comparable.

select 
(select * 
from YourTable 
for xml path('list'), type) 
union all 
select 
(select * 
from YourTable 
for xml path('list'), type) 

我不知道,如果這最終會給你你想要的輸出,但此是Incorrect syntax near the keyword 'union'的原因以及您可以對此做些什麼。

+0

+1爲解釋爲什麼要做些事情可以解決問題 – Deeptechtons 2011-04-20 04:41:08

+0

警報,我如何使它佔據列的空值它不會生成一個空'

'xml元素當'地址','電話'元素爲空/空 – Deeptechtons 2011-04-20 09:28:18

+0

@Deeptechtons - 我認爲你必須提出一個新的問題,包括一些示例代碼和預期輸出。當我用'null'值測試時,我得到一個空的Details標籤,看起來像這樣'

' – 2011-04-20 09:52:14