您需要执行动态 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