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 失败,因为未指定列名,但定义了别名的主要内容,如果未能解决你的问题,请参考以下文章

MySQL CREATE FUNCTION 在共享网络服务器上失败

表分区的操作三步走:

未创建外键

PHP 中的闭包或 create_function

Memcpy 上未指定的启动失败

如何修复“构建失败:未指定 Android SDK 目录,正在退出。”