请大家提供一些写得好的sql PROCEDURE(就是执行效率比较高的)的样例。
比如一些开源项目中的存储过程的部分,什么asp程序,asp.net程序很多开源项目的数据库部分。
本人写的很多代码感觉效率太低了,求救阿!
duration>3000,太慢了。
贴出几个吧:
ALTER PROCEDURE UsersTopNGet
(
@TopN int=5,
@AdditionPermission bigint = 0, --附加权限
@ClassCode nvarchar(64)='0000', --行业代码
@Language varchar(8)='zh-CN',
@RoleID smallint = 0,
@RoleType smallint = 0,
@AreaCode nvarchar(32) = '0000',
@SortPostsBy smallint = 0,
@SortOrder smallint = 1,
@TradeType smallint = 0
)
AS
DECLARE @sql varchar(4000)
SET @sql = 'SELECT TOP '+CAST(@TopN AS VARCHAR(3))+' U.*, AC.*, Country = dbo.Fn_GetAreaName(U.AreaCode,1,''' + @Language + '''),Province = dbo.Fn_GetAreaName(U.AreaCode,2, ''' + @Language + '''),
City = dbo.Fn_GetAreaName(U.AreaCode,3,''' + @Language + '''),Town = dbo.Fn_GetAreaName(U.AreaCode,4,''' + @Language + ''') FROM V_CompanyRoles U
LEFT OUTER JOIN AreaCode AC ON AC.AreaCode = U.AreaCode AND AC.Language = ''' + @Language + '''
WHERE U.Language = ''' + @Language + ''' AND CompanyIntroStatus=2'
IF(@RoleType=1)
SET @sql = @sql + ' AND ('+CAST(@RoleID AS VARCHAR(1))+'=0 OR U.RoleID <='+CAST(@RoleID AS VARCHAR(3))+')'
ELSE IF(@RoleType=2)
SET @sql = @sql + ' AND ('+CAST(@RoleID AS VARCHAR(1))+'=0 OR U.RoleID >='+CAST(@RoleID AS VARCHAR(3))+')'
ELSE
SET @sql = @sql + ' AND ('+CAST(@RoleID AS VARCHAR(1))+'=0 OR U.RoleID ='+CAST(@RoleID AS VARCHAR(3))+')'
IF ((@AdditionPermission IS NOT NULL) AND (@AdditionPermission <> 0))
SET @sql = @sql + ' AND U.UserAdditionPermission & CONVERT(bigint,'+CAST(@AdditionPermission AS VARCHAR(20))+') = CONVERT(bigint,'+CAST(@AdditionPermission AS VARCHAR(20))+')'
IF (@ClassCode<>'' AND @ClassCode<>'0000')
BEGIN
--开始判断行业,最多可以传3个行业
SET @sql = @sql + ' AND ('
DECLARE @tmpClassCode VARCHAR(32)
SET @tmpClassCode = ''
SET @tmpClassCode = dbo.Fn_SplitSubString(@ClassCode,',',0,default)
IF @tmpClassCode <>''
SET @sql = @sql + ' U.CompanyId in (SELECT TCITC.CompanyId FROM TradeCompanyInTradeClass TCITC WHERE TCITC.ClassCode like '''+@tmpClassCode+'%'' OR TCITC.ClassCode=(SELECT TC.ParentClassCode FROM TradeClass TC WHERE TC.ClassCode='''+@tmpClassCode+''' AND TC.Language='''+@Language+'''))'
SET @tmpClassCode = dbo.Fn_SplitSubString(@ClassCode,',',1,default)
IF @tmpClassCode <>''
SET @sql = @sql + ' OR U.CompanyId in (SELECT TCITC.CompanyId FROM TradeCompanyInTradeClass TCITC WHERE TCITC.ClassCode like '''+@tmpClassCode+'%'' OR TCITC.ClassCode=(SELECT TC.ParentClassCode FROM TradeClass TC WHERE TC.ClassCode='''+@tmpClassCode+''' AND TC.Language='''+@Language+'''))'
SET @tmpClassCode = dbo.Fn_SplitSubString(@ClassCode,',',2,default)
IF @tmpClassCode <>''
SET @sql = @sql + ' OR U.CompanyId in (SELECT TCITC.CompanyId FROM TradeCompanyInTradeClass TCITC WHERE TCITC.ClassCode like '''+@tmpClassCode+'%'' OR TCITC.ClassCode=(SELECT TC.ParentClassCode FROM TradeClass TC WHERE TC.ClassCode='''+@tmpClassCode+''' AND TC.Language='''+@Language+'''))'
SET @sql = @sql + ')'
END
IF (@AreaCode<>'' AND @AreaCode<>'0000')
SET @sql = @sql + ' AND U.AreaCode LIKE '''+@AreaCode+'%'''
IF (@TradeType<>0)
SET @sql = @sql + ' AND U.TradeType='+CAST(@TradeType AS VARCHAR(2))
IF(@SortPostsBy=0)
SET @sql = @sql + ' ORDER BY U.CompanyId'
ELSE IF(@SortPostsBy=1)
SET @sql = @sql + ' ORDER BY U.DateTradeCreated'
ELSE IF(@SortPostsBy=5)
SET @sql = @sql + ' ORDER BY U.EndDate'
ELSE IF(@SortPostsBy=9)
SET @sql = @sql + ' ORDER BY U.DateTradeBegin'
IF(@SortOrder=1)
SET @sql = @sql + ' DESC'
print(@sql)
EXEC(@sql)
=================================================================================