在此处输入图像描述“我的查询”在一行中动态创建技能列表。但是我不能在视图中使用此查询,因为查询中存在声明变量。如何修改它以在视图中使用它并且仍然是动态的
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
不确定您要做什么,但是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
从我所知道的ps来看,使用XML可以让您抓起动态sql,因为您可以从一开始就按job_id对技能进行分组,将一列作为job_id,将第二列作为生成的XML,然后在视图或内联函数中实现它,然后您可以通过ID加入并查询XML,而无需进行任何编程。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句