Dubbi su FOR XML RAW e FOR XML EXPLICIT

mercoledì 20 giugno 2012 - 11.38
Tag Elenco Tags  SQL Server 2008 R2

stena Profilo | Junior Member

Ho la seguente tabella di esempio:
declare @tabledocu table(Tab1 varchar(37), Tab2 varchar(37), Tab3 ntext)
insert into @tabledocu(Tab1, Tab2, Tab3) values('1','2','3')

perche` se eseguo:

SELECT 1 AS Tag, NULL AS Parent,
(SELECT 2 as 'contenuto' FROM @tabledocu FOR XML RAW('elemento'), ELEMENTS) AS [nodo!1!!CDATA]
FOR XML EXPLICIT

SELECT
(
SELECT Tab1 AS id FROM @tabledocu WHERE Tab2 = '2'
FOR XML RAW ('template'),TYPE
)
FOR XML RAW ('templates'),type

ottengo:
<nodo><![CDATA[<elemento><contenuto>2</contenuto></elemento>]]></nodo>
e
<templates><template id="1" /></templates>

Mentre se le unisco ed eseguo
SELECT
(
SELECT Tab1 AS id,
(SELECT 1 AS Tag, NULL AS Parent,
(SELECT 2 as 'contenuto' FROM @tabledocu FOR XML RAW('elemento'), ELEMENTS)
AS [nodo!1!!CDATA] FOR XML EXPLICIT)
FROM @tabledocu WHERE Tab2 = '2'
FOR XML RAW ('template'),TYPE
)
FOR XML RAW ('templates'),type

ottengo il seguente errore ?
Unnamed tables cannot be used as XML identifiers as well as unnamed columns cannot be used for attribute names. Name unnamed columns/tables using AS in the SELECT statement.

Grazie per i possibili chiarimenti

alx_81 Profilo | Guru

Ciao
>Mentre se le unisco ed eseguo
>ottengo il seguente errore ?
>Unnamed tables cannot be used as XML identifiers as well as unnamed
>columns cannot be used for attribute names. Name unnamed columns/tables
>using AS in the SELECT statement.
L'errore sembra piuttosto parlante. Ora, non potendo provare nulla visto che non ci hai passato le CREATE TABLE ed alcuni dati di esempio, non so dirti con certezza se la correzione funziona, ma a mio avviso devi mettere AS mancanti, uno per ognuno dei campi che non indichi. Senza l'alias la query non funziona.
Puoi postare l'esempio comprensivo di dati e strutture? Così possiamo provarlo anche noi.

>Grazie per i possibili chiarimenti
di nulla!

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.microsoft.com/profiles/Alessandro.Alpi

stena Profilo | Junior Member

Le tabelle di esempio erano ad inizio post.
Mi sembra che il FOR XML EXPLICIT non funzioni all'interno di un FOR XML RAW

CASO A funziona
declare @tabledocu table(Tab1 varchar(37), Tab2 varchar(37), Tab3 ntext)
insert into @tabledocu(Tab1, Tab2, Tab3) values('1','2','3')
SELECT 1 AS Tag, NULL AS Parent,
(SELECT 2 as 'contenuto' FROM @tabledocu FOR XML RAW('elemento'), ELEMENTS) AS [nodo!1!!CDATA]
FOR XML EXPLICIT

SELECT
(
SELECT Tab1 AS id FROM @tabledocu WHERE Tab2 = '2'
FOR XML RAW ('template'),TYPE
)
FOR XML RAW ('templates'),type

<nodo><![CDATA[<elemento><contenuto>2</contenuto></elemento>]]></nodo>
<templates><template id="1" /></templates>

CASO B non funziona
declare @tabledocu table(Tab1 varchar(37), Tab2 varchar(37), Tab3 ntext)
insert into @tabledocu(Tab1, Tab2, Tab3) values('1','2','3')
SELECT
(
SELECT Tab1 AS id,
(SELECT 1 AS Tag, NULL AS Parent,
(SELECT 2 as 'contenuto' FROM @tabledocu FOR XML RAW('elemento'), ELEMENTS)
AS [nodo!1!!CDATA] FOR XML EXPLICIT)
FROM @tabledocu WHERE Tab2 = '2'
FOR XML RAW ('template'),TYPE
)
FOR XML RAW ('templates'),type

alx_81 Profilo | Guru

>Le tabelle di esempio erano ad inizio post.
Hai perfettamente ragione, scusami.
ecco la soluzione, vedi "MANCAVA":

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.microsoft.com/profiles/Alessandro.Alpi

stena Profilo | Junior Member

Ottimo. Grazie mille.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5