【问题标题】:Get aliased table names from SQL Query从 SQL 查询中获取别名表名
【发布时间】:2020-03-19 09:13:44
【问题描述】:

给定下表:

CREATE TABLE #TestTable
(
    Code varchar(10) NOT NULL,
    Parent varchar(10) NULL
);

INSERT INTO #TestTable
SELECT 'Parent', Null UNION ALL
SELECT 'Child', 'Parent';

我希望能够转换这个:

SELECT * 
FROM #TestTable child
INNER JOIN #TestTable parent ON ( parent.Code = child.Parent );

进入这个:

SELECT child.Code, child.Parent, parent.Code, parent.Parent
FROM #TestTable child
INNER JOIN #TestTable parent ON ( parent.Code = child.Parent );

使用sp_describe_first_result_set我可以通过使用以下语句接近:

EXEC sp_describe_first_result_set
N'SELECT * 
FROM #TestTable child
INNER JOIN #TestTable parent ON ( parent.Code = child.Parent )', NULL, 2;

但它会将源表返回为#TestTable,而不是child/parent

【问题讨论】:

  • 别名对用户来说更像是一种视觉辅助,而不是 RDBMS,数据引擎将看到表名,而不是别名,并将所述别名视为表。就我个人而言,我认为这是一件好事,因为您可以将表别名为任何东西,而 一些 人使用的别名非常差。
  • 也许是这样,但如果您两次使用相同的列/表名,您会收到 SQL 错误 The multi-part identifier xx could not be bound,因此无论如何您都需要别名。
  • 虽然您可以使用 T-SQL 脚本 DOM 解析查询客户端以提取表和别名名称并映射到 sp_describe_first_result_set,但对于更复杂的查询来说,这将是非常重要的。同一张表被多次使用。
  • @DanGuzman 抱歉,T-SQL DOM?
  • 我相信 Dan 指的是TSqlParser 和朋友们。功能强大,即使使用起来不是很简单,但仍然比在 T-SQL 中处理 T-SQL 更容易。如果您只想在查询中扩展 *SSDT aka Database Projects 有一个强大的重构选项(以及其他好东西,例如验证对象存在)。

标签: sql-server tsql sql-server-2016


【解决方案1】:

如果您唯一关心的是查看哪个表是源表,您可以将数据拆分为 2 个临时表,这样您将影响系统存储过程调用返回的 source_table。

CREATE TABLE #TestTable
(
    Code varchar(10) NOT NULL,
    Parent varchar(10) NULL
);

INSERT INTO #TestTable
SELECT 'Parent', Null UNION ALL
SELECT 'Child', 'Parent';

select * into #Parent from #TestTable where code='Parent';

select * into #Child from #TestTable where Code='Child';

EXEC sp_describe_first_result_set
N'SELECT * 
FROM #Child child
INNER JOIN #Parent parent ON ( parent.Code = child.Parent )', NULL, 2;


drop table #TestTable, #Parent, #Child;

【讨论】:

  • 我喜欢这个,这是一个有趣的观点,所以我 +1 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-27
  • 2016-08-16
  • 2017-05-19
  • 1970-01-01
  • 2023-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多