【发布时间】:2018-03-21 01:32:17
【问题描述】:
编辑:一些愿意提供帮助的人不清楚要求的性质,所以我会尽可能清楚地说明:
我们需要实例化一个底层表的视图,并且这个视图必须能够连接到另一个表;困难在于在执行连接的临时查询运行时才知道底层表的身份。 我们想做这样的事情:
select * from foo
inner join dynamicallyInstantiatedTable(condition) DT
on foo.zipcode = DT.zipcode
如果函数使用动态 SQL,则似乎无法创建返回 TABLE 的函数。这是无效的:
declare @tablename varchar(50);
-- <snip> code to determine the name of @tablename
declare @statement varchar(1000);
set @statement = 'select * from ' + @tablename;
exec( @statement);
错误:
在 功能。
如果由于某种原因事先不知道表名(例如,表不断被添加,我们必须选择最近的表),是否可以动态进行选择并且在存储过程或函数中返回一个表?
【问题讨论】:
-
SP 是否可以返回表,以便将其视为表,即存储的 proc 名称在另一个 select 语句中充当表名?
select * from myproc inner join T.... -
@Tim 啊,我明白你在问什么。不幸的是,不,您不能在存储过程、视图或函数中执行此操作。您可以获得的最接近的是返回结果集的过程,但您不能将其视为表格。
-
一些非常丑陋的方式
SELECT * FROM OPENQUERY(YOURSERVERNAME, 'EXEC MyProc @parameters')结合动态 SQL 可能有效,但我仍然不会那样做 -
tables are constantly being added and we must select against the most recent one它表示每个日期的表格,恕我直言,这是糟糕的设计。它是反模式SELECT * FROM sales + @yymm
标签: sql-server function tsql dynamic-sql