动态SQL Server 2008查询加入

时间:2013-01-15 06:04:55

标签: sql dynamic

您好我有下表:

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' 

From #test table我想生成如下结果:

 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  

1 个答案:

答案 0 :(得分:1)

您可以使用动态数据透视和动态查询中的联接#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)

SQL Fiddle