tabla leer extraer ejemplos datos convertir consulta campo atributos xml sql-server-2012

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:

  1. 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?

  2. En su consulta externa, envía el XML a VARCHAR(MAX) (por cierto, utilice siempre NVARCHAR en conexión con XML). De nuevo, obligará al motor a tratar este texto como texto y, por lo tanto, a escapar de él.

  3. 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 el text() del nodo text() y obtienes NULL , eso también está bien.

    do. Para algunas reglas, quiere marcar el elemento como NULL . Use XSINIL

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).