CREATE FUNCTION 失败,因为未指定列名,但定义了别名
Posted
技术标签:
【中文标题】CREATE FUNCTION 失败,因为未指定列名,但定义了别名【英文标题】:CREATE FUNCTION fails because column name is not specified, but aliases are defined 【发布时间】:2018-03-15 12:25:42 【问题描述】:我正在尝试创建一个基本上是这样的函数:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [db].[do_stuff]
(
@identifier nvarchar(255),
@code nvarchar(255)
)
RETURNS TABLE
AS
RETURN
Select distinct
(p.fname + ' ' + p.lname ) as fullname,
p.person_no as ID,
p.username as login,
tmp.title as rank,
act.action_status as actstats,
act.completion_date as completedon
From db.CMT_PERSON p
INNER JOIN db.TableA act on p.id=act.party_id
INNER JOIN db.TableB tmp on act.id=tmp.id
LEFT OUTER JOIN db.TableC eq on tmp.id=eq.id2
WHERE (p.person_no=@identifier or p.username=@identifier)
and act.action_status=200
and (Select top 1 ot.id as selected
FROM db.TableG tc
INNER JOIN db.TableD e on tc.codeification_id=e.id
INNER JOIN db.TableE gc on gc.track_id=tc.id
INNER JOIN db.TableF ep on gc.id=ep.owner_id
INNER JOIN db.TableB ot on ot.id=ep.part_id
WHERE e.id=@code and (ot.id = tmp.id or ot.id = eq.id1))
is not null
Order by act.completion_date desc
FOR XML AUTO
GO
请注意,这应该返回的每一列似乎都有一个别名,包括用户定义的列“fullname”。然而,在尝试构建函数时,我继续收到此错误:
CREATE FUNCTION failed because a column name is not specified for column 1.
我是否留下了一个未定义的列并且我没有看到它,或者是与 select 语句有关的某些问题导致了问题?
【问题讨论】:
for xml auto
将结果集转换为未命名列中的 XML 块。
这确实是问题所在,但无论如何我们不得不放弃它,并用 c# 中的内联 sql 字符串文字临时替换它。我之前的程序员“防御性地”编码,试图人为地建立工作安全性或隐藏他们不知道的东西,我们发现需要对一个巨大的应用程序进行全面重构才能允许它使用除 CommandType.Text 之外的任何东西。
【参考方案1】:
我认为 Damien_The_Unbeliever 是对的,您在函数内部运行的查询不是返回表,而是返回 XML 结果。您可能希望将函数类型从内联表值函数切换为标量:https://docs.microsoft.com/en-us/sql/t-sql/statements/create-function-transact-sql
【讨论】:
以上是关于CREATE FUNCTION 失败,因为未指定列名,但定义了别名的主要内容,如果未能解决你的问题,请参考以下文章