一、表结构如下:
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
CASE
WHEN ISNULL(@strCustom0Code,N'')=N'' THEN 0
WHEN @strName=N'' THEN 0
ELSE
(SELECT top 1 lngID FROM temp WHERE strName=@strName)
END
RETURN @lngID
----------------
不用写return的.
@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好像没什么效率问题吧
@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
OK,抖搂一下精神,回楼上:上面的表和存储过程是经过我简化,只是为求能够说明问题。把原版的全贴出来,太长了,是要挨抽的^-^,@lngErrCode是自定义的错误码,是要返回应用程序的,是我没讲清楚,不好意思。
请问:ELSE后面能处理动态SQL语句吗?怎样写法?我试了几次都出错。之所以一定要动态SQL而不是(SELECT top 1 lngID FROM temp WHERE strName=@strName),是考虑代码移植,我们的编码规则是能用动态SQL就决不直接SELECT,这样代码移植或者应用程序传入参数时就只修改几个参数就可以了。