我有一个像
这样的临时表DECLARE @t TABLE (a BIGINT)
我想这样做
SELECT * FROM @t
但我需要通过EXEC查询来完成,而且这不起作用
DECLARE @query AS NVARCHAR(100) = 'SELECT * FROM @t'
EXEC(@query)
如何创建自定义查询以选择临时表?
感谢。
答案 0 :(得分:1)
这是因为EXEC
语句将在新会话中执行语句。并且表变量范围固定为批处理语句。
由于您在会话中声明了表变量,因此无法在EXEC语句中访问表变量。
因此,您需要在动态代码本身中DECLARE,INSERT,UPDATE,SELECT表变量。
DECLARE @query NVARCHAR(MAX)='';
SELECT @query ='
DECLARE @t TABLE
(
a BIGINT
)'
SELECT @query += 'SELECT * FROM @t'
EXEC(@query)
解决方案2:
另一个解决方案是创建我们可以使用##
创建的全局临时表。全局临时表范围仅限于数据库所有连接。
CREATE TABLE ##TABLE1
(
a BIGINT
)
DECLARE @query NVARCHAR(MAX)='';
SELECT @query += 'SELECT * FROM ##TABLE1'
EXEC(@query)
但请注意,如果另一个用户执行相同的Query,则可能与创建相同的名称存在冲突。
答案 1 :(得分:1)
尝试哈希表如下:
DECLARE @tblTest AS Table
(
Name VARCHAR(50)
)
insert into @tblTest values('Sandip')
insert into @tblTest values('AAA')
IF OBJECT_ID('tempdb..#tblTest') IS NOT NULL
DROP TABLE #tblTest
SELECT * INTO #tblTest FROM @tblTest
DECLARE @query AS NVARCHAR(100) = 'SELECT * FROM #tblTest'
EXEC (@query)
<强>输出:强>
答案 2 :(得分:0)
CREATE TYPE MyTable AS TABLE
(
a BIGINT
);
GO
DECLARE @T AS MyTable;
EXEC sp_executesql
N'SELECT * FROM @T',
N'@T MyTable READONLY',
@T=@T
请试试这个