内联函数,每个视图或函数中的列名必须唯一

Posted

技术标签:

【中文标题】内联函数,每个视图或函数中的列名必须唯一【英文标题】:Inline Function, Column names in each view or function must be unique 【发布时间】:2020-02-26 12:47:34 【问题描述】:

我已经加入了这两个表,现在我想将该语句保存在函数中,以便我可以再次使用它 然后再次。我尝试按如下方式创建函数:-

create function fn_electricalsem1and2()
returns table
as
return (
      Select * 
      from [Electrical Semester 1 Regular] as T1 
      inner join[Electrical Semester 2 Regular] As T2 On T1.department_id= T2.department_id
)

现在我收到错误

每个视图或函数中的列名必须是唯一的。列名 视图中的“名称”或功能“fn_electricalsem1and2”被指定更多 不止一次。

到现在我还没有做任何函数,但是为什么我得到错误函数必须是唯一的?

【问题讨论】:

Bad habits to kick : using SELECT * / omitting the column list - 顺便说一句,如果这个函数是无参数的,那么作为视图而不是函数可能更有意义。无论哪种方式,您都需要明确说明要返回的列,而不是使用SELECT * 一些你可能希望改掉的坏习惯 - using dashes and spaces in entity names - using table aliases like (a, b, c) or (t1, t2, t3), avoiding the schema prefix 【参考方案1】:

这是因为你的函数返回一个表,并且在一个表中所有的列名都应该是唯一的。

解决问题需要更换

Select *

Select t1.column1 as Col1, t1.column2, t2.column1 as Col2, ...and so on

在您的情况下,department_id 在两个表中都可用。此外,这两个表都包含一列名称:name

【讨论】:

我的 Select 语句是正确的,它也可以工作,但我的主要问题是我无法创建函数 @Awesome 我是说在创建函数时使用别名和列名作为 t1.name 作为 t1name,t2.name 作为 t2Name 等。它给出错误,因为函数返回一个表并且在表中所有列名都应该是唯一的。 @Awesome 我认为 select 语句返回结果集而不是表,因此在 select 中即使有多个同名列也不会给出错误。【参考方案2】:

在以下查询中, 我们将首先创建表格并填充一些数据。

CREATE TABLE [Electrical Semester 1 Regular](department_id INT);
CREATE TABLE [Electrical Semester 2 Regular](department_id INT);
INSERT INTO [Electrical Semester 1 Regular]
VALUES(1);
INSERT INTO [Electrical Semester 2 Regular]
VALUES(1);

当我们执行以下查询时,您不会遇到任何错误;

 Select * 
 from [Electrical Semester 1 Regular] as T1 
      inner join[Electrical Semester 2 Regular] As T2 On T1.department_id= T2.department_id

+---------------+---------------+
| department_id | department_id |
+---------------+---------------+
|             1 |             1 |
+---------------+---------------+

但是,由于 [Electrical Semester 1 Regular][Electrical Semester 2 Regular] 的列名相同,因此以下查询返回错误。在 SQL Server 中,如果我们想创建一个视图或函数,我们必须使用别名给出唯一的名称

create function fn_electricalsem1and2()
returns table
as
return (
      Select * 
      from [Electrical Semester 1 Regular] as T1 
      inner join[Electrical Semester 2 Regular] As T2 On T1.department_id= T2.department_id
)

在 SQL Server 中,如果我们要创建视图或函数,我们必须给出唯一的名称。您可以使用别名启用它,以便您可以更改查询,如下所示;

create function fn_electricalsem1and2()
returns table
as
return (
      Select t1.department_id as t1_department_id , t2.department_id as t2_department_id
      from [Electrical Semester 1 Regular] as T1 
      inner join[Electrical Semester 2 Regular] As T2 On T1.department_id= T2.department_id
)

GO
select * from fn_electricalsem1and2()


    +------------------+------------------+
    | t1_department_id | t2_department_id |
    +------------------+------------------+
    |                1 |                1 |
    +------------------+------------------+

【讨论】:

以上是关于内联函数,每个视图或函数中的列名必须唯一的主要内容,如果未能解决你的问题,请参考以下文章

内联函数和视图之间的区别

类中的静态内联函数

内联函数对作用

ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效,除非 TOP、OFFSET 或 FOR XML

如何在视图中连接多个表

ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效