一、表结构如下:
CREATE TABLE [dbo].[temp] 
([lngID] [int] IDENTITY (1, 1) NOT NULL ,[strName] [nvarchar] (30))二、存储过程
CREATE PROCEDURE temp@strName NVARCHAR(30)=NULL,
@lngID INT  OUTPUTAS
DECLARE @SQL NVARCHAR(4000)
DECLARE @ID INT……三、问题:
我想要通过传入@strName值返回@lngID值,
@strName与@lngID的关系为:"SELECT lngID FROM temp WHERE strName=@strName",
怎样才是高效的写法?曾经想过用CASE,但如下所示,ELSE后不知怎样写了……         SELECT @lngID= 
CASE  
WHEN ISNULL(@strCustom0Code,N'')=N'' THEN 0
WHEN @strName=N'' THEN 0
ELSE 
              ……(兄弟们帮我在这儿补齐吧)
END/*
我通常是这样写的,如何把下面这段代码加入ELSE后面呢? 
SET @SQL=N'Select @ID=lngID From temp
Where strName=@strName' EXEC SP_EXECUTESQL @SQL,
N'@ID INT OUTPUT,@strName NVARCHAR(30)',
@ID OUTPUT,@strName

IF ISNULL(@ID,0)<1 
BEGIN
SET @lngErrCode=9311--传入参数@strName有错
RETURN 
END)
                  SET @lngID=@ID
*/
GO

解决方案 »

  1.   

    SELECT @lngID= 
    CASE  
    WHEN ISNULL(@strCustom0Code,N'')=N'' THEN 0
    WHEN @strName=N'' THEN 0
    ELSE 
                  (SELECT top 1 lngID FROM temp WHERE strName=@strName)
    END
      

  2.   

    set @lngID = (SELECT lngID FROM temp WHERE strName=@strName)
    RETURN @lngID
      

  3.   

    set @lngID = (SELECT lngID FROM temp WHERE strName=@strName)
    ----------------
    不用写return的.
      

  4.   

    set @lngID = (SELECT lngID FROM temp WHERE strName=@strName)
      

  5.   

    CREATE PROCEDURE temp@strName NVARCHAR(30)=NULL,
    @lngID INT OUTPUTAS
    select @strname = isnull(@strname,'')
    SELECT @lngID= isnull((select top 1 lngID FROM temp WHERE strName=@strName,0)if @lngID<1
        return 9311  -- @lngErrCode变量不知道你在哪里定义的?
    else 
        return 0
    end好像没什么效率问题吧
      

  6.   

    哦,不对,你strname可能有''的记录。改:CREATE PROCEDURE temp@strName NVARCHAR(30)=NULL,
    @lngID INT OUTPUTAS
     SELECT @lngID=
    CASE
    WHEN ISNULL(@strName,N'')=N'' THEN 0   -- @strCustom0Code是你的笔误吧,没看到这个变量
    WHEN @strName=N'' THEN 0
    ELSE
     (SELECT top 1 lngID FROM temp WHERE strName=@strName)
    ENDif isnull(@lngID,0) < 1
    return 9311 -- @lngErrCode变量不知道你在哪里定义的?
    else
    return 0
    end
      

  7.   

    哈,还是白天人多,刚醒来就看到这么多的回贴,可怜我昨晚等到3点……
    OK,抖搂一下精神,回楼上:上面的表和存储过程是经过我简化,只是为求能够说明问题。把原版的全贴出来,太长了,是要挨抽的^-^,@lngErrCode是自定义的错误码,是要返回应用程序的,是我没讲清楚,不好意思。
    请问:ELSE后面能处理动态SQL语句吗?怎样写法?我试了几次都出错。之所以一定要动态SQL而不是(SELECT top 1 lngID FROM temp WHERE strName=@strName),是考虑代码移植,我们的编码规则是能用动态SQL就决不直接SELECT,这样代码移植或者应用程序传入参数时就只修改几个参数就可以了。