【问题标题】:Find table name of column name in SQL query in C#在C#中的SQL查询中查找列名的表名
【发布时间】:2018-01-02 17:31:05
【问题描述】:

我有一个包含 SQL 查询的字符串。和一个字符串,其中包含查询中找到的列之一的名称。如何找到该列所来自的表?

例如:

string qry = "select [firstName],[result] from [dbo].[patients],[dbo].results]";
string column = "firstName";

我想得到[dbo].[patients]

当然,使用T-SQL也会让复杂的查询和程序变得更复杂。

【问题讨论】:

  • 如果您的from 子句有多个表怎么办?如果它使用 CTE 和/或子查询怎么办?通常,您要问的是如何构建 SQL 解析器。我认为这将是一个有点过于宽泛的问题,除非您可以严格限制输入。
  • 该值不能单独从SQL字符串中提取,也不能从执行该语句的结果中确定。您需要知道两个表中存在的列才能做出决定。
  • 如果 [dbo].[patients] 或 [dbo].[results] 是一个视图并且您确实想知道该表,则它会变得更加复杂。
  • 值得注意的是,TableA,TableB 连接语法被认为是不好的做法。它已经过时了四分之一个世纪。
  • 有一个 sql 解析器,但没有很好的文档记录。我不知道它是否适合您的需求,但值得一看:msdn.microsoft.com/en-us/library/…

标签: c# sql .net sql-server


【解决方案1】:

在 Sql Server 中,两个表可能具有匹配的列名,并且两个表中的字段可能会以 相同的名称返回到查询中。此外,您可以在查询中包含计算列,其中结果集在单个列中包含来自两个表的信息。还有其他情况也会使事情变得混乱。

因此,您不必仅从列名中获得足够的信息来确定查询中的哪个表源自该列。

【讨论】:

  • 如果你的答案是无法回答,这不应该只是投票关闭吗?
  • 没有。 “我怎么做X?”仍然可以是一个有效的问题,即使“你不能”是正确的答案。
【解决方案2】:

您可以使用sys.columns 找出数据库中所有列的名称。要找出其中的表和架构,您需要加入sys.tablessys.schemas。因此,以列名[firstName]为例:

SELECT QUOTENAME(s.[name]) + '.' + QUOTENAME(t.[name]) AS Object
FROM sys.columns c
     JOIN sys.tables t on c.object_id = t.object_id
     JOIN sys.schemas s on t.schema_id = s.schema_id
WHERE c.[name] = 'firstName'
  AND t.[name] IN ('patients','results')
  and s.name = 'dbo';

【讨论】:

  • 您没有使用qry 中的值,OP 指出这些值很重要。您的查询将返回具有名为firstName 的列的所有 表,而不仅仅是查询使用的表。
  • 这也假设甚至有任何匹配,并忽略搜索列是查询中的别名的可能性。
  • 问题不在于查询目录并找到匹配的表/列。更多的是解析 SQL 语句以查找 from 子句中使用的片段,这些片段可能因语句而异。 OP表示某些用例会比问题中的示例更复杂。
  • @JoelCoehoorn,如果我们使用查询 select [firstName],[result] from [dbo].[patients],[dbo].results],那么,不,没有别名。那当然是 OP 提供的查询。但是,这确实让 OP 深入了解如何使用 sys 表,并帮助他们找到自己的列。但是,就像其他人所说的那样,编写 SQL 的人真的应该在里面放别名。
猜你喜欢
  • 2010-09-17
  • 2013-02-10
  • 1970-01-01
  • 2017-07-22
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 2017-12-13
  • 1970-01-01
相关资源
最近更新 更多