Debe estar conectado para participar
Buscar en los foros:


 






Uso de Comodín:
*    coincide cualquier número de caracteres
%    coincide exactamente un caracter

Pregunta noob de T-SQL

No hay Etiquetas
Entrada
Hardcore Extreme Level

Ukyo

.

entradas: 4393

12:39 06/02/2009

1

Gente:

Una pregunta media mongui de principiante.

Estoy armando un trigger en MS SQL 2005 , y tengo una query que me devuelve algo como lo siguiente:

Código:
MAIL
----------------------------------
fulano@sarasa.com
mengano@sarasa.com
tuvieja@sarasa.com
y así hasta 8 líneas

Necesito meter esos mails en una variable, para pasarselos al stored procedure de database mail y enviar un correo a toda la gente que salta en la query.

El tema es que (lógicamente) cuando intento asignar la query a una variable onda SET @mailinglist = (query), me manda (nuevamente lógicamente) a freír churros ya que la variable no soporta múltiples valores.

¿Hay alguna forma simple de meter los mails en un array de texto convenientemente separado por punto y coma (como le gusta a DB Mail)?

Código:
@mailinglist = 'fulano@sarasa.com;mengano@sarasa.com;tuvieja@sarasa.com;etc'
High End Level

Herakei

entradas: 815

13:02 06/02/2009

2

De T-sql no se mucho, pero si cargas los valores en una tabla temporal, y luego haces un For de esa tabla temp haciendo lo que tengas que hacer?

Nuevo miembro

macky049

entradas: 17

13:49 06/02/2009

3

@mailinglist de que tipo es?;tendrias que ver si podes declarar la variable como lista de string o arreglo dinanamico de string

El Arte de la Programación es el arte de dominar la complejidad

Hardcore Extreme Level

Ukyo

.

entradas: 4393

14:19 06/02/2009

4
Código:
DECLARE @MAILING AS VARCHAR(MAX)
DECLARE @COMPROBANTE AS VARCHAR(MAX)

SET @COMPROBANTE = 'XXXXX-XXXXX'

SET @MAILING = (SELECT  (EMAIL+';') FROM TABLA_DEL_TRIGGER A, TABLA_DE_USUARIOS B
WHERE  (COMPROBANTE = @COMPROBANTE) AND A.USUARIO = B.USUARIO)

Da el siguiente error:

Código:
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

Lo cual es lógico, porque la query devuelve de 1 a 8 mails.

Los tipos de datos para el DECLARE son limitados ( http://msdn.microsoft.com/es-es/library/ms187752.aspx) y encima necesito que sea SQL sólo, ya que es para usar en un trigger (lo cual empantana bastante las cosas).

Extreme Level

The Big Praf

entradas: 2873

14:45 06/02/2009

5

Mira, no se si será lo mejor, porque no soy muy entendido en procesos de optimización, pero lo que podes hacer es un cursor que lea de la tabla y te devuelva la consulta como un STRING.
algo asi

DECLARE @MAILING AS VARCHAR(MAX)
DECLARE @COMPROBANTE AS VARCHAR(MAX)
DECLARE @EMAIL AS VARCHAR(MAX)

SET @COMPROBANTE = 'XXXXX-XXXXX'

SET @MAILING = (SELECT (EMAIL+';') FROM TABLA_DEL_TRIGGER A, TABLA_DE_USUARIOS B
WHERE (COMPROBANTE = @COMPROBANTE) AND A.USUARIO = B.USUARIO)

DECLARE CURSOR_MAILS CURSOR FOR
SELECT EMAIL FROM TABLA_DEL_TRIGGER A, TABLA_DE_USUARIOS B WHERE (COMPROBANTE = @COMPROBANTE) AND A.USUARIO = B.USUARIO;
OPEN CURSOR_MAILS
FETCH NEXT FROM CURSOR_MAILS INTO @EMAIL
WHILE @@FETCH_STATUS=0
BEGIN
SET @MAILING = @MAILING + '; ' + @EMAIL;
FETCH NEXT FROM CURSOR_MAILS INTO @EMAIL
END
CLOSE CURSOR_MAILS;
DEALLOCATE CURSOR_MAILS;

En si sería una forma de hacer un ForEach.

Con eso te queda en la variable @MAILING el listado de todos los mails.

Lycosa user

ASUS 1000HE – ATOM N280 – 2GB RAM – 10" – 9.5hs bateria

Hardcore Extreme Level

Ukyo

.

entradas: 4393

14:54 06/02/2009

6
Cita Iniciado por The Big Praf
Ver Mensaje
Mira, no se si será lo mejor, porque no soy muy entendido en procesos de optimización, pero lo que podes hacer es un cursor que lea de la tabla y te devuelva la consulta como un STRING.
algo asi

En si sería una forma de hacer un ForEach.

Con eso te queda en la variable @MAILING el listado de todos los mails.

Si, estuve viendo hacer algo así, pero al parecer en trigger (y en general en SQL) a los cursores los demonizan en cuanto a performance y penalidad como "último recurso".

Ahora estoy haciendo unas pruebas con la funcion coalesce() y parece que funciona…

Mas noticias próximamente! (y gracias a todos )

Extreme Level

The Big Praf

entradas: 2873

15:04 06/02/2009

7

por favor, si lo logras, postea el resultado. No me imagino como usas esa función, o mejor dicho como te pudo ayudar

Lycosa user

ASUS 1000HE – ATOM N280 – 2GB RAM – 10" – 9.5hs bateria

Hardcore Extreme Level

Ukyo

.

entradas: 4393

14:46 09/02/2009

8
Código:
Set @comprobante = 'XXX-XXXXXXX'

Select  @mailing=coalesce(@mailing+';','')+
		Cast(EMAIL As Varchar(max))
From TABLA_DEL_TRIGGER A, TABLA_DE_USUARIOS B
Where  (COMPROBANTE = @comprobante) And A.USUARIO = B.USUARIO

Esto me devuelve un @mailing conteniendo los mails de los usuarios asociados a ese comprobante, separados por punto y coma.

¡Gracias a todos los que postearon!

http://technet.microsoft.com/es-es/l…/ms190349.aspx

COALESCE(expression1,…n) es equivalente a esta función CASE:

CASE
WHEN (expression1 IS NOT NULL) THEN expression1

WHEN (expressionN IS NOT NULL) THEN expressionN
ELSE NULL
END