为什么我看到不正确的语法错误

时间:2014-10-17 19:23:19

标签: sql xml sql-server-2012

我有以下SQL查询,它在表中显示多个XML节点并显示:

SELECT
    PhysicianName = XC.value('(name)[1]', 'varchar(50)'),
    Gender = XC.value('(gender)[1]', 'varchar(50)'),
    LangSpoken = XLang.value('.', 'varchar(20)'),
    InsAccepted = XIns.value('.', 'varchar(50)')
FROM
    [MYDB].[dbo].[content]
CROSS APPLY
    CAST([content_html] AS XML).nodes('/root/Physicians') AS XT(XC)
CROSS APPLY
    XC.nodes('langAccept') AS XT2(XLang)
CROSS APPLY
    XC.nodes('insAccept') AS XT3(XIns)

我必须将content_html作为XML进行CAST,因为它是ntext格式。我收到以下错误:

  

第15行,第15行,第1行,第9行   关键字“AS”附近的语法不正确

如何解决错误

1 个答案:

答案 0 :(得分:2)

1)短期内,您可以替换

FROM
    [MYDB].[dbo].[content]
CROSS APPLY
    CAST([content_html] AS XML).nodes('/root/Physicians') AS XT(XC)

FROM ( 
    SELECT CAST(content_html AS XML) AS content_xml 
    FROM [MYDB].[dbo].[content] AS c
) AS x
CROSS APPLY x.content_xml.nodes('/root/Physicians') AS XT(XC)

2)或者您可以更改列content_html

的数据类型

怎么样?

CREATE TABLE dbo.MyTable (content_html NTEXT)
INSERT dbo.MyTable VALUES (N'<a>text</a>')
GO
ALTER TABLE dbo.MyTable ADD content_xml XML
GO
UPDATE dbo.MyTable SET content_xml = CONVERT(XML, content_html)
-- ALTER TABLE dbo.MyTable ADD content_xml XML NOT NULL -- Is mandatory column ?
GO
ALTER TABLE dbo.MyTable DROP COLUMN content_html;
EXEC sp_rename 'dbo.MyTable.content_xml', 'content_html', 'COLUMN'
GO
SELECT * FROM dbo.MyTable

或者

3)你可以添加一个持久的计算列

ALTER TABLE dbo.content
ADD content_xml AS ( CAST(content_html AS XML) ) PERSISTED

在最后一种情况下,缺点是存储与XML相同的数据所需的额外存储空间。

4)警告:如果同一位医生有2个或更多LangSpoken以及两个或更多InsAccepted,那么结果集将为每个人包含这些值的交叉连接。