动态Sql - 使用可怕的Cursor定制构建的SELECT - 需要在VIEW表单中

时间:2018-02-22 14:59:29

标签: sql-server tsql cursor dynamic-sql

我有一个可能有人可以提供帮助的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

1 个答案:

答案 0 :(得分:0)

根据所提供的信息,听起来您并不关心第二个信息。

是否存在阻止您在代理作业中运行usp_,将结果转储到表中的内容?您可以让间隔或每天一次运行代理作业。