CREATE FUNCTION 失败,因为没有为第 1 列指定列名。函数的 Multiple 参数出错

Posted

技术标签:

【中文标题】CREATE FUNCTION 失败,因为没有为第 1 列指定列名。函数的 Multiple 参数出错【英文标题】:CREATE FUNCTION failed because a column name is not specified for column 1. error for the Multiple parameter of function 【发布时间】:2020-01-09 10:11:49 【问题描述】:

想要创建函数的多个参数,但它给了我这个错误:

CREATE FUNCTION 失败,因为没有为 第 1 列。

代码如下:

create function dmt.Impacted( 
@nameOfColumn varchar ,  @nameOfParam varchar)   
returns table   
as    
return  
(select  
case when '['+@nameOfColumn+']' is null or len(rtrim('['+@nameOfColumn+']')) = 0
then  Convert(nvarchar(2),0) 
else
@nameOfParam end from employee)  ;

【问题讨论】:

为什么错误信息没有告诉你出了什么问题? 【参考方案1】:

正如错误消息中明确指出的,返回结果中的列需要一个名称。在SELECT 中给它一个别名

SELECT CASE
       ...
       END a_column_name
       ...

或在返回类型的声明中定义它

...
RETURNS TABLE
        (a_column_name nvarchar(max)
...

正如您在第二种形式中看到的,您必须指定数据类型。由于您当前的代码现在没有多大意义,我无法弄清楚那里的正确代码是什么。你需要修改它。

请注意,len(rtrim('['+@nameOfColumn+']')) = 0 永远不会为真,因为 len(rtrim('['+@nameOfColumn+']'))NULL,而 @nameOfColumnNULL 或至少是 2,因为添加了括号。

如果 @nameOfColumn 应该是列名,则不应使用 varchar(尤其是没有为其指定长度),而应使用 sysname 这是对象名称的特殊类型。

无论哪种方式,您都应该为@nameOfColumn@nameOfParam 定义一个长度,就像varchar 没有任何长度意味着varchar(1),这可能不是您想要的。也许你想要nvarchar而不是varchar

您可能还想查看quotename()

【讨论】:

【参考方案2】:

SELECT 语句中定义列名:

(select case when '['+@nameOfColumn+']' is null or 
                   len(rtrim('['+@nameOfColumn+']')) = 0
             then  Convert(nvarchar(2),0)
             else  @nameOfParam 
        end as name_column -- define column name
 from employee)

另外,你的函数参数没有数据长度,默认情况下它只接受 1 个字符 @nameOfColumn varchar , @nameOfParam varchar 其余的将被修剪。

【讨论】:

以上是关于CREATE FUNCTION 失败,因为没有为第 1 列指定列名。函数的 Multiple 参数出错的主要内容,如果未能解决你的问题,请参考以下文章

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

PHP 中的闭包或 create_function

UIGesture 在 IOS 中因未知原因失败

将啥传递给 sqlite create_function 任意指针

当模型有构造函数时,Laravel 工厂失败

MFC CDialog::Create 失败