СОЗДАТЬ ФУНКЦИЮ не удалось, так как имя столбца не указано для столбца 1. ошибка для параметра Multiple функции - PullRequest
0 голосов
/ 09 января 2020

Хотел создать множественный параметр функции, но он выдает мне эту ошибку:

Не удалось создать функцию, потому что имя столбца не указано для столбца 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)  ;

Ответы [ 2 ]

1 голос
/ 09 января 2020

Как ясно сказано в сообщении об ошибке, столбцу в возвращаемом результате нужно имя. Либо дайте ему псевдоним в SELECT как

SELECT CASE
       ...
       END a_column_name
       ...

, либо определите его в объявлении типа возвращаемого значения, как в

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

Как вы можете видеть во второй форме, вы должны указать тип данных. Поскольку ваш текущий код не имеет особого смысла, сейчас я не могу понять, что является правильным. Вам нужно будет изменить его.

Обратите внимание, что len(rtrim('['+@nameOfColumn+']')) = 0 никогда не соответствует действительности, поскольку len(rtrim('['+@nameOfColumn+']')) либо NULL, когда @nameOfColumn равно NULL, либо, по крайней мере, 2 из-за добавлены скобки.

Если предполагается, что @nameOfColumn - это имя столбца, вы не должны использовать varchar (особенно без указанной длины), но sysname, который является специальным типом для имен объектов.

В любом случае вы должны определить длину для @nameOfColumn и @nameOfParam как просто varchar без какой-либо длины, что означает varchar(1), что, вероятно, не то, что вы хотите. И, возможно, вместо varchar вы хотите nvarchar.

Возможно, вы также захотите посмотреть quotename().

1 голос
/ 09 января 2020

Определить имя столбца в операторе 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, а остальные будут обрезаться.

...