有可能的?
DECLARE @vTableName varchar(50)
SET @vTableName = (SELECT TableName FROM qms_Types WHERE Id = 1)
SELECT * FROM @vTableName
我有这个错误:
消息 1087,级别 16,状态 1,行 3 必须声明表变量“@vTableName”。
有可能的?
DECLARE @vTableName varchar(50)
SET @vTableName = (SELECT TableName FROM qms_Types WHERE Id = 1)
SELECT * FROM @vTableName
我有这个错误:
消息 1087,级别 16,状态 1,行 3 必须声明表变量“@vTableName”。
简短的回答:没有。
长答案:不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不)如果必须,请使用动态 SQL,但如果您以不提前知道表名称的方式构建表,那么重新考虑架构可能会有所帮助。
这是学习如何使用动态 SQL 的一个很好的资源:动态 SQL的诅咒和祝福
如果您尝试从该名称的表中进行选择,则可以执行以下操作:
DECLARE @vTableName varchar(50)
SET @vTableName = (SELECT TableName FROM qms_Types WHERE Id = 1)
EXECUTE('SELECT * FROM [' + @vTableName + ']')
我的解决方案:
EXECUTE('SELECT * FROM ' + TableName + '')
似乎不同的人对 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 就不会这样做……
我想你想要这个:
DECLARE @vTableName table(TableName varchar(50))
insert into @vTableName
SELECT TableName FROM qms_Types WHERE Id = 1
SELECT * FROM @vTableName
您可以做到这一点的唯一方法是通过动态 SQL,它指的是创建 T-SQL 文本并使用sp_executesql
(或简单地exec
)执行它的实践
这是一个关于动态 SQL 的有用链接动态 SQL的诅咒和祝福。
您应该真正考虑这是否是动态 sql 的情况,或者是否有其他方法可以执行此操作。