Đây là cách tôi sẽ làm điều đó. Tôi thường xuyên sử dụng Coalesce để đặt các hàng vào các trường được phân định và nó luôn hoạt động và chia tỷ lệ tốt (miễn là bạn nhận ra rằng một truy vấn phụ là LUÔN LUÔN sẽ gây ra một số hiệu suất).
Nếu bạn không thích chạy nó như một thủ tục được lưu trữ, bạn cũng có thể dễ dàng viết lại dưới dạng hàm có giá trị của bảng.
Một cách tiếp cận khác sẽ là CTE tôi cho rằng nhưng tôi không quen thuộc với cách tiếp cận đó để gõ từ đầu.
CREATE PROCEDURE GetMessageById
@pMessageID int
AS
BEGIN
SET NOCOUNT ON;
Declare @pTo varchar(max)
Declare @pCC varchar(max)
Declare @pBC varchar(max)
SELECT @pTo = COALESCE(@pTo + ', ', '') + [EmailAddress]
FROM MessageRecipient
WHERE MessageID = @pMessageID AND RecipientTypeID = 1 /** or whatever the id of TO field is */
SELECT @pCC = COALESCE(@pCC + ', ', '') + [EmailAddress]
FROM MessageRecipient
WHERE MessageID = @pMessageID AND RecipientTypeID = 2 /** or whatever the id of CC field is */
SELECT @pBC = COALESCE(@pBC + ', ', '') + [EmailAddress]
FROM MessageRecipient
WHERE MessageID = @pMessageID AND RecipientTypeID = 3 /** or whatever the id of BCC field is */
SELECT Message.*, @pTo as [ToField], @pCC as [CCField], @pBC as [BCCField], (SELECT TOP 1 [EmailAddress] FROM MessageRecipient Where RecipientTypeID = 0 /**<sender id>*/ AND MessageID = @pmessageID) AS [FromField] FROM Message Where Message.ID = @pMessageID
END
GO
Bạn có thể tự hỏi làm thế nào Coalesce hoạt động khi được sử dụng theo cách này (tôi đã làm, khi tôi lần đầu tiên nhìn thấy nó được sử dụng). Về cơ bản, nó tạo ra một truy vấn đệ quy trả về từng giá trị khác không tiếp theo trong tập hợp, cho đến khi kết thúc tập trả về. Đi ra đầu kia, bạn nhận được một danh sách giới hạn hôn mê của tất cả các kết quả dưới dạng một chuỗi.