在T-SQL中迭代结果集

时间:2013-08-14 16:04:01

标签: tsql iteration

我想使用语句编写一个存储过程来迭代另一个语句提供的记录结果集,并将最终结果合并到一个结果集中。任何人都可以为此提出建议吗?

例如,要迭代的通用记录集:

SELECT  sys.schemas.name + '.' + sys.objects.name as [schm_obj]
FROM    sys.objects 
INNER JOIN sys.schemas 
ON sys.objects.schema_id = sys.schemas.schema_id
AND sys.schemas.name IN ('dbo')

要在每条记录上执行的通用查询:

SELECT DISTINCT referenced_schema_name + '.' + referenced_entity_name
FROM sys.dm_sql_referenced_entities(@schm_obj,'OBJECT')

参数@schm_obj将被第一个查询的每一行中返回的单个字段值替换;最终,我想结合所有结果。任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:0)

你需要做dyanmic sql才能做到这一点。我很困惑,因为你正在陈述一个过程,然后显示一个表函数。表函数除非在2012年发生变化,否则无法执行动态sql。如果你想基本上创建一个可编程对象,你可以用来获取你提供架构或元细节的数据来获取它我将使用一个动态过程来标记你得到的东西,然后给你它的价值。然后你可以将它插入到一个表变量中并迭代或插入到它中,直到你的内容为止。

create proc dbo.Dynaminizer 
    (
        @ObjName    nvarchar(64)
    )
as 

BEGIN

    declare @SQL nvarchar(1024)

    Select @SQL = 'Select ''' + @ObjName + ''' as Name, ' + @ObjName + ' from sys.tables'

    EXECUTE sp_executesql @SQL

END


declare @temp table ( name varchar(32), value varchar(128))

insert into @Temp
exec Dynaminizer 'name'

insert into @Temp
exec Dynaminizer 'object_id'

select *
from @Temp

过了一天......

如果您只想从一个表或集合中获取值,然后在采用模式和名称组合的函数中执行操作,那么还有另一种方法可以执行此操作。我会使用cte创建一个自定义列,然后执行交叉应用以在函数中执行该数据集以了解该集合中的行数。这将评估您的函数,就像它为每个值执行它,然后发布结果。除非你更具体地想要做什么,否则没有必要结合。您可以更进一步,如果您希望依赖项内联(而不是单独的行),您可以将数据集关联回自身,然后执行xml类型以将依赖项强制转换为逗号分隔列表。

两者的示例用法:

-- multi row example to show referencing relationships
with procs as 
    (
    Select 
        schema_name(schema_id) + '.' + name as Name
    from sys.procedures p 
    )
select
    p.Name
,   referenced_schema_name + '.' + referenced_entity_name as Ref
from procs p
    cross apply sys.dm_sql_referenced_entities(p.Name,'OBJECT')
;

-- take it a step further and put relationships inside a single column
with procs as 
    (
    Select 
        schema_name(schema_id) + '.' + name as Name
    from sys.procedures p 
    )
, setup as 
    (
    select
        p.Name
    ,   referenced_schema_name + '.' + referenced_entity_name as Ref
    from procs p
        cross apply sys.dm_sql_referenced_entities(p.Name,'OBJECT')
    )
Select distinct
    Name
,   stuff(
        (
        select 
            ', ' + Ref 
        from setup x 
        where x.Name = m.Name
        for xml path('')
        )
        , 1, 2, '') as Dependencies
from setup m