动态SQL Server 2008查询联接

动态SQL Server 2008查询联接,sql,dynamic,Sql,Dynamic,嗨,我有下表: CREATE TABLE #Test ( ProductID int, MainMasterFeatureID int, --MasterFeatureValue Varchar(100), ChilFeatureName varchar(100), ParentFeatureName varchar(100) ) INSERT INTO #Test SELE

嗨,我有下表:

CREATE TABLE #Test
        (
        ProductID int,
        MainMasterFeatureID int,
        --MasterFeatureValue Varchar(100),
        ChilFeatureName varchar(100),
        ParentFeatureName varchar(100)
    )

    INSERT INTO #Test
    SELECT 40,1,,'Pack','Type' 
    UNION ALL 
    SELECT 40,0,'Laminate','Technology'
    UNION ALL
    SELECT 40,11,'Yes','Coated'
    UNION ALL
    SELECT 52,1,'Roll','Type'
    UNION ALL
    SELECT 52,11,'NO','Coated'




    SELECT * FROM #Test


 CREATE TABLE #tProduct
    (
        tProductID int PRIMARY KEY, 
        tProductCode nvarchar(128), 
        tProductName nvarchar(256)
    )
INSERT INTO #tProduct
SELECT 40,'001','ABC'
UNION ALL
SELECT 52,'002','XYZ'
UNION ALL
SELECT 50,'006','IJK' 
从#测试表
我想生成如下结果:

 ProductID          Type             Technology      Coated 

   40               Pack              Laminate          YES 

   52               Roll               Null              No
这里的类型、技术、涂层不是固定的,这可以动态生成

它可以像这样生成

Declare @sql Varchar(MAX) 
Select @sql  = 'SELECT ProductID, ' 
Select @sql = @sql + STUFF((Select DISTINCT ',MAX(Case When ParentFeatureName = ' + CHAR(39) + ParentFeatureName + CHAR(39) + ' Then ChilFeatureName Else ' + CHAR(39) + CHAR(39) + ' End) As ' + ParentFeatureName From #Test For XML PATH('')),1,1,'') 
Select @sql = @sql + ' FROM #Test Group By ProductID' 
Execute(@sql)
现在,我想将此动态查询加入到
#tProduct
以获得所需的结果:

 tProductID   tProductName        Type             Technology      Coated 

   40            ABC              Pack              Laminate          YES 

   52            XYZ              Roll               Null              No  

您可以通过动态透视和动态查询中的联接来执行此操作,该动态查询指向
#tProduct

declare @SQL nvarchar(max)
declare @FieldList nvarchar(max)

set @FieldList = 
  (
  select distinct ','+quotename(ParentFeatureName)
  from #Test
  for xml path(''), type
  ).value('substring(text()[1], 2)', 'nvarchar(max)')

set @SQL = 
'
select TP.tProductID,
       TP.tProductName,'+
       @FieldList+'
from 
  (
  select ProductID, 
         ParentFeatureName,
         ChilFeatureName
  from #Test
  ) as T
pivot
  (
    max(T.ChilFeatureName) 
    for T.ParentFeatureName in ('+@FieldList+')
  ) as P
inner join #tProduct as TP
  on P.ProductID = TP.tProductID'

exec(@SQL)