Конкатенация динамических столбцов SQL - PullRequest
2 голосов
/ 14 июня 2011

У меня есть три стола;tblProducts и tblOption и tblOptionValue.(T-SQL)

Я получаю все возможные комбинации моего продукта, используя этот запрос:

DECLARE @ProductId INT, @Query NVARCHAR(MAX), @ProductOptionGroupId INT
SET @ProductId = 69
SET @Query = ''

DECLARE CC CURSOR FOR
SELECT DISTINCT OptionID
FROM tblOption
WHERE ProductId = @ProductId

OPEN CC
FETCH NEXT FROM CC INTO @ProductOptionGroupId
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @Query = @Query + '(SELECT DISTINCT tblOptionValue.Name FROM tblOptionValue INNER JOIN tblOption on tblOptionValue.OptionID = tblOption.OptionID WHERE tblOptionValue.OptionId='+CAST(@ProductOptionGroupId AS VARCHAR)+'AND tblOption.ProductId='+CAST(@ProductId AS VARCHAR)+
                 +') AS Table' + CAST(@ProductOptionGroupId AS VARCHAR)+' CROSS JOIN '
    FETCH NEXT FROM CC INTO @ProductOptionGroupId
END
CLOSE CC
DEALLOCATE CC
SET @Query = 'SELECT * FROM ' + LEFT(@Query,LEN(@Query)-10) 
PRINT @Query
EXEC sp_executesql @Query

Найдено здесь благодаря @Lamak я адаптировал егов мою базу данных, но мне нужно:

A) Найти способ вернуть все данные в один столбец вместо нескольких столбцов
B) Назовите столбец tblOptionValue.Name так же, как связанный tblOption.Поле имени

Есть какие-нибудь мысли о том, как я могу достичь вышеуказанного?

Большое спасибо

Обновление: Мне удалось достичь своих целей, используя следующиезапрос:

DECLARE @ProductId INT, @Query NVARCHAR(MAX), @ProductOptionGroupId INT, @cName     VARCHAR(300)
SET @ProductId = 70
SET @Query = ''

DECLARE CC CURSOR FOR
SELECT DISTINCT OptionID
FROM tblOption
WHERE ProductId = @ProductId

OPEN CC
FETCH NEXT FROM CC INTO @ProductOptionGroupId
WHILE @@FETCH_STATUS = 0
BEGIN
    set @cName = (SELECT Name FROM tblOption WHERE OptionID=@ProductOptionGroupId)
    SET @Query = @Query + '(SELECT DISTINCT tblOptionValue.Name as '+@cName+' FROM tblOptionValue INNER JOIN tblOption on tblOptionValue.OptionID = tblOption.OptionID INNER JOIN tblProduct on tblOption.ProductID=tblProduct.ProductID WHERE tblOptionValue.OptionId='+CAST(@ProductOptionGroupId AS VARCHAR)+'AND tblOption.ProductId='+CAST(@ProductId AS VARCHAR)+
                 +') AS Table' + CAST(@ProductOptionGroupId AS VARCHAR)+' CROSS JOIN '    
    FETCH NEXT FROM CC INTO @ProductOptionGroupId
END
CLOSE CC
DEALLOCATE CC
SET @Query = 'SELECT t2.*, t1.* FROM (SELECT * FROM ' + LEFT(@Query,LEN(@Query)-10)
SET @Query = @Query + ') as t1, 
(SELECT * FROM tblProduct WHERE ProductID=70) as t2'

PRINT @Query
EXEC sp_executesql @Query

1 Ответ

2 голосов
/ 29 июля 2011

Поместите решение пользователя в ответ.

DECLARE @ProductId INT, @Query NVARCHAR(MAX), @ProductOptionGroupId INT, @cName     VARCHAR(300)
SET @ProductId = 70
SET @Query = ''

DECLARE CC CURSOR FOR
SELECT DISTINCT OptionID
FROM tblOption
WHERE ProductId = @ProductId

OPEN CC
FETCH NEXT FROM CC INTO @ProductOptionGroupId
WHILE @@FETCH_STATUS = 0
BEGIN
    set @cName = (SELECT Name FROM tblOption WHERE OptionID=@ProductOptionGroupId)
    SET @Query = @Query + '(SELECT DISTINCT tblOptionValue.Name as '+@cName+' FROM tblOptionValue INNER JOIN tblOption on tblOptionValue.OptionID = tblOption.OptionID INNER JOIN tblProduct on tblOption.ProductID=tblProduct.ProductID WHERE tblOptionValue.OptionId='+CAST(@ProductOptionGroupId AS VARCHAR)+'AND tblOption.ProductId='+CAST(@ProductId AS VARCHAR)+
                 +') AS Table' + CAST(@ProductOptionGroupId AS VARCHAR)+' CROSS JOIN '    
    FETCH NEXT FROM CC INTO @ProductOptionGroupId
END
CLOSE CC
DEALLOCATE CC
SET @Query = 'SELECT t2.*, t1.* FROM (SELECT * FROM ' + LEFT(@Query,LEN(@Query)-10)
SET @Query = @Query + ') as t1, 
(SELECT * FROM tblProduct WHERE ProductID=70) as t2'

PRINT @Query
EXEC sp_executesql @Query
...