Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 在T-SQL中迭代结果集_Tsql_Iteration - Fatal编程技术网

Tsql 在T-SQL中迭代结果集

Tsql 在T-SQL中迭代结果集,tsql,iteration,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.sch

我想使用一条语句编写一个存储过程,以迭代另一条语句提供的记录结果集,并将最终结果合并到一个结果集中。有人能就这方面的方法提出建议吗

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

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

要做到这一点,您需要使用动态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

你在迭代什么,表,过程,视图?你说的是“另一组记录”。你想通过迭代所有对象和依赖项来创建某种数据字典吗?我更新了我的示例,因为我从你提供的示例数据中猜测,你希望在迭代中使用“dm_sql_referenced_entities”,希望你可以使用该示例运行,并根据你的自定义需求对其进行更多的调整。