Tsql 连接动态SQL列

Tsql 连接动态SQL列,tsql,dynamic,concatenation,Tsql,Dynamic,Concatenation,我有三张桌子;TBL产品和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 Product

我有三张桌子;TBL产品和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.Name字段相同的名称

关于我如何实现上述目标有何想法

非常感谢

更新:我通过以下查询实现了我的目标:

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

将用户的解决方案放入答案中

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

我真的不认为需要光标。@ingo谢谢你的反馈,我也不完全确定我是否需要光标。然而,我不知道如何构造我的查询来实现我所需要的。有什么建议吗?感谢您将其作为“正常”查询编写。如果你的更新是问题的答案,那么我将很乐意帮助你,然后将其作为答案发布。然后,您可以将此问题标记为已接受。