#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