10

有可能的?

DECLARE @vTableName varchar(50)

SET @vTableName = (SELECT TableName FROM qms_Types WHERE Id = 1)

SELECT * FROM @vTableName

我有这个错误:

消息 1087,级别 16,状态 1,行 3 必须声明表变量“@vTableName”。

4

6 回答 6

20

简短的回答:没有。

长答案:不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不)如果必须,请使用动态 SQL,但如果您以不提前知道表名称的方式构建表,那么重新考虑架构可能会有所帮助。

这是学习如何使用动态 SQL 的一个很好的资源:动态 SQL的诅咒和祝福

于 2012-04-05T14:30:19.810 回答
5

如果您尝试从该名称的表中进行选择,则可以执行以下操作:

DECLARE @vTableName varchar(50) 
SET @vTableName = (SELECT TableName FROM qms_Types WHERE Id = 1) 
EXECUTE('SELECT * FROM [' + @vTableName + ']')
于 2012-04-05T14:27:57.463 回答
2

我的解决方案:

EXECUTE('SELECT * FROM  ' + TableName + '')
于 2014-12-19T15:39:10.047 回答
2

似乎不同的人对 OP 的解释不同。

我很确定 OP 要求这种类型的概念/能力/机动......

“将表名放入变量中,然后像使用表名一样使用该变量。”

DECLARE @TableIWantRecordsFrom varchar(50)
--      ^^^^^^^^^^^^^^^^^^^^^^

SET @TableIWantRecordsFrom = (SELECT TableName FROM qms_Types WHERE Id = 1) -- (L1)
--  ^^^^^^^^^^^^^^^^^^^^^^

-- Let's say, at this point, @TableIWantRecordsFrom ... contains the text 'Person'
--                           ^^^^^^^^^^^^^^^^^^^^^^

-- assuming that is the case then...
-- these two queries are supposed to return the same results:

SELECT top 3 fname,lname,mi,department,floor FROM Person
--                                                ^^^^^^
SELECT top 3 fname,lname,mi,department,floor FROM @TableIWantRecordsFrom -- (L2)
--                                                ^^^^^^^^^^^^^^^^^^^^^^

从阅读所有回复和答案来看,这种操作似乎无法完成——除非——您使用动态 SQL...

  • 创建和维护可能有点痛苦
  • 可以创造更多的工作,而不是它在未来“节省”你的时间。

==================================================== ===============

还有其他语言可以做到这一点......从字面上看,两行代码(参见上面代码中的(L1)和(L2))并且不必进行大量格式化和编辑。)

(我以前做过 - 还有另一种语言,你只需要 L1 和 L2 ......)

==================================================== ===============

不幸的是,如果不付出相当大的努力,SQL Server 就不会这样做……

  • 先写你的SQL然后
  • 测试它以确保它确实可以正常工作
  • 用刻度线框住每一行,然后转义现在在这些刻度线内的刻度线
  • 声明变量
  • 将变量设置为您在上面勾选的 sql 语句
  • (我可能会遗漏一些额外的步骤)
  • 哦,然后,如果你需要维护它
  •     您需要非常小心,并按原样在此处进行编辑,并希望您一切顺利-或者-您可能已经保存了它的副本...未勾选且未更改,因此您可以编辑“真正的”sql,然后当你完成后,你可以重新做这些步骤......再次。
于 2016-12-16T18:27:34.720 回答
1

我想你想要这个:

DECLARE @vTableName table(TableName varchar(50))

insert into @vTableName 
SELECT TableName FROM qms_Types WHERE Id = 1

SELECT * FROM @vTableName
于 2012-04-05T14:30:22.700 回答
1

您可以做到这一点的唯一方法是通过动态 SQL,它指的是创建 T-SQL 文本并使用sp_executesql(或简单地exec)执行它的实践

这是一个关于动态 SQL 的有用链接动态 SQL的诅咒和祝福

您应该真正考虑这是否是动态 sql 的情况,或者是否有其他方法可以执行此操作。

于 2012-04-05T14:33:23.847 回答