SQL Server声明并执行临时表的查询

时间:2016-12-29 07:02:34

标签: sql-server

我有一个像

这样的临时表
DECLARE @t TABLE (a BIGINT)

我想这样做

SELECT * FROM @t

但我需要通过EXEC查询来完成,而且这不起作用

DECLARE @query AS NVARCHAR(100) = 'SELECT * FROM @t'
EXEC(@query)

如何创建自定义查询以选择临时表?

感谢。

3 个答案:

答案 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)

<强>输出:

enter image description here

答案 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 

请试试这个