T-SQL表变量创建物理表!

T-SQL表变量创建物理表!,sql,sql-server,tsql,Sql,Sql Server,Tsql,天哪!我做错了什么 declare @WTF TABLE ( OrderItemId int ) SELECT TOP 20 OrderItemId as OrderItemId INTO [@WTF] FROM ac_OrderItems SELECT * FROM [@WTF] 问题A:这会创建一个名为@WTF的物理表。为什么?我以为这只是记忆 问题B:最后一行代码,如果我从@WTF中选择*。。。如果没有[],它将不返回任何内容。[]的意义是什么 我需要认真的帮助。我疯了 提前感谢。

天哪!我做错了什么

declare @WTF TABLE (
 OrderItemId int
)

SELECT TOP 20 OrderItemId as OrderItemId INTO [@WTF] FROM ac_OrderItems

SELECT * FROM [@WTF]
问题A:这会创建一个名为@WTF的物理表。为什么?我以为这只是记忆

问题B:最后一行代码,如果我从@WTF中选择*。。。如果没有[],它将不返回任何内容。[]的意义是什么

我需要认真的帮助。我疯了


提前感谢。

因为“选择到”总是创建一个物理表。您要做的是在中插入

Select INTO正在创建一个名为“@WTF”的物理表,就像它应该做的那样。

:

SELECT…INTO在默认文件组中创建一个新表,并将查询结果行插入其中

替代方案是:

不定义WTF表,并依赖该行为自动创建它 使用现有代码,但将“选择”更改为“插入”:

INSERT INTO @WTF
  (orderitemid)
SELECT TOP 20 
       oi.orderitemid
  FROM ac_ORDERITEMS oi

请注意,在使用TOP时,您应该定义ORDER BY子句,以确保一致地返回数据。

第二个答案是,它似乎只适用于方括号[]的原因是@符号

select * from  @WTF
正在从空表变量中选择off,其中

select * from  [@WTF]

正在从新的物理表中选择已创建并填充了数据的select into。括号用于允许表或列名中通常不允许的字符,因此在此处使用括号表示您正在查找名为@WTF的表,而不是名为WTF的变量。

所有表变量都是物理表

你认为它们只是记忆,这是一个神话。它们位于tempdb中,并以系统生成的名称(如4BAC3F29)显示在元数据视图中。表变量的结构与临时表相同


您不能使用选择。。。使用表变量输入,但可以使用临时表。您的代码只是在您的用户数据库中创建了一个名为@WTF的新用户表,如其他答案所示。

从选择列表中删除[]怎么样。。。进入?我不知道选择进入会创建一个物理表!非常感谢大家的知识。你救了我一命。顺便说一句,不要假设一个表变量永远都是内存。这篇文章已经过时了,但仍然主要是相关的和准确的:[]的意义在于它使它成为一个字面意义。它将生成一个名为@WTF的表,而您希望将其插入变量表@WTF中。区别在于SQL编译器认为您真的希望在表名中使用@。啊,是的,您知道了。删除了我的答案。如何将select into查询重新写入insert into?在第1点,当然不能将select into写入表变量;必须先声明。啊,这是有道理的!谢谢你的洞察力!