我有一个可能有人可以提供帮助的SQL问题。我编写了一个存储过程,用于检查CRM实体数据提取,查找其中的所有PICKLIST字段,对这些字段进行CRM选项集查找,并将实际标签值作为新的附加字段返回到结果集的末尾。
问题是,我需要以VIEW形式...我不能将其创建为VIEW(以当前形式),因为我发现你无法使用脚本代码运行VIEW ...必须基本上是一个SELECT语句。我的另一个策略是将它创建为一个表值函数,然后从VIEW中的FUNCTION中选择,这是允许的......但我也不能这样做,因为我无法预先定义一个临时表在函数中,因为查询中返回的列数是从实体到实体的动态。 (从实体到实体,它永远不会相同)。
另一种选择是写入全局临时表,但我认为你不能在函数或视图中引用全局临时表。
所以我有2个问题......你们知道从View中调用存储过程的任何黑客吗? ....或者......你对如何转换这个StoredProc有任何想法(包含一些变量和一个可怕的CURSOR循环 - 是的我知道钻头 - 从不使用CURSORS - 但我无法弄清楚如何不在这种情况下)到单个动态SELECT语句,然后我可以创建一个VIEW?请注意,它确实有一个参数(在View中也不允许) - 但我可以使用硬编码(为每个实体表创建一个不同的视图,我需要使用它)。
你会在下面的游标语句中看到我正在选择我需要附加到我的Select查询的动态列...在游标循环中是我的动态sql。请注意,此循环将为我运行它的每个实体提取表返回不同的列名和列数。运行这个存储过程确切地返回我需要的...对于我需要运行它的任何和所有实体。我只需要它以VIEW形式存在它。如果可能的话。
存储过程代码:
alter procedure [dbo].[IMS_OptionSetsLookup]
@azuretable nvarchar(max)
as
declare @entity varchar(max)
declare @column varchar(max)
declare @loopsql nvarchar(max)
DECLARE cur CURSOR FOR
select am.entityname, c.column_name
from information_schema.columns c
inner join ims_AttributeMetaData am on am.entityname = substring(c.table_name,5,99)
and am.attributename = c.column_name
where am.AttributeType = 'Picklist' and
c.table_name = @azuretable
set @loopsql = 'select b.*, '
OPEN cur
FETCH NEXT FROM cur INTO @entity, @column
WHILE (@@FETCH_STATUS = 0)
BEGIN
set @loopsql = @loopsql + ' (select o.LocalizedLabel from ims_optionsetmetadata o, ' + @azuretable + ' a where o.entityname = ''' + @entity + ''' and optionsetname = ''' + @column + ''' and o.[option] = a.' + @column + ' and a.id = b.id) as ' + @column + '_Value,'
FETCH NEXT FROM cur INTO @entity, @column
END
CLOSE cur
DEALLOCATE cur
set @loopsql = substring(@loopsql,1, len(@loopsql) - 1) + ' from ' + @azuretable + ' b'
execute sp_executesql @loopsql
GO
答案 0 :(得分:0)
根据所提供的信息,听起来您并不关心第二个信息。
是否存在阻止您在代理作业中运行usp_,将结果转储到表中的内容?您可以让间隔或每天一次运行代理作业。