Member 10726045 Ответов: 2

Я сталкиваюсь с ошибкой в конце цикла while


use [demo]

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date, ,>
-- Description:	<Description, ,>
-- =============================================
CREATE FUNCTION dbo.isdetain(@cursem tinyint,@bck1 tinyint,@bck2 tinyint,@bck3 tinyint,@bck4 tinyint,@bck5 tinyint,@bck6 tinyint,@bck7 tinyint,@bck8 tinyint,@bck9 tinyint,@bck10 tinyint)
returns tinyint
as  
begin 
	declare @isdetain bit
	declare @finalvar tinyint=@cursem-2
	declare @coun tinyint=0
	declare @bck varchar(5)='bck'+@finalvar
	set @isdetain=null 
		while @finalvar>0
		BEGIN
			set @coun+= cast(@bck as tinyint);
			set @finalvar--;
		END

	if @coun>=4
		set @isdetain=1;
	else
		set @isdetain=0;
	
	return @coun;
	end
GO


Что я уже пробовал:

Код выше я уже пробовал, но я столкнулся с ошибкой в конце цикла while

2 Ответов

Рейтинг:
2

OriginalGriff

В SQL нет оператора " -- " - вместо этого "--" указывает на начало комментария.
То, что вам нужно, это:

SET @Finalvar = @Finalvar - 1;


[редактировать]
Но даже с этим исправленным кодом он не будет работать: вы получите ошибку преобразования на yoru CAST:
set @coun+= cast(@bck as tinyint);
Потому что значение в @bck это не число:
declare @bck varchar(5)='bck'+@finalvar

[/редактировать]


Member 10726045

У меня есть переменное значение из bck1,...bck10. и мне нужно подсчитать до значения finalvar... например, если finalvar=5,то я возьму сумму только из bck1,..., bck5

OriginalGriff

Может быть, вы хотите попытаться точно объяснить, чего вы пытаетесь достичь, а не просто "стенографическую" версию, которая не имеет никакого смысла без контекста вашего проекта, о котором у нас нет никакой информации?

Member 10726045

Проблема стенографического оператора была решена но теперь проблема преобразования varchar в tinyint появилась в переменной bck

Member 10726045

до последней переменной мне нужно взять суммирование переменной "bck". например,если finalvar=6,то суммирование будет иметь значения bck1,bck2,bck3, bck4, bck5 и bck6

OriginalGriff

Вы не можете сделать это "автоматически" - вы не можете "получить" содержимое переменной с помощью строки, содержащей ее имя, не создав полный оператор SQL и не выполнив его в среде, которая также имеет переменные, переданные ей.

Забудьте об этом плане: он не будет работать без большого количества ошибок и сложного в обслуживании кода.

Вместо этого используйте простой оператор CASE WHEN для "жесткого кодирования" значений:
https://www.w3schools.com/sql/sql_case.asp

SET @RESULT = CASE WHEN @finalvar = 1 THEN @bck1
                   WHEN @finalvar = 2 THEN @bck1 + @bck2
                   WHEN @finalvar = 3 THEN @bck1 + @bck2 + @bck3 
                   WHEN @finalvar = 4 THEN @bck1 + @bck2 + @bck3 + @bck4
                   ...
              END;


Это будет быстрее, проще в обслуживании и ... .. это сработает с первой попытки ...

Рейтинг:
0

phil.o

--, в SQL означает начало строки комментария.
SQL не поддерживает оператор инкремента/декремента.
Вместо

set @finalvar--;
ты должен писать
set @finalvar = @finalvar - 1;


Aarti Meswania

5ed! :)

phil.o

Спасибо :)