Получение следующей ошибки «ОПЕРАТОРЫ ВЫБОРА, ВКЛЮЧЕННЫЕ В ФУНКЦИЮ, НЕ МОГУТ ВЕРНУТЬ ДАННЫЕ КЛИЕНТУ»

#sql #sql-server #function

#sql #sql-сервер #функция

Вопрос:

Я пытаюсь создать следующую функцию:

 Create function mastercount
(
    @table nvarchar(50)
    , @policy nvarchar(20)
    , @firstname nvarchar(20)
    , @lastname nvarchar (20)
)    
Returns nvarchar (50)
As
Begin
    Declare @count int =''

    If @table ='A'
        Select count (*)
        from A
        where policy = @policy and firstname = @firstname and lastname = @lastname    
    Else If @table ='B'
        Select count (*)
        from A
        where policy = @policy and firstname = @firstname and lastname = @lastname    
    Else If @table ='A'
        Select count (*)
        from A
        where policy = @policy and firstname = @firstname and lastname = @lastname

    Return @count;
End
  

Но я получаю ошибку:

ОПЕРАТОРЫ ВЫБОРА, ВКЛЮЧЕННЫЕ В ФУНКЦИЮ, НЕ МОГУТ ВЕРНУТЬ ДАННЫЕ КЛИЕНТУ

Комментарии:

1. Да, вы не можете сделать это в функции. Как четко указано в сообщении об ошибке. В чем ваш вопрос? Вероятно, вы хотите назначить на @count вместо прямого select

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

3. Мой вопрос в том, как я могу вернуть счетчик без получения этой ошибки, может кто-нибудь, пожалуйста, уточнить это?

4. Мартин уже сказал вам, например, выбрать в переменную

5. Еще лучше, не используйте SELECT для присвоения скалярного значения. Используйте SET. Пример: set @count = (select count(*) from ....); Обратите внимание на завершение инструкции — начните развивать хорошие привычки.

Ответ №1:

Вы могли бы попробовать это таким образом. Переменной @count присваивалась пустая строка. Я изменил это, чтобы значение по умолчанию было равно 0. Кроме того, операторы выбора пытались вернуть записи клиенту. Теперь каждый из них вместо этого присваивается переменной @count.

 Create function mastercount
(
    @table nvarchar(50)
    , @policy nvarchar(20)
    , @firstname nvarchar(20)
    , @lastname nvarchar (20)
)    
Returns int
As
Begin
    Declare @count int=0;

    If @table ='A'
        Select @count=count(*)
        from A
        where policy = @policy and firstname = @firstname and lastname = @lastname    
    Else If @table ='B'
        Select @count=count(*)
        from A
        where policy = @policy and firstname = @firstname and lastname = @lastname    
    Else If @table ='A'
        Select @count=count(*)
        from A
        where policy = @policy and firstname = @firstname and lastname = @lastname

    Return @count;
End