2016-04-23 15 views
1

enter image description hereクエリは、単一の行にスキルのリストを動的に作成します。 .How私はビューでそれを使用するように変更し、まだダイナミックsqlでのDynaimicクエリとそのビューでの実装方法

DECLARE @cols AS NVARCHAR(MAX), 
@query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT ',' + QUOTENAME(col + '_' + cast(seq as    
    varchar(2))) 
    from 
    (
     select seq = row_number() over(partition by Skill.ID_Job 
            order by Skill.ID_Job) 
     from dbo.Job_Skill Skill 
     Where Skill.Min_Job = 1 and Skill.Ideal_Job = 1 

    ) hr 

    cross apply 
    (
     select 'Skill',1 
    ) c (col, val) 
       order by val , seq 
     FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'') 



set @query = N'SELECT ID_Job, ' + @cols + N' 
     from 
     (
      select hr.ID_Job, 
      col = c.col + ''_'' + cast(seq as varchar(2)), 
      c.val 
      from 
      (
       select Skill.ID_Job, 
     Skill.ID_SKL_Job, 
     Skill.Min_Job, 
     Skill.Ideal_Job, 
     seq = row_number() over(partition by Skill.ID_Job 
            order by Skill.ID_Job) 
     from dbo.Job_Skill Skill 
     Where Skill.Min_Job = 1 and Skill.Ideal_Job = 1 
     ) hr 

      cross apply 
      (
      select ''Skill'', ID_SKL_Job 
     ) c (col, val) 
     ) x 
     pivot 
     (
      max(val) 
      for col in (' + @cols + N') 
     ) p 
     order by ID_Job' 

exec sp_executesql @query   

enter image description here

答えて

1

ない何を確認することができ、クエリに存在する宣言した変数があるのでしかし、私はビューでこのクエリを使用することはできませんSQLはダイナミックビューをサポートしていません。

多分FOR XMLを使用して、結果のXMLをプロシージャ内の出力パラメータ経由で返すことができます。

次に、XMLに参加してXQueryを使用してクエリを実行できます。次のようなXMLを返した場合:

DECLARE @xml xml = CONVERT(xml, 
'<jobs> 
<job id="1"> 
    <skill>s1</skill> 
    <skill>s2</skill> 
</job> 
<job id="2"> 
    <skill>s3</skill> 
</job> 
</jobs>') 

You could query for certain skills like: 

SELECT 
    j.* 
, T.jobs.query('skill') AS skill 
FROM @xml.nodes('jobs/job') T(jobs) 
INNER JOIN jobs j ON j.id = t.jobs.value('@id','int') 
WHERE T.jobs.exist('skill[.="s1"]') = 1 

p.s. XMLを使用すると、最初からjob_idでスキルをグループ化し、job_idとして1つの列を、結果のXMLとして2番目の列を、ビューまたはインライン関数でスキルを実装することができるため、XMLを使用すると、 idで結合し、プログラミングを使用せずにXMLに問い合わせることができます。

+0

助けてくれてありがとう –

+1

@paramtrivedi、「助けてくれてありがとう」と言っても大変親切ですが、回答を受け入れるのは親切でもあります。 [これを読んでください:誰かの回答](http://stackoverflow.com/help/someone-answers)、thx! – Shnugo