如何将数据设置为临时表中的变量?

时间:2015-09-28 11:20:18

标签: sql-server-2008

我已宣布临时表

DECLARE @Table Table
(
  ID INT IDENTITY(1,1),
  TableColumn VARCHAR(MAX)
) 

DECLARE @Temp VARCHAR(MAX)
SET @Temp='SELECT * FROM '+'@Table'+''

SELECT @Temp
EXEC (@Temp)

我想将@Table的所有数据都设置为变量@Temp。以上我试过的做法是对的吗?目前它显示出一些错误。

  

Msg 1087,Level 15,State 2,Line 1
  必须声明表变量“@Table”。

enter image description here

我尝试了上面的方法然后显示错误,如

  

第15级,第1级,第1行

     

关键字“AS”附近的语法不正确。

     

Msg 1087,Level 15,State 2,Line 9

     

必须声明表变量“@Table”。 Msg 139,Level 15,State 1,   第0行

     

无法为本地变量指定默认值。

     

Msg 137,Level 15,State 2,Line 17

     

必须声明标量变量“@Temp”。

2 个答案:

答案 0 :(得分:0)

EXEC()创建新的上下文,变量在那里不可见,因此您需要将它们作为参数传递。但临时表和普通表是可见的。这就是你得到的原因

  

必须声明表变量“@Table”。

如果可以将临时变量更改为临时表。

<强> SqlFiddleDemo

CREATE TABLE #Table
( ID INT IDENTITY(1,1),
  TableColumn VARCHAR(MAX));

INSERT INTO #Table
VALUES ('aaa'), ('bbb');

DECLARE @Temp NVARCHAR(MAX) ='SELECT * FROM <placeholder>';

SET @Temp = REPLACE(@Temp, '<placeholder>', '#Table');

-- SELECT @Temp;

EXEC [dbo].[sp_executesql]
      @Temp;

如果要查询临时变量,则需要创建表类型并将其作为参数传递给动态sql:

<强> Demo

CREATE TYPE MyTable AS TABLE 
( 
 ID INT IDENTITY(1,1),
  TableColumn VARCHAR(MAX)
);

DECLARE @Table AS MyTable;

INSERT INTO @Table
VALUES ('aaa'), ('bbb');

DECLARE @Temp NVARCHAR(MAX) ='SELECT * FROM '+'@Table'+'';

-- SELECT @Temp;

EXEC [dbo].[sp_executesql]
      @Temp
      ,N'@Table MyTable READONLY'
      ,@Table;

答案 1 :(得分:0)

这是为了显示表变量和临时表之间的区别。你无法做你想做的事。此外,@ temp只是一个包含要执行的SQL的变量。如果您希望将结果放在另一个变量中,则必须声明另一个变量。

DECLARE @Table TABLE (
    ID INT IDENTITY(1, 1)
    ,TableColumn VARCHAR(MAX)
    )

INSERT INTO @Table (TableColumn)
VALUES ('testing 1,2,3')

SELECT *
FROM @table --with table variables, you can only select in the scope

DECLARE @Temp VARCHAR(MAX)

SET @Temp = 'SELECT * FROM @Table'

BEGIN TRY
    --SELECT @Temp
    EXEC (@Temp) --fails, because @table is not in scope
END TRY

BEGIN CATCH
    SELECT 'Table variable dynamic execution failed'
END CATCH
GO

CREATE TABLE #table (
    ID INT IDENTITY(1, 1)
    ,TableColumn VARCHAR(MAX)
    )

INSERT INTO #Table (TableColumn)
VALUES ('testing 1,2,3')

DECLARE @Temp VARCHAR(MAX)

SET @Temp = 'SELECT * FROM #Table' --you can select out of a temp table with dynamic sql, because it will remain in scope for called procedures

--SELECT @Temp
EXEC (@Temp) 
DROP TABLE #table