leer - SQL Server 2012: datos jerárquicos XML: caracteres de escape
xml sql server ejemplos (1)
Estoy tratando de crear salida de formato XML a partir de los datos jerárquicos a continuación. En la salida veo caracteres de escape (<, ",> reemplazados por caracteres de escape).
Debajo de los datos de prueba tiene create / insert / function y select statement.
La ejecución de la instrucción select reproducirá el problema en la salida.
¿Puede alguien por favor sugerirme cómo abordar los personajes de escape?
CREATE TABLE meas_loc (enty_key bigint,mi_check_pt_rout_key_n bigint,mi_check_pt_pred_key_n bigint,MI_MEAS_LOC_SEQ_N FLOAT);
CREATE TABLE chkp_cond (enty_key bigint,mi_chkpcond_rout_key_n bigint,mi_chkpcond_pred_key_n bigint,MI_CHKPCOND_SEQ_NUM_N FLOAT) ;
INSERT INTO meas_loc (enty_key,mi_check_pt_rout_key_n,mi_check_pt_pred_key_n,MI_MEAS_LOC_SEQ_N) VALUES (64251803159,64251705940,64251705940,1);
INSERT INTO meas_loc (enty_key,mi_check_pt_rout_key_n,mi_check_pt_pred_key_n,MI_MEAS_LOC_SEQ_N) VALUES (64251802979,64251705940,64251705940,2);
INSERT INTO meas_loc (enty_key,mi_check_pt_rout_key_n,mi_check_pt_pred_key_n,MI_MEAS_LOC_SEQ_N) VALUES (64251802983,64251705940,64251705940,3);
INSERT INTO chkp_cond (enty_key,mi_chkpcond_rout_key_n,mi_chkpcond_pred_key_n,MI_CHKPCOND_SEQ_NUM_N) VALUES (64252166584,64251705940,64251802983,1);
INSERT INTO meas_loc (enty_key,mi_check_pt_rout_key_n,mi_check_pt_pred_key_n,MI_MEAS_LOC_SEQ_N) VALUES (64252166585,64251705940,64252166584,1);
create table lubr_chkp (enty_key bigint, rounte_key bigint, parent_key bigint, enty_seq float, chkp_cond nvarchar(6))
;with t as (
select enty_key,mi_check_pt_rout_key_n rounte_key,mi_check_pt_pred_key_n parent_key,MI_MEAS_LOC_SEQ_N enty_seq, ''true'' chkp_cond
from meas_loc
union all
select enty_key,mi_chkpcond_rout_key_n rounte_key,mi_chkpcond_pred_key_n parent_key,MI_CHKPCOND_SEQ_NUM_N enty_seq, ''false'' chkp_cond
from chkp_cond
)
insert into lubr_chkp (enty_key , rounte_key , parent_key , enty_seq, chkp_cond )
select enty_key , rounte_key , parent_key , enty_seq, chkp_cond from t
go
drop function SelectChild
go
CREATE function SelectChild(@key as bigint)
returns xml
begin
return (
select
CONVERT(varchar(100), CAST(enty_seq AS float)) as "@SeqNum",
enty_key as "@EntityKey",
chkp_cond as "@IsCheckpoint",
isnull(CONVERT(varchar(max), cast(dbo.SelectChild(enty_key) as xml)),''null'')as "@ListDirectChildren"
from lubr_chkp
where parent_key = @key
order by enty_seq
for xml path(''entity''), type
)
end
go
WITH PrepareTable (XMLString)AS(SELECT
CONVERT(varchar(100), CAST(enty_seq AS float)) as SeqNum
,enty_key AS EntityKey
,chkp_cond as IsCheckpoint
,isnull(CONVERT(varchar(max), cast(dbo.SelectChild(enty_key) as xml)),''null'')as ListDirectChildren
FROM lubr_chkp
WHERE parent_key = 64251705940
order by enty_seq FOR XML RAW,TYPE,ELEMENTS)SELECT [XMLString]FROM[PrepareTable]
Tus problemas:
Intenta usar el resultado de
SelectChild
, que es de tipo XML, como el contenido del atributo@ListDirectChildren
. No puede usar XML en este lugar, por lo tanto, se maneja (y escapa) como texto normal. ¿Estás intentando crear una especie de lista infantil recursiva?En su consulta externa, envía el XML a
VARCHAR(MAX)
(por cierto, utilice siempreNVARCHAR
en conexión con XML). De nuevo, obligará al motor a tratar este texto como texto y, por lo tanto, a escapar de él.Intenta agregar la cadena "nulo" para expresar la falta de un valor. Pero XML funciona de manera diferente: a. El elemento falta completamente en el XML: consultarlo devolverá
NULL
, está bien.segundo. Para algunas reglas, el Elemento debe estar allí, pero debe estar vacío:
<ListDirectChildren></ListDirectChildren>
o<ListDirectChildren />
(lo que significa exactamente lo mismo). Consulta eltext()
del nodotext()
y obtienesNULL
, eso también está bien.do. Para algunas reglas, quiere marcar el elemento como
NULL
. UseXSINIL
Prueba esto para ver variaciones de empty
y null
:
DECLARE @x XML=
''<root>
<testempty1 />
<testempty2></testempty2>
</root>'';
SELECT @x.value(''(/root/testempty1)[1]'',''nvarchar(max)'') AS testempty1_Content
,@x.value(''(/root/testempty1/text())[1]'',''nvarchar(max)'') AS testempty1_Text
,@x.value(''(/root/testempty2)[1]'',''nvarchar(max)'') AS testempty2_Content
,@x.value(''(/root/testempty2/text())[1]'',''nvarchar(max)'') AS testempty2_Text
,@x.value(''(/root/NotExistingElement)[1]'',''nvarchar(max)'') AS NotExistingElement_Content
,@x.value(''(/root/NotExistingElement/text())[1]'',''nvarchar(max)'') AS NotExistingElement_Text
El resultado:
Content Text
testempty1 "" NULL
testempty2 "" NULL
NotExistingElement NULL NULL
Prueba esto para XSINIL
SELECT NULL AS test FOR XML RAW, ELEMENTS XSINIL
para obtener esto
<row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<test xsi:nil="true" />
</row>
Mi sugerencia:
Esta pregunta
¿Puede alguien por favor sugerirme cómo abordar los personajes de escape?
está ojalá resuelto. Comience una nueva pregunta en la que agregue más datos a su escenario de muestra para reflejar varios niños, coloque un enlace a esta pregunta y establezca el resultado esperado (cómo debería verse el XML).