2011-04-19 46 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