【问题标题】:Get current table name in query在查询中获取当前表名
【发布时间】:2019-10-31 19:26:08
【问题描述】:

是否可以在select语句中获取表名?

例子:

SELECT Id, "Users" as TableName
FROM Users

我不想手动写"Users",而是根据FROM语句来确定。

我正在从一个数据库迁移到另一个数据库(具有不同的结构),并且我有一个存储旧表名的映射表,所以这就是我需要这个的原因(它不太容易出错)。

【问题讨论】:

  • 简答无。长答案,是的,如果您使用动态 SQL 并将表名作为 安全 注入值传递,那么您将在 SELECT 中显示该参数的值(有效地做您不想要的做)。
  • 不,你不能。
  • 最好将您的数据库视为分为两个域。即“数据库对象”和“数据库数据”。 “数据库对象”是表、视图、过程、用户、模式等。“数据库数据”是您存储在表中的信息。这就是我们有“DML”和“DDL”类型语句的原因。在同一个 SQL 语句中的那些之间的交叉通常是不可能的。这样做的愿望通常表明数据库设计不佳,但并非总是如此。在你的情况下,这是有道理的。

标签: sql sql-server tablename


【解决方案1】:

您可以使用以下子查询来获取此信息(适用于 SQL Server 2012+):

SELECT  *,
(select object_name(ind.object_id)
from sys.fn_PhysLocCracker(%%physloc%%) plc
INNER JOIN SYS.DM_DB_DATABASE_PAGE_ALLOCATIONS(DB_ID(),null,null,null,null) ind
ON ind.allocated_page_file_id = plc.file_id
AND ind.allocated_page_page_id = plc.page_id) as table_name
FROM [your table]

速度很慢,缓存在侧页分配上会加快速度。

【讨论】:

  • 如前所述,这就像西伯利亚苔原上的糖蜜一样缓慢,但它确实有效......但需要注意的是,您只能从一张桌子中选择。如果你有一个加入,这将失败。当然,这是一个未记录的函数,通常是个坏主意。仍然 +1,因为它确实提供了所请求的信息。
【解决方案2】:

或者,如果您想对所有表执行此操作,您可以使用以下存储过程:

USE [DB_NAME]
EXEC sp_msforeachtable 'SELECT Id, ''?'' AS [TableName] FROM ?'

也许它会对某人有所帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 2023-01-11
    • 2018-06-15
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多