0

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

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

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 替换为第一个查询的每一行中返回的单个字段值;最终,我想合并所有结果。任何建议将不胜感激。

4

1 回答 1

0

您需要执行动态 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
于 2013-08-14T17:36:11.053 回答