最近一直在處理存儲過程的問題,一個很大的問題就是構建大量的類似結構、類似功能的存儲過程,大部分都是重復性勞動,想要直接用程序通過存儲過程去構建這類的存儲過程,卻由于開發(fā)體系的局限,不能完全的控制,只好用程序控制參數(shù),由存儲過程來構建具體的存儲過程。
IF (LEN(@strName)>0)
BEGIN
--清理以前的存儲過程
IF EXISTS (SELECT * FROM dbo.sysobjects where id = object_id(@strName) and OBJECTPROPERTY(id, N‘IsProcedure‘) = 1)
BEGIN
SET @strSQL= N‘DROP PROCEDURE ‘ + @strName + ‘ ‘
IF (@isDEBUG>0)
PRINT(@strSQL)
EXEC(@strSQL)
END
IF (@intTPL=1)
BEGIN
--模板 分頁列表
IF (@isDEBUG>0)
PRINT(‘TEMPLETE:‘+CONVERT(varchar(11),@intTPL))
SET @strSQL = N‘CREATE PROCEDURE ‘ + @strName + @strSPLIT +
‘@intPages int = 1,‘ + @strSPLIT + --頁碼,0 取出分頁數(shù)據(jù) 1 取出具體頁碼信息
‘@intRecordPerPage int = 10,‘ + @strSPLIT + --每頁記錄數(shù)
‘@strOrderBy nvarchar(200) = ‘‘‘‘,‘ + @strSPLIT + --排序條件
‘@strMobile varchar(15) = ‘‘‘‘,‘ + @strSPLIT + --關鍵字 手機號
‘@dateBeginDate datetime = ‘‘‘‘,‘ + @strSPLIT + --起始時間
‘@dateEndDate datetime = ‘‘‘‘‘ + @strSPLIT + --結束時間
‘AS‘ + @strSPLIT +
‘DECLARE @strSQL nvarchar(4000)‘ + @strSPLIT + --SQL語句
‘DECLARE @strSQLAddOn nvarchar(1000)‘ + @strSPLIT + --附加SQL語句
‘DECLARE @intRecordBegin int‘ + @strSPLIT + --開始記錄數(shù)
‘DECLARE @intTotalRecord int‘ + @strSPLIT + --總記錄數(shù)
‘DECLARE @intMaxPage int‘ + @strSPLIT + --最大頁數(shù)
‘DECLARE @isDEBUG bit‘ + @strSPLIT + --DEBUG信息輸出 0 不輸出 1 輸出
‘SET @isDEBUG = 0‘ + @strSPLIT +
‘SET @intTotalRecord = 0‘ + @strSPLIT +
‘SET @strSQLAddOn = ‘‘‘‘‘ + @strSPLIT +
‘IF (@intRecordPerPage<0)‘ + @strSPLIT +
‘SET @intRecordPerPage = 10‘ + @strSPLIT +
‘IF (LEN(@strMobile)>0)‘ + @strSPLIT +
‘SET @strSQLAddOn = @strSQLAddOn + ‘‘AND ‘ + @strVar08 + ‘ =‘‘‘‘ + @strMobile + ‘‘‘‘ ‘‘‘ + @strSPLIT +
‘IF (@dateBeginDate < ‘‘2000-01-01‘‘)‘ + @strSPLIT +
‘SET @dateBeginDate = ‘‘2000-01-01‘‘‘ + @strSPLIT +
‘IF ((@dateEndDate < @dateBeginDate) OR (@dateEndDate > getdate()) )‘ + @strSPLIT +
‘SET @dateEndDate = getdate()‘ + @strSPLIT +
‘SET @strSQLAddOn = @strSQLAddOn + ‘‘ AND ( ‘ + @strVar06 + ‘ BETWEEN ‘‘‘‘‘‘ + CONVERT(varchar(22),@dateBeginDate,20) + ‘‘‘‘‘‘ AND ‘‘‘‘‘‘ + CONVERT(varchar(22),@dateEndDate,20) + ‘‘‘‘‘‘ ) ‘‘‘ + @strSPLIT +
‘IF (LEN(@strOrderBy) < 1)‘ + @strSPLIT +
‘SET @strOrderBy = ‘‘‘ + @strVar05 + ‘ DESC‘‘‘ + @strSPLIT +
‘SET ANSI_NULLS ON‘ + @strSPLIT +
‘SET ANSI_WARNINGS ON‘ + @strSPLIT +
‘SET NOCOUNT ON‘ + @strSPLIT +
‘SET @strSQL = N‘‘SELECT @intTotalRecord=ISNULL(COUNT(*),0) ‘‘ +‘ + @strSPLIT +
‘‘‘FROM ‘ + @strVar01 + @strVar03 + @strVar02 + @strVar04 +‘ ‘‘ + ‘ + @strSPLIT +
‘‘‘WHERE 1=1 ‘‘ + @strSQLAddOn‘ + @strSPLIT +
‘IF (@isDEBUG>0)‘ + @strSPLIT +
‘PRINT(@strSQL)‘ + @strSPLIT +
‘EXECUTE sp_executesql @strSQL,N‘‘@intTotalRecord int OUTPUT‘‘,@intTotalRecord OUTPUT‘ + @strSPLIT +
‘IF (@intPages < 1 )‘ + @strSPLIT +
‘BEGIN‘ + @strSPLIT +
‘SET @strSQL = ‘‘SELECT ‘‘ + CONVERT(varchar(11),@intTotalRecord)+ ‘‘ AS TotalRecord ‘‘‘ + @strSPLIT +
‘END‘ + @strSPLIT +
‘ELSE‘ + @strSPLIT +
‘BEGIN‘ + @strSPLIT +
‘SET @intMaxPage = (@intTotalRecord)/(@intRecordPerPage)‘ + @strSPLIT +
‘SET @intMaxPage = CAST(@intMaxPage AS int)‘ + @strSPLIT +
‘IF ((@intTotalRecord%@intRecordPerPage)>0)‘ + @strSPLIT +
‘SET @intMaxPage = @intMaxPage + 1‘ + @strSPLIT +
‘IF (@intPages>@intMaxPage)‘ + @strSPLIT +
‘SET @intPages = @intMaxPage‘ + @strSPLIT +
‘IF (@intPages<1)‘ + @strSPLIT +
‘SET @intPages = 1‘ + @strSPLIT +
‘SET @intRecordBegin=@intRecordPerPage*(@intPages-1)‘ + @strSPLIT +
‘SET @strSQL = ‘‘SELECT TOP ‘‘ + CONVERT(varchar(11),@intRecordPerPage)+ ‘‘ ‘ + @strVar05 + ‘,CONVERT(varchar(23),‘ + @strVar06 + ‘,21) AS ‘ + @strVar06 + ‘,‘ + @strVar07 + ‘,‘ + @strVar08 + ‘,‘ + @strVar09 + ‘,‘ + @strVar10 + ‘ ‘‘ +‘ + @strSPLIT +
‘‘‘FROM ‘ + @strVar01 + @strVar03 + @strVar02 + @strVar04 + ‘ ‘‘ +‘ + @strSPLIT +
‘‘‘WHERE (‘ + @strVar05 + ‘ NOT IN ‘‘ +‘ + @strSPLIT +
‘‘‘(SELECT TOP ‘‘ + CONVERT(varchar(11),@intRecordBegin) + ‘‘ ‘ + @strVar05 + ‘ ‘‘ +‘ + @strSPLIT +
‘‘‘FROM ‘ + @strVar01 + @strVar03 + @strVar02 + @strVar04 + ‘ ‘‘ +‘ + @strSPLIT +
‘‘‘WHERE 1=1 ‘‘ + @strSQLAddOn + ‘‘ ‘‘ +‘ + @strSPLIT +
‘‘‘ORDER BY‘‘ + @strOrderBy+‘‘) ) ‘‘ + @strSQLAddOn +‘ + @strSPLIT +
‘‘‘ORDER BY‘‘ + @strOrderBy + ‘‘ ‘‘‘ + @strSPLIT +
‘END‘ + @strSPLIT +
‘IF (@isDEBUG>0)‘ + @strSPLIT +
‘PRINT(@strSQL)‘ + @strSPLIT +
‘EXECUTE(@strSQL)‘ + @strSPLIT +
‘SET NOCOUNT OFF‘
IF (@isDEBUG>0)
PRINT(‘SQL:‘+@strSQL)
IF (@isDEBUG>0)
PRINT(‘LENGTH:‘+CONVERT(varchar(11),LEN(@strSQL)))
EXEC(@strSQL)
END
END