【问题标题】: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”被指定更多 不止一次。

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

【问题讨论】:

标签: sql-server inline-table-function


【解决方案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 |
    +------------------+------------------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 2017-04-03
    • 2021-10-23
    • 1970-01-01
    相关资源
    最近更新 更多