我已宣布临时表
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”。
我尝试了上面的方法然后显示错误,如
第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”。
答案 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