2010-06-21 161 views
0

我在尝试在存储过程的SQL中设置变量时遇到问题。我正在检查一个记录是否设置为活动状态,并且想法是将其设置为非活动状态,反之亦然。SQL存储过程问题

诚然,我不是最好的SQL和尝试CASE语句与我一起例子,但是没有什么工作......

有人能告诉我,我错过了什么???

谢谢!

ALTER Procedure [dbo].[spAlterStatus] 
@CID as int, 
@Active varchar(10) 
AS 

select @Active = Active from Course where 
CID = @CID; 

if @Active='0' set @Active = '1'; 
if @Active='1' set @Active = '0'; 


UPDATE Course 
SET Active = @Active WHERE CourseID = @CourseID 
+0

什么方言SQL什么服务器(MySQL,PostGreSQL,Oracle,SQLServer等)? – ircmaxell 2010-06-21 16:11:29

+0

@ircmaxell他有标记[sql-server] – 2010-06-21 16:12:32

+0

明显的标志:您的更新引用@CourseID,而参数是@CID。 另外,你确定select的返回总是为'1'或'0'吗?您没有任何其他值或填充的catch/case,并且会在这些情况下静默地将该行更新为相同的值。 – Joe 2010-06-21 16:12:59

回答

0

我不是100%肯定,你想要做什么,但确实这项工作更好:

ALTER Procedure [dbo].[spAlterStatus] 
    (
    @CID int, 
    @Active varchar(10) 
    ) 
AS 

SET @Active = (select Active from Course where CID = @CID) 

if @Active= '0' 
    BEGIN 
    set @Active = '1'; 
    END 
ELSE IF @Active= '1' 
    BEGIN 
    set @Active = '0'; 
    END 

UPDATE Course 
SET Active = @Active 
WHERE CourseID = @CID 
+0

然后如果有可能获得除1或0之外的其他东西积极的,但在另一个案件在那里 – Kyra 2010-06-21 16:14:31

+0

感谢所有,我对我的问题如此模糊,但我拉我的头发有点沮丧和时间不足,我很抱歉... 感谢所有! – wali 2010-06-21 16:25:02

1

这应该工作,也许你可以重命名CID/CourseID。我认为它应该是同一个领域。

ALTER Procedure [dbo].[spAlterStatus] 
@CID as int, 
@Active varchar(10) 
AS 

select @Active = CASE Active WHEN '0' THEN '1' ELSE '0' END AS Act from Course where 
CID = @CID; 

UPDATE Course 
SET Active = @Active WHERE CID = @CID 
+0

你在'FROM'之前缺少'END' ...... – 2010-06-21 16:15:44

+0

谢谢,编辑。不知道确切的,但可能是你必须使用'AS Act'来工作。我记得使用没有'AS'的情况下的错误。 – Marks 2010-06-21 16:18:50

2

这是一个问题:

if @Active='0' set @Active = '1'; 
if @Active='1' set @Active = '0'; 

这两条语句执行此起彼伏:所以@Active总是最终成为 '0'。

尝试是这样的:

if @Active='0' set @Active = '1'; 
else set @Active = '0'; 
3

我不知道为什么每个人都选择和更新 - 你可以做到这一切在一个操作:

ALTER Procedure [dbo].[spAlterStatus] 
    @CID as int 
AS 
    UPDATE Course 
    SET Active = CASE WHEN Active = '0' THEN '1' ELSE '0' END 
    WHERE CourseID = @CID