【发布时间】:2019-09-05 20:18:41
【问题描述】:
我想在存储过程范围之外访问它定义的表变量。 I have tried this one,但我的情况不同,因为我的过程接收一个varchar 作为参数,然后它创建一个执行的varchar,某种程度上是这样的:
create procedure p_x
@Table varchar(250)
as
begin
declare @Sql varchar(450)
select @sql = 'declare ' + @Table + 'table(col1 varchar(10), col2 float, col3 float, col4 float)'
select @sql = @sql + ' insert' + @Table + ' values('a', 1,1,1)'
select @sql = @sql + ' insert' + @Table + ' values('b', 2,2,2)'
select @sql = @sql + ' select * from'
execute(@sql)
end
go
另一个问题的解决方案是将要处理的新表作为参数传递。但在我的情况下,因为代码是写在varchar 连接内的决定性部分(并且它还在varchar @Table 的末尾创建连接的辅助表),所以我不知道该怎么做。
给出一些上下文:这个过程使用全局临时表,在查询中被调用。一切正常,直到我们需要更改查询以将其转换为表值函数。查询只是通过全局范围访问过程中定义的表,但表值函数不允许访问这些全局临时表。表变量好像不能是全局的。
简而言之,要将查询更改为表值函数,我需要将过程的临时表更改为可以在表值函数内部访问的表变量。
全局: 1) 今天我有一个有效的查询,这个查询调用了一个过程。
2) 我希望能够从 API 调用此查询,而无需粘贴 100 行查询
3) 我收到了将查询转换为 TFV 的建议
4)我做到了,但是不行,因为TFV不能使用临时表
5) 我想要一种解决方法来创建过程的副本,其中包含一些可以从 TVF 调用的细微更改。
【问题讨论】:
-
这对我来说没有意义,你需要发布一个你的函数的例子来说明你试图描述的内容(用词来解释代码是一个糟糕的选择)。
-
过程和查询都在100行以上。您需要知道的是,它不是将表作为参数传递,而是将 varchar 与表名一起传递,然后在过程中创建它。
-
所以使用表变量是不可能的
-
为什么您认为需要使用表变量才能将过程转换为 TVF?
-
@TabAlleman 我不想将程序转换为 TVF。我正在尝试将调用过程的查询转换为 TVF。
标签: sql sql-server