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”,希望你可以使用该示例运行,并根据你的自定义需求对其进行更多的调整。