Dynamic SQL-使用可怕的光标进行自定义构建选择 - 需要在视图中



我有一个SQL问题,也许有人可以提供帮助。我编写了一个存储过程,该过程检查了CRM实体数据提取物,找到其中的所有选择列表字段,在这些字段上进行CRM Optionset查找,并在结果集的末尾返回新的标签值作为新的附加字段。

问题是,我需要在视图表单中...我无法将其创建为视图(当前形式(,因为当我发现您无法使用脚本代码运行视图...基本上必须是一个选择语句。我的另一个策略是将其作为表值函数创建,然后从视图中的函数中选择,这是允许的...但是我也不能这样做,因为我无法预定临时表在一个函数中,因为查询中返回的列数是从实体到实体的动态。(从实体到实体永远都不一样(。

另一个选项是写入全局临时表,但我认为您不能在函数中参考全局临时表或查看。

所以我有2个问题...你们是否知道有任何hacks从视图中调用存储程序?....或...您对如何转换此存储程序有任何想法(其中包含一些变量和一个可怕的光标循环 - 是的,我知道练习 - 切勿使用光标 - 但我不知道如何不知道在这种情况下(到单个动态选择语句,然后我可以使用它来创建一个视图?请注意,它确实具有一个参数(在视图中也不允许使用( - 但是我可以对此进行硬编码(为每个实体表创建不同的视图,我需要使用它(。

您在下面的光标语句中看到的是我选择需要附加到选择查询的动态列的地方...在光标循环中是我的动态SQL。请注意,此循环将返回我运行的每个实体提取表的不同列名和列数。运行此存储的PROC完全返回我需要的...对于我需要运行的所有实体,我只需要在视图表单中就具有它。

存储的Proc代码:

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

根据给出的信息,听起来好像您关心第二个信息。

是否有一些阻止您在代理作业中运行USP_,将结果倾倒到表中的东西?您可以每天或每天一次进行代理工作。

最新更新