表名作为变量
我正在尝试执行此查询:
declare @tablename varchar(50)
set @tablename = 'test'
select * from @tablename
这会产生以下错误:
消息 1087,级别 16,状态 1,第 5 行
必须声明表变量“@tablename”。
动态填充表名的正确方法是什么?
I am trying to execute this query:
declare @tablename varchar(50)
set @tablename = 'test'
select * from @tablename
This produces the following error:
Msg 1087, Level 16, State 1, Line 5
Must declare the table variable "@tablename".
What's the right way to have the table name populated dynamically?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(11)
对于静态查询,例如您问题中的查询,表名和列名必须是静态的。
对于动态查询,您应该动态生成完整的 SQL,并使用 sp_executesql 来执行它。
下面是一个用于比较不同数据库的相同表之间的数据的脚本示例:
静态查询:
由于我想轻松更改
table
和schema
的名称,因此我创建了这个动态查询:由于动态查询有很多需要考虑的细节,而且它们很难维护,我建议您阅读:动态 SQL 的诅咒和祝福
For static queries, like the one in your question, table names and column names need to be static.
For dynamic queries, you should generate the full SQL dynamically, and use sp_executesql to execute it.
Here is an example of a script used to compare data between the same tables of different databases:
Static query:
Since I want to easily change the name of
table
andschema
, I have created this dynamic query:Since dynamic queries have many details that need to be considered and they are hard to maintain, I recommend that you read: The curse and blessings of dynamic SQL
将您的最后一条语句更改为:
这就是我在存储过程中执行操作的方式。第一个块将声明变量,并根据当前年份和月份名称设置表名称,在本例中为 TEST_2012OCTOBER。然后我检查它是否已存在于数据库中,如果存在则将其删除。然后下一个块将使用 SELECT INTO 语句创建表并使用另一个带参数的表中的记录填充该表。
Change your last statement to this:
This is how I do mine in a stored procedure. The first block will declare the variable, and set the table name based on the current year and month name, in this case TEST_2012OCTOBER. I then check if it exists in the database already, and remove if it does. Then the next block will use a SELECT INTO statement to create the table and populate it with records from another table with parameters.
使用:
Use:
您不能使用变量的表名。你必须这样做:
You can't use a table name for a variable. You'd have to do this instead:
您需要动态生成 SQL 内容:
You'll need to generate the SQL content dynamically:
使用
sp_executesql
执行任何SQL,例如Use
sp_executesql
to execute any SQL, e.g.您需要使用SQL Server动态SQL:
使用EXEC执行任何SQL:
使用EXEC sp_executesql执行任何SQL:
使用EXECUTE sp_executesql执行执行任意SQL:
You need to use the SQL Server dynamic SQL:
Use EXEC to execute any SQL:
Use EXEC sp_executesql to execute any SQL:
Use EXECUTE sp_executesql to execute any SQL:
希望这段代码有帮助
END
Hopefully this code helps
END
另外,您还可以使用这个...
Also, you can use this...