C# 在C中的SQL查询中查找列名的表名

C# 在C中的SQL查询中查找列名的表名,c#,sql,.net,sql-server,C#,Sql,.net,Sql Server,我有一个包含SQL查询的字符串。以及一个字符串,其中包含查询中找到的列之一的名称。如何找到从中获取列的表 例如: string qry = "select [firstName],[result] from [dbo].[patients],[dbo].results]"; string column = "firstName"; 我想得到[dbo].[病人] 当然,使用T-SQL也会使复杂的查询和过程更加复杂。您可以使用sys.columns找出数据库中所有列的名称。要找出其中的表和模式,需

我有一个包含SQL查询的字符串。以及一个字符串,其中包含查询中找到的列之一的名称。如何找到从中获取列的表

例如:

string qry = "select [firstName],[result] from [dbo].[patients],[dbo].results]";
string column = "firstName";
我想得到[dbo].[病人]


当然,使用T-SQL也会使复杂的查询和过程更加复杂。

您可以使用sys.columns找出数据库中所有列的名称。要找出其中的表和模式,需要连接到sys.tables和sys.schema。因此,使用列名[firstName]的示例:


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


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

如果from子句有多个表怎么办?如果它使用CTE和/或子查询怎么办?通常,您要问的是如何构建SQL解析器。我认为这是一个过于宽泛的问题,除非您能够严格限制输入。该值不能单独从SQL字符串中提取,也不能从执行该语句的结果中确定。您需要知道两个表中存在的列,才能进行确定。如果[dbo].[patients]或[dbo].[results]是一个视图,并且您确实想知道该表,则会变得更加复杂。值得注意的是,TableA、TableB连接语法被认为是一种糟糕的做法。它已经过时了四分之一个世纪了。有一个sql解析器,但没有很好的文档记录。我不知道它是否适合您的需要,但值得一看:您没有利用qry中OP指出的重要值。您的查询将返回所有具有名为firstName的列的表,而不仅仅是查询使用的列。这还假设存在任何匹配项,并忽略了搜索列是查询中别名的可能性。问题不在于查询目录和查找匹配的表/列。更重要的是解析SQL语句以查找from子句中使用的片段,这些片段可能会根据语句的不同而有所不同。OP表明某些用例将比问题中的示例更复杂。@JoelCoehoorn,如果我们使用查询,请从[dbo].[patients],[dbo].results]中选择[firstName],[result],然后,不,没有别名。当然,也就是OP提供的查询。然而,这确实让OP深入了解了如何使用sys表,并帮助他们找到自己的列。但是,正如其他人所说,编写SQL的人真的应该把别名放在那里。如果你的答案是这不能回答,这不应该只是投票关闭吗?不。我怎么做X?仍然可以是一个有效的问题,即使你不能是正确的答案。
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';