0

可能重复:
如何在动态 sql 语句中使用表变量?

如果我用 TEMPORARY TABLE 做我想做的事,它可以正常工作:

DECLARE @CTRFR VARCHAR(MAX)

SET @CTRFR = 'select blah blah blah' -- <-- very long select statement. this returns a 0 or some greater number. Please note! --> I NEED THIS NUMBER.

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo][#CTRFRResult]') AND type IN (N'U') ) 
   DROP TABLE [dbo].[#CTRFRResult]

CREATE TABLE #CTRFRResult
(
  CTRFRResult VARCHAR(MAX)
)

SET @CTRFR = 'insert into #CTRFRResult ' + @CTRFR
EXEC(@CTRFR)

以上工作正常。

问题是几个数据库正在使用同一个 TEMP 表。因此我需要使用 VARIABLE 表(而不是临时表)。

我在下面的内容不起作用,因为它说必须声明该表。

DECLARE @CTRFRResult TABLE
(
   CTRFRResult VARCHAR(MAX)
)

SET @CTRFR = 'insert into @CTRFRResult ' + @CTRFR -- I think the issue is here.
EXEC(@CTRFR)

设置@CTRFRinsert into...不起作用,因为我假设表名超出范围。我将如何使用变量表来模仿临时表代码?

我收到的错误消息是:

必须声明表变量“@CTRFRResult”

4

3 回答 3

1

您不能像这样使用带有动态 SQL 的 @ 表,您还必须在动态 sql 语句中创建表。

但我不认为你真的有使用 # 表的问题。

# 表将仅对当前会话可用 - 您可以拥有 100 个会话,每个会话都可以毫无问题地创建自己的版本。

如果要创建其他会话可以访问的临时表,则需要改用##。

于 2012-09-18T21:40:40.543 回答
0

您不能像这样插入表变量,因为exec在它自己的范围内运行。

来自 Erland Sommarskog 的动态 SQL 的诅咒和祝福

接下来要注意的是动态 SQL 不是存储过程的一部分,而是构成了它自己的范围。调用动态 SQL 块类似于调用临时创建的无名存储过程。这有很多后果:

在动态 SQL 块内,不能访问局部变量(包括表变量)或调用存储过程的参数。但是,如果使用 sp_executesql,则可以将参数(输入和输出)传递给动态 SQL 块。

于 2012-09-18T21:40:51.267 回答
0

虽然您无法将表变量作为参数发送到动态 sql 或其他存储过程,但您可能仍会在特定情况下使用它。代替

SET @CTRFR = 'insert into @CTRFRResult ' + @CTRFR -- I think the issue is here.
EXEC(@CTRFR)

你可能会说:

insert into @CTRFRResult
  exec sp_executesql @CTRFR
于 2012-09-18T22:00:42.720 回答