【问题标题】:getting error for if/else in a stored procedure在存储过程中出现 if/else 错误
【发布时间】:2012-10-15 08:54:36
【问题描述】:

我对 SQL 查询比较陌生,但我有这个存储过程,我试图获取如下所述的已声明变量的值,但出现错误,

这里第一行是 20,

declare @m_ID_v int
set @m_ID_v = ( select ID_C from M_T where MName_C = @MName_parameter)

declare @g bit
if (select G_L_Column from G_L_table Where M_ID_Column = @M_ID_variable)
    set @g_v = 1
else
    set @g_variable = 0

我得到的异常:

消息 4145,级别 15,状态 1,过程 GetID,第 20 行
在上下文中指定的非布尔类型的表达式 预计条件,接近“设置”。消息 156,级别 15,状态 1, 过程 GetID,第 21 行关键字“else”附近的语法不正确。

现在,如果我删除 declare @g... 并尝试解析它,则不会发生错误

编辑

我希望我的代码通过我的 select 语句检查返回值,因此“如果存在”并不是真正要寻找的,抱歉。

【问题讨论】:

  • 您已经定义了一个名为 @g 的变量,但分配给了一个名为 @g_v@g_variable 的变量.....
  • 对不起,由于公司代码隐私,我更改了那里的名称,对不起,但也感谢您纠正我:)
  • 当您说要检查返回值时,您要检查什么?你的意思是IF ((SELECT x FROM y WHERE z = @v) = @testVariable)?目前你回复G_L_Column,但你没有说你想检查什么。另外,M_ID_Column 是否是唯一的,允许您保证您的查询只返回一行?
  • 是的,它是独一无二的

标签: sql sql-server-2008


【解决方案1】:

尝试使用exists:

declare @g_v bit
if exists(select G_L_Column from G_L_table Where M_ID_Column = @M_ID_variable)
   set @g_v = 1
else
   set @g_v = 0

【讨论】:

  • 它确实奏效了,我会在 8 分钟内接受你的回答,但你能否也给出一些解释,以及我所做的是否是最佳实践:)
  • @Ignacio,这是检查查询返回一个或多个结果的常用方法。对于另一种情况,您可以将其作为子查询或连接表来避免 if 语句和存在关键字。
  • 对不起,我不是在寻找“如果存在”,因为它不符合我的逻辑
【解决方案2】:
declare @m_ID_v int
set @m_ID_v = ( select ID_C from M_T where MName_C = @MName_parameter)

declare @g bit
if ((select G_L_Column from G_L_table Where M_ID_Column = @M_ID_variable) = value )
    set @g_v = 1
else
    set @g_variable = 0

【讨论】:

    【解决方案3】:

    你不能说

     if (select ...
    

    您必须在if 语句中将某些内容与其他内容进行比较,或者使用诸如exists 之类的布尔函数

    【讨论】:

    • 干杯,如果我有足够的声誉,我会给你+1,无论如何谢谢
    猜你喜欢
    • 2018-05-23
    • 2021-05-22
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 2013-07-10
    • 1970-01-01
    相关资源
    最近更新 更多