【问题标题】:Resolving Ambiguos columns without Ailas解决没有别名的不明确列
【发布时间】:2017-05-02 08:11:21
【问题描述】:

我有一个动态查询,其中选择列是动态准备的。由于这是一个通用代码并且我有一些特定的列选择,我必须根据我的查询放置别名。 为此,我不得不使用字符串替换。

我想知道 SQL Server 中是否有一个规定可以解决不带别名的不明确列。

即当有歧义时,总是从 Table1 中获取值。

DECLARE @ColumnNames VARCHAR(1000)                                        
DECLARE @SQLStmt VARCHAR(MAX)

--下面我正在获取以逗号分隔的列名列表 'Id,Name,Salary'....

SELECT @ColumnNames = testDB.dbo.testfuncion(45)

SET  @SQLStmt =   'SELECT '+@ColumnNames+' FROM Table1 LEFT Join Table2 ON Table1.ID = Table2.ID'

两个表中都存在名称,但可以说表 2 的匹配记录较少。所以我一直想从 Table1 中获取 Name。

无论如何,我们可以使用任何内置子句在一个特定表上设置首选项。

【问题讨论】:

  • 查询不清楚。您不需要使用任何类型的字符串替换来执行查询 - 这是引入转换或 SQL 注入漏洞的可靠方法。 AS someOtherName 关键字已经可以使用别名。看起来生成查询的 code 失败了。为什么不直接使用支持 LINQ 的 ORM,比如 EF?
  • 不,没有自动化...由于您的查询是动态生成的,您可以使用带有表名的通用别名(例如AS Table1_Name),或者您可以使用Table1.*并添加Table2 的所有列,在 INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='Table1' 中找不到它们的名称
  • table two has less matching records => 这句话没有任何意义。匹配的记录在两个表中都是通用的。你是说桌数吗?
  • 抱歉,没有功能会自动优先选择同名的一列。
  • 这个函数在做什么:testDB.dbo.testfuncion(45)45 是什么?我很确定,您的问题有更好的解决方案。阅读XY-Problem

标签: sql-server tsql aliases


【解决方案1】:

只需在列前加上真实的表名,如下所示:

SET @SQLStmt = 'SELECT Table1.'+REPLACE(@ColumnNames,',',',Table1.')+' FROM Table1 LEFT Join Table2 ON Table1.ID = Table2.ID'

这应该把你的Id,Name,Salary字符串变成Table1.Id,Table1.Name,Table1.Salary

【讨论】:

  • 这还不够,如果此选择用于 1) 作为子选择,2) 创建视图,3) 创建 TVF 或 4) 用于 CTE。在所有这些情况下,返回的列名必须是唯一的......
  • @Shnugo OP 中没有提到这一点,所以我不知道这是一个重要因素。
  • 您说得对,OP 中没有提到这一点...我只是想指出一个事实,即您的建议对于许多情况来说是不够的...但这可能是一个很好的虽然回答...
  • @Shnugo 够公平的。无论如何,问题已经更新,所以也许我的新编辑就足够了。我们会看到的! XD
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多