0
1

Existe alguna forma para insertar etiquetas adicionales a campos property bag (que ya poseen estructura xml) directamente en la base de datos y no por medio de la aplicacion?

Cual sería esa forma si existe?

asked 23 May '13, 15:27

Danny%20Villalta's gravatar image

Danny Villalta
(suspended)
accept rate: 33%

edited 28 May '13, 13:54

Como insertar etiquetas adicionales? Te referís a modificar el XML de un registro? Siempre tendrías que respetar lo que se ha configurado en la aplicación para que Evolution lo entienda... ¿Estoy en lo correcto?

(23 May '13, 15:52) sabanito ♦♦ sabanito's gravatar image

Danny, marca la respuesta correcta porfa!

(27 May '13, 22:26) sabanito ♦♦ sabanito's gravatar image

RECOPILÉ ESTAS INSTRUCCIONES QUE SON MAS DIRECTAS PARA TRABAJAR CON CAMPOS XML.

begin transaction
select * from eor.tpp_tipos_puestos

------*Inserta Estructura Inicial XML si el campo no contiene nada
update eor.tpp_tipos_puestos
set tpp_property_bag_data = '<DocumentElement><TiposPuestos><Test>1</Test></TiposPuestos></DocumentElement>'

--*Lo anterior crea la siguiente estructura XML
--  <DocumentElement>
--      <TiposPuestos>
--          <Test>1</Test>
--      </TiposPuestos>
--  </DocumentElement>

------*Actualizo el valor asignado a la etiqueta(Nodo) Test previamente insertado
DECLARE @newValue varchar(50)
SELECT @newValue = 'NewValue'

UPDATE eor.tpp_tipos_puestos
SET tpp_property_bag_data.modify('replace value of (/DocumentElement/TiposPuestos/Test/text())[1] with sql:variable("@newValue")')

--*Resultaría Esto
--  <DocumentElement>
--      <TiposPuestos>
--          <Test>NewValue</Test>
--      </TiposPuestos>
--  </DocumentElement>

-----*Puedo Insertar nuevos nodos(Etiquetas XML) a un campo que ya contiene una estructura definida
DECLARE @NuevoNodo XML = '<NuevoNodo>Valor</NuevoNodo>'

UPDATE eor.tpp_tipos_puestos
SET tpp_property_bag_data.modify('insert sql:variable("@NuevoNodo") as last into (/DocumentElement/TiposPuestos)[1]')

--  <DocumentElement>
--    <TiposPuestos>
--      <Test>NewValue</Test>
--      <NuevoNodo>Valor</NuevoNodo>
--    </TiposPuestos>
--  </DocumentElement>

---------*Eliminar un nodo en una estructura existente
UPDATE eor.tpp_tipos_puestos
SET tpp_property_bag_data.modify('delete /DocumentElement/TiposPuestos/NuevoNodo')

--  <DocumentElement>
--      <TiposPuestos>
--          <Test>NewValue</Test>
--      </TiposPuestos>
--  </DocumentElement>

select * from eor.tpp_tipos_puestos
rollback transaction
link

answered 28 May '13, 13:52

Danny%20Villalta's gravatar image

Danny Villalta
(suspended)
accept rate: 33%

1

Esto se puede utilizar para verificar si existe un nodo dentro de un campo XML.

declare @var int = 0 if exists ( SELECT emp_codigo FROM exp.emp_empleos CROSS APPLY emp_property_bag_data.nodes('/DocumentElement/Empleos') as e(Loc) ) begin select @var = 1 end select @var

(30 May '13, 13:45) Danny Villalta Danny%20Villalta's gravatar image

Yo he utilizado la siguiente función que te coloco a continuación, estuve buscando utilizar las funciones de XML que provee SQL Server, pero me estaba dando problemas, por lo que al final, el procedimiento hace un simple REPLACE.

/*
Nombre: gen.set_pb_field_data
Descripción: Función para actualizar el valor de un campo en los campos adicionales de las entidades (property_bag_data)
Ejemplo: Si se desea actualiar el campo "esSuspendido", con el valor de 0 para los empleados se haría
         de la siguiente forma:
            UPDATE exp.emp_empleos
            SET emp_property_bag_data = gen.set_pb_field_data(emp_property_bag_data, 'Empleos', 'esSuspendido', 0)
*/
CREATE FUNCTION gen.set_pb_field_data (
    @xml XML,
    @entidad VARCHAR(50),
    @campo VARCHAR(50),
    @valor VARCHAR(50)
)

RETURNS XML

AS

BEGIN

DECLARE @valorAnterior VARCHAR(50),
    @texto VARCHAR(4000),
    @campoXmlAnterior VARCHAR(100), 
    @campoXmlNuevo VARCHAR(100),
    @estructuraXml VARCHAR(100),
    @indice INT

SET @texto = CONVERT(VARCHAR(4000), @xml)

SET @valorAnterior = gen.get_pb_field_data(@xml, @campo)

SET @campoXmlAnterior = '<' + @campo + '>' + ISNULL(@valorAnterior, '') + '</' + @campo + '>'
SET @campoXmlNuevo = '<' + @campo + '>' + ISNULL(@valor, '') + '</' + @campo + '>'

--Si existe el valor, solo se arma el elemento xml y se reemplaza
IF @valorAnterior IS NOT NULL
BEGIN   
    SET @texto = REPLACE(@texto, @campoXmlAnterior, @campoXmlNuevo)
END
-- Si no existe el valor, se agrega al final del xml, el elemento xml con el nuevo valor
ELSE
BEGIN
    SET @indice = CHARINDEX('</' + @entidad + '>', @texto)

    -- Si el índice es mayor a cero significa que ya esta creada la estructura básica del xml, por lo que solo se agrega
    -- sino se debe crear la estructura báscia del xml con el campo nuevo
    IF @indice > 0
        SET @texto = SUBSTRING(@texto, 1, @indice - 1) + @campoXmlNuevo + SUBSTRING(@texto, @indice, LEN(@texto) - @indice + 1)
    ELSE
        SET @texto = '<DocumentElement><' + @entidad + '>' + @campoXmlNuevo + '</' + @entidad + '></DocumentElement>' 
END

SET @xml = CONVERT(XML, @texto)

RETURN @xml

END

Si necesitas más detalle del funcionamiento de la función me decís

link

answered 23 May '13, 16:35

Carlos%20Soria's gravatar image

Carlos Soria ♦♦
1.2k129141148
accept rate: 60%

Aquí hay un link que explica como se manejan las columnas XML desde la base de datos SQL Server

Importing and processing data from XML files into SQL Server tables

Una búsqueda por Stackoverflow arroja los siguientes resultados:

stackoverflow

link

answered 23 May '13, 15:57

Fernando%20Paz's gravatar image

Fernando Paz ♦♦
17.3k81635
accept rate: 51%

Your answer
toggle preview

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *italic* or _italic_
  • **bold** or __bold__
  • link:[text](http://url.com/ "title")
  • image?![alt text](/path/img.jpg "title")
  • numbered list: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • basic HTML tags are also supported

Evolution en BitBucket

En este sitio puede acceder al código fuente, centro de descargas y reportar bugs, propuestas y mejoras para Evolution.

Evolution en JIRA

En este sitio puedes sugerir nueva funcionalidad para Evolution, o puedes votar por la funcionalidad ya propuesta por otros usuarios.

Tags:

×15
×5

Asked: 23 May '13, 15:27

Seen: 4,511 times

Last updated: 30 May '13, 13:45

[Acerca de] [Preguntas Frecuentes] [Privacidad] [Soporte] [Contacto]
Copyright 2013-2018. Asesores en Informática