SQL Server - Problemas al generar un XML en SQL Server

 
Vista:

Problemas al generar un XML en SQL Server

Publicado por izubal (6 intervenciones) el 08/10/2008 17:44:29
Hola,

Tengo un problema en SQL Server 2005.
Quiero pasar como parámetro una lista o array a una función y he seleccionado la opción de XML para ello. Pero al generar el XML (quiero que los datos se obtengan mediante parámetros) me da un error.
Error: "Los tipos de datos xml y varchar son incompatibles con el operador add."
Puede que sea una tonteria pero no tengo experiencia en XML y os agradecería que me ayudaseis.

Os explico mediante código:

1. Código que genera el XML:
set @datosmensaje = '<Orders>'
(entro en un fetch)
set @datosmensaje = @datosmensaje + '<Order DIRDPD=' + @Lista + ' MCK=' + @iClave + '></Order>'
(finalizo el fetch)
set @datosmensaje=@datosmensaje + '</Orders>'

--y llamo a la función pasandole el xml como función.
dbo.FORMATEAR_76(@sUsuario_IN,'1','1',@datosmensaje

2. Código que lee y utiliza el XML:
DECLARE @tablaLista TABLE (DIRDPD varchar(50), MCK varchar(8))
DECLARE cLista CURSOR FOR
SELECT DIRDPD,MCK
FROM @tablaLista

INSERT INTO @tablaLista (DIRDPD,MCK)
SELECT DIRDPD = T.Item.value('@DIRDPD', 'nchar(50)'),
MCK = T.Item.value('@MCK', 'nchar(50)')
FROM @Lista.nodes('Orders/Order') AS T(Item)

(y recorro esta tabla)

gracias de antemano.
Un saludo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Problemas al generar un XML en SQL Server

Publicado por Isaias (3308 intervenciones) el 08/10/2008 18:08:14
En lugar de tratar de resolver tu codigo, ¿porque no nos platicas que es lo que deseas hacer?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problemas al generar un XML en SQL Server

Publicado por izubal (6 intervenciones) el 08/10/2008 18:32:44
Ok, veo que no me he explicado muy bien, jejeje.

Quiero pasar un array de datos a una función, pero no existe el tipo array. Entonces he leido que se puede realizar usando XML.
Lo que necesito es crear un xml con el siguiente formato:

<Orders>
<Order DIRDPD="125" MCK="11"></Order>
<Order DIRDPD="126" MCK="12"></Order>
</Orders>

En este caso he introducido los valores a mano, pero quiero que sean unos parámetros que yo obtengo previamente mediante:

set @datosmensaje = '<Orders>'
(entro en un fetch)
set @datosmensaje = @datosmensaje + '<Order DIRDPD=' + @Lista + ' MCK=' + @iClave + '></Order>'
(finalizo el fetch)
set @datosmensaje=@datosmensaje + '</Orders>'

--y llamo a la función pasandole el xml como función.
dbo.FORMATEAR_76(@sUsuario_IN,'1','1',@datosmensaje

y aqui me da el error"Los tipos de datos xml y varchar son incompatibles con el operador add."

Gracias,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problemas al generar un XML en SQL Server

Publicado por Isaias (3308 intervenciones) el 08/10/2008 23:24:58
Te recomiendo leas el contenido de esta pagina:

http://www.sqlservercentral.com/articles/Advanced+Querying/thearrayinsqlserver2000/1886/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problemas al generar un XML en SQL Server

Publicado por izubal (6 intervenciones) el 09/10/2008 09:14:15
Hola,
Sigo sin encontrar la solución, no indica como pasar los parámetros.

He intentado también utilizar tablas temporales pero tampoco lo consigo.

1. Creo en un SP la tabla temporal (ley en un foro que tenía que ser global) y se lo paso a una función una vez rellenar con datos:
CREATE TABLE ##tLista (DIRDPD varchar(50), MCK varchar(8))
FORMATEAR_76(@sUsuario_IN,'1','1',##tLista)

2. La función que recibe la tabla temporal:
CREATE FUNCTION FORMATEAR_76_2
(@sUsuario varchar(10), @Estado varchar(50), @EstadoAfter varchar(50), @tablaLista sysname)

--Ley que las tablas temporales se deberían declarar como sysname, porque si pongo que es de tipo Table da error

Lo que quiero es recorrer esta tabla temporal. Lo he intentando con un cursor, pero creo que hago algo mal.

Gracias,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problemas al generar un XML en SQL Server

Publicado por izubal (6 intervenciones) el 09/10/2008 10:55:30
Hola Isaias,
He visto que en otro post ya has comentado como se puede pasar una tabla temporal como parámetro. Ese código es el siguiente:

CREATE TABLE ##MyTableGlobal..............

Para poder hacer de esta tabla temporal en otro store, debes utilizar query dinamico.

CREATE PROCEDURE usp_UtilizaTeporal
@MyTemporal SYSNAME
AS
BEGIN
DECLARE @SQLString NVARCHAR(1000)
SET @SQLString = 'SELECT * FROM '+@MyTemporal
EXECUTE sp_executesql @SQLString
END

Perfecto, pero yo necesito recorrerla, hacer un loop e ir cogiendo los datos y tratandolos. Una aproximación es la siguiente:

[FORMATEAR_76_2] (@sUsuario varchar(10), @tablaLista SYSNAME)
....
begin
SET ROWCOUNT 1
WHILE EXISTS(SELECT DIRDPD, MCK FROM @tablaLista))
BEGIN
SELECT @DirDPD=DIRDPD, @McKey=MCK FROM @tablaLista

y no se que hacer.

muchas gracias.
un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problemas al generar un XML en SQL Server

Publicado por Isaias (3308 intervenciones) el 09/10/2008 18:05:49
SQL Server, no esta preparado, ni fue diseñado (como muchos otros motores de bases de datos), para procesar REGISTRO-X-REGISTRO.

Ahora bien, ¿porque pasar el nombre de una tabla como parametro?, si ya conoces el nombre de la tabla, no lo pases como parametro.

¿Que tratamiento le vas a dar a los registros contenidos en tu tabla temporal?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problemas al generar un XML en SQL Server

Publicado por izubal (6 intervenciones) el 14/10/2008 09:09:42
HOla,

si que conozco de antemano el nombre de la tabla temporal, pero cuando le hago referencia desde la función me da el siguiente error: "No se puede tener acceso a tablas temporales desde funciones."

Así que he intentado otra cosa, pero que tampoco funciona. He intentado crear un cursor dinámicamente dentro de la función:

SELECT @SQLString = 'DECLARE cLineas INSENSITIVE CURSOR FOR ' +
'SELECT DIRDPD,MCK FROM ' + @tablaLista
EXEC sp_executesql @SQLString

luego leo los datos en un loop y creo con el formato que necesito un string que será devuelto al procedimiento que llama a esta función:

set @mensaje = @mensaje + '034' + '0010' + '12' + '00' + '000010' +REPLACE(CONVERT(nvarchar(8), GETDATE(), 108), ':', '') + right('00000000'+@McKey, 8) + '00'+ CAST(@iColorA as varchar)+CAST(@iSonidoA as varchar)+CAST(@iBotonA as varchar)+CAST(@iDisplayA as varchar)+ CAST(@iColorD as varchar)+CAST(@iSonidoD as varchar)+CAST(@iBotonD as varchar)+CAST(@iDisplayD as varchar)+ @DirDPD + '00011'

Pero me da el siguiente error al ejecutar el procedimiento que llama a esta función:
"Desde una función sólo se pueden ejecutar funciones y procedimientos almacenados extendidos."

no se como lo puedo hacer...

gracias,
un saludo,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problemas al generar un XML en SQL Server

Publicado por Isaias (3308 intervenciones) el 15/10/2008 02:45:57
No crees tablas temporales, crealas definitivas y despues le das DROP TABLE
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar