2014-10-17 3 views
0

У меня есть следующий 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, потому что это формат ntext. Я получаю следующее сообщение об ошибке:

Msg 156, Level 15, State 1, Line 9
Incorrect syntax near the keyword 'AS'

Как устранить ошибку

+0

Какой SQL-вкус вы используете? – SolarBear

+0

Microsoft SQL Server 2012 – SearchForKnowledge

ответ

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, то набор результатов будет содержать для каждого человека перекрестное соединение этих значений.

+0

эй спасибо за ответ! Что ты предлагаешь? – SearchForKnowledge

+1

@SearchForKnowledge: Я бы выбрал # 2 (см. «Как?»). –

+0

Итак, вы предлагаете мне взять существующую таблицу и преобразовать столбец в xml и создать новую таблицу и использовать ее? – SearchForKnowledge

Смежные вопросы