【问题标题】:Issue involving columns with the same name涉及同名列的问题
【发布时间】:2013-03-05 22:28:20
【问题描述】:

我正在尝试在 C# 中创建一个涉及两个单独表的视图,其中一个字段在两个表中具有相同的名称。无法更改列名,也不能仅为视图创建新的列名。这是因为不能以任何方式修改数据。我收到以下错误:

每个视图或函数中的列名必须是唯一的。
视图或函数“Testing”中的列名“Child_ID”被指定了多次。

在线搜索显示这是因为所有列都必须是唯一的。但是,当我尝试在每个违规列之前添加相应的表名时,仍然返回错误。有没有办法解决这个问题?我根本无法更改列名。

【问题讨论】:

  • c# 中的“视图”非常模糊。请显示一些代码。
  • 即使您可以在一个视图中有两个名为 Child_ID 的列 - 而您已经知道不能 - 您认为查询 SELECT Child_ID FROM dbo.MyView 应该返回什么?一列(哪一列?),两列(按什么顺序?)还是别的?即使在非常抽象的层面上,也很难看出这是如何工作的。
  • @Pondlife - 通常在字段之前在方括号中指定相应的表名,然后在正常的选择语句中工作。我希望这里也是如此
  • @DotNET 不,这是不可能的。查询不需要存储元数据,但视图需要。视图存储元数据时,需要定义unique列名。
  • 感谢@AaronBertrand。解决时间到了。

标签: c# .net sql sql-server database


【解决方案1】:

好吧,如果Child_ID 在两个表中具有相同的值(我假设这是来自连接),那么您只需将其中一个排除在外。两者都返回有什么意义?

如果Child_ID 具有不同的 值,那么首先我会怀疑它们是否应该被称为相同的东西,但假设这是有原因的,请使用别名。

SELECT 
  Child_ID_FromTable1 = Table1.Child_ID, 
  Child_ID_FromTable2 = Table2.Child_ID
...

您的查询构建器需要识别多个表具有相同列名的情况,并且:

  1. 以某种预先确定的方式自动分配别名(如上所示,这并不难);
  2. 强制用户为一列或两列选择别名;或者,
  3. 强制用户选择一个或另一个从输出列表中删除。

【讨论】:

  • 不幸的是,别名并不是一个真正的选择。是否可以使用原始非别名值查询视图?
  • @DotNET 抱歉,我没有关注您的问题。正如蒂姆所说,something 必须解决这个问题——这里没有魔法。您的查询构建器必须保留重复的列,或者必须分配别名。
【解决方案2】:

为什么不使用列Aliases

SELECT T1.Child_ID AS T1ChildID, T2.Child_ID AS T2ChildID,...

【讨论】:

  • 我不能使用别名,因为我的 C# 应用程序是一个接受任何数据库作为输入的查询生成器。那么用户如何使用别名进行查询呢?
  • 那么你的 C# 应用程序必须处理这个问题。查询构建器必须确保所有列名都是唯一的。
  • 是否可以使用原始非别名值查询视图?
  • 例如 - SELECT Child_ID FROM View_Name ,而视图已经为“Child_ID”设置了别名。
  • @DotNET 不,这是不可能的。当然,您可以随时尝试,但您会得到一个无效的列名。为什么您希望您的查询构建器像这样懒惰?最终用户将如何处理两个名为 Child_ID 的列?
猜你喜欢
  • 1970-01-01
  • 2023-03-05
  • 2014-05-29
  • 2020-05-14
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多