SQL Server 2000: Ideas para realizar subconsultas de agregación de concatenación

Tengo una consulta que devuelve las filas que quiero, p.

QuestionID  QuestionTitle  UpVotes  DownVotes  
==========  =============  =======  =========  
2142075     Win32: Cre...        0          0  
2232727     Win32: How...        2          0  
1870139     Wondows Ae...       12          0  

Ahora quiero tener uncolumna devuelto, que contiene una lista separada por comas de "Autores"(por ejemplo, póster original y editores). Por ejemplo:

QuestionID  QuestionTitle  UpVotes  DownVotes  Authors
==========  =============  =======  =========  ==========
2142075     Win32: Cre...        0          0  Ian Boyd  
2232727     Win32: How...        2          0  Ian Boyd, roygbiv
1870139     Wondows Ae...       12          0  Ian Boyd, Aaron Klotz, Jason Diller, danbystrom


Fingiéndolo

SQL Server 2000 no tiene unCONCAT(AuthorName, ', ') operación de agregación, he estado fingiendo, realizando sub-selecciones simples para elTOP 1 autor y el recuento de autores.

QuestionID  QuestionTitle  UpVotes  DownVotes  FirstAuthor  AuthorCount  
==========  =============  =======  =========  ===========  =========== 
2142075     Win32: Cre...        0          0  Ian Boyd               1 
2232727     Win32: How...        2          0  Ian Boyd               2
1870139     Wondows Ae...       12          0  Ian Boyd               3

Si hay más de un autor, le muestro al usuario una elipsis ("..."), para indicar que hay más de uno. p.ej. el usuario vería:

QuestionID  QuestionTitle  UpVotes  DownVotes  Authors
==========  =============  =======  =========  ==========
2142075     Win32: Cre...        0          0  Ian Boyd
2232727     Win32: How...        2          0  Ian Boyd, …
1870139     Wondows Ae...       12          0  Ian Boyd, …

Y eso funciona bastante bien, ya que normalmente unpregunta no está editado, lo que significa que estoy apoyando el caso del 99% perfectamente, y el caso del 1% solo la mitad-assed también.


Re-consulta roscada

Como una solución más complicada y propensa a errores, estaba pensando en iterar la lista que se muestra y girar un subproceso de trabajo de grupo de subprocesos para cada "pregunta"en la lista, realice una consulta en la base de datos para obtener la lista de autores, luego agregue la lista en la memoria. Esto significaría que la lista se llena primero en la aplicación (nativa). Luego, emito unos miles de consultas individuales después.

Pero eso sería horrible, horrendo, terriblemente lento. Sin mencionar que está plagado de errores, ya que será un trabajo de subprocesos.


si, si, si

Adam Mechanicdice con toda claridad:

No concatene filas en cadenas delimitadas en SQL Server. Hazlo del lado del cliente.

Dime cómo y lo haré.


/llorar

¿Alguien puede pensar en una solución mejor, que sea tan rápida (digamos ... dentro de un orden de magnitud) que mi solución original "TOP 1 plus elipses"?

Por ejemplo, ¿hay alguna forma de devolver un conjunto de resultados, donde la fila de alcance tiene un conjunto de resultados asociado? Entonces, para cada fila "maestra", podría obtener un conjunto de resultados "detallados" que contiene la lista.


Código para la mejor respuesta

Cade's enlace aLa solución de Adam Machanic me gusta lo mejor Una función definida por el usuario, que parece operar a través de la magia:

CREATE FUNCTION dbo.ConcatAuthors(@QuestionID int)
RETURNS VARCHAR(8000)
AS
BEGIN
    DECLARE @Output VARCHAR(8000)
    SET @Output = ''

    SELECT @Output =    CASE @Output 
                WHEN '' THEN AuthorName 
                ELSE @Output + ', ' + AuthorName 
                END
    FROM  (
        SELECT QuestionID, AuthorName, QuestionDate AS AuthorDate FROM Questions
        UNION
        SELECT QuestionID, EditorName, EditDate FROM QuestionEdits
    ) dt
    WHERE dt.QuestionID = @QuestionID
    ORDER BY AuthorDate

    RETURN @Output
END

Con un uso T-SQL de:

SELECT QuestionID, QuestionTitle, UpVotes, DownVotes, dbo.ConcatAuthors(AuthorID)
FROM Questions

Respuestas a la pregunta(4)

Su respuesta a la pregunta