2008-11-10 18 views
6

Estoy sacando registros de direcciones de correo electrónico de una tabla en SQL Server 2005, y quiero construir una sola cadena para usar como la lista @recipients con sp_send_dbmail. La tabla tiene un campo llamado EmailAddress y hay 10 registros en la tabla.¿Por qué este script SQL funciona como lo hace?

que estoy haciendo esto:

DECLARE @email VARCHAR(MAX) 
SELECT 
    @email = ISNULL(@email + '; ', '') + EmailAddress 
FROM 
    accounts 

Ahora @email tiene una lista semi-delimitada de 10 dirección de correo electrónico de la tabla de cuentas.

Mis preguntas son ¿por qué/cómo funciona esto? ¿Por qué @email no tiene la última dirección de correo electrónico en la tabla?

+0

No lo sé, pero esta es una muy buena pregunta. No puedo esperar para ver las respuestas. – Kevin

+0

Lo usamos hoy para crear una cadena de campos para un comando de pivote. Increíble. Me alegro de haberlo marcado. – BoltBait

Respuesta

5

Porque para cada fila concatena el valor actual de @email con el siguiente resultado en EmailAddress. La concatenación de cadenas es como llamar a una función, ya que debe evaluar el resultado de cada fila en secuencia.

2

Porque la expresión de concatenación se evalúa una vez por fila.

+0

Su respuesta es concisa y, en mi opinión, responde la pregunta de manera más sucinta. – jons911

4

Digamos que tiene 3 direcciones:

[email protected] 
[email protected] 
[email protected] 

Para la primera fila, @email es NULL, por lo que se convierte en "" + "[email protected]", por lo "[email protected]".

Para la segunda fila, @email se convierte en "[email protected]" + "; " + "[email protected]", entonces "[email protected]; [email protected]".

Para la última fila, @email se convierte en "[email protected]; [email protected]" + "; " + "[email protected]", entonces "[email protected]; [email protected]; [email protected]".

1

Su SELECCIONAR no selecciona las filas - para la visualización - concatena repetidamente una expresión a la misma variable. Entonces, al final, todo lo que queda por mostrar es la variable.

Presumiblemente lo encuentra con otra línea en el archivo por lotes, p. "SELECT @email"

Think:

resultado = "" + nombre1
resultado = resultado + nombre2
resultado = resultado + nombre3
etc.

Posiblemente usted está pensando que SELECT variable = expresión es una asignación de combinación y SELECCIONAR; pero en realidad es solo una tarea. En cualquier caso, @email no se reinicializa para cada fila.

Cuestiones relacionadas