sqlserver存儲過程集錦

sqlserver存儲過程集錦(一)

常用存儲過程集錦,都是一些mssql常用的一些,大家可以根據需要選擇使用。

  =================分頁==========================

  /*分頁查找數據*/
  CREATE PROCEDURE [dbo].[GetRecordSet]
  @strSql varchar(8000),--查詢sql,如select * from [user]
  @PageIndex int,--查詢當頁號
  @PageSize int--每頁顯示記錄
  AS
  set nocount on
  declare @p1 int
  declare @currentPage int
  set @currentPage = 0
  declare @RowCount int
  set @RowCount = 0
  declare @PageCount int

和 "sqlserver存儲過程集錦(一)" 有關的 數據庫 編程小帖士:

strong>LOG

        LOG函數返回數值的非自然對數。

  set@PageCount = 0
  exec sp_cursoropen @p1output,@strSql,@scrollopt=1,@ccopt=1,@rowcount=@rowCount output --得到總記錄數
  select @PageCount=ceiling(1.0*@rowCount/@pagesize) --得到總頁數
  ,@currentPage=(@PageIndex-1)*@PageSize+1
  select @RowCount,@PageCount
  exec sp_cursorfetch @p1,16,@currentPage,@PageSize
  exec sp_cursorclose @p1
  set nocount off
  GO

  =========================用戶註冊============================
  /*
  用戶註冊,也算是添加吧
  */

    Create proc[dbo].[UserAdd]

    (
  @loginID nvarchar(50),     --登錄帳號
  @password nvarchar(50), --密碼
  @email nvarchar(200) --電子信箱
  )
  as
  declare @userID int --用戶編號
  --登錄賬號已經被註冊
  if exists(select loginID from tableName where loginID= @loginID)
  begin
  return -1;
  end
  --郵箱已經被註冊
  else if exists(select email from tableName whereemail = @email)
  begin
  return -2;
  end
  --註冊成功
  else
  begin
  select @userID = isnull(max(userID),100000)+1 fromtableName
  insert into tableName
  (userID,loginID,[password],userName,linkNum,address,email,createTime,status)
  values
  (@userID,@loginID,@password,'','','',@email,getdate(),1)
  return @userID
  end

  =================sql server系統存儲過程================

  –1.給表中字段添加描述信息
  Create table T2 (id int , name char (20))
  GO
  EXEC sp_addextendedproperty 'MS_Description','Employee ID', 'user', dbo, 'table', T2, 'column', id
  EXEC sp_updateextendedproperty 'MS_Description','this is a test', 'user', dbo, 'table', T2, 'column', id
  –2.修改數據庫名稱
  EXEC sp_renamedb 'old_db_name', 'new_db_name'
  –3.修改數據表名稱和字段名稱
  EXEC sp_rename 'old_table_name', 'new_table_name'–修改數據表名稱
  EXEC sp_rename 'table_name.[old_column_name]','new_column_name', 'COLUMN'–修改字段名稱
  –4.給定存儲過程名,獲取存儲過程內容
  exec sp_helptext sp_name
  /*以下是有關安全控制的系統存儲過程或 SQL 語句,詳細語法查閱《聯機叢書》相關內容*/
  –創建新的 SQL Server 登錄,使用戶得以連接使用 SQL Server 身份驗證的 SQL Server。
  EXEC sp_addlogin @loginame = '', @passwd = '', @defdb= '', @deflanguage = NULL, @sid = NULL, @encryptopt = NULL
  –使 Windows NT 用戶或組帳戶得以使用 Windows 身份驗證連接到 SQL Server。
  EXEC sp_grantlogin @loginame = ''
  –刪除 SQL Server 登錄,以阻止使用該登錄名訪問 SQL Server。
  EXEC sp_droplogin @loginame = ''
  –阻止 Windows NT 用戶或組連接到 SQL Server。
  EXEC sp_denylogin @loginame = ''
  –從 SQL Server 中刪除用 sp_grantlogin 或 sp_denylogin 創建的 Windows NT 用戶或組的登錄項。
  EXEC sp_revokelogin @loginame = ''
  –更改登錄的默認數據庫。
  EXEC sp_defaultdb @loginame = '', @defdb = ''
  –更改登錄的默認語言。
  EXEC sp_defaultlanguage @loginame = '', @language =''
  –添加或更改 SQL Server 登錄密碼。
  EXEC sp_password @old = '', @new = '', @loginame = ''
  –添加服務器角色新成員。
  EXEC sp_addsrvrolemember @loginame = '', @rolename =''
  –添加服務器角色某成員。
  EXEC sp_dropsrvrolemember @loginame = '' , @rolename= ''
  –爲 SQL Server 登錄或 Windows NT 用戶或組在當前數據庫中添加一個安全帳戶,並使其能夠被授予在數據庫中執行活動的權限(授予默認的“public”數據庫角色)。
  EXEC sp_grantdbaccess @loginame = '', @name_in_db =NULL
  –或
  EXEC sp_adduser @loginame = '', @name_in_db = NULL,@grpname = ''
  –從當前數據庫中刪除安全帳戶。
  EXEC sp_revokedbaccess @name_in_db = ''
  –或
  EXEC sp_dropuser @name_in_db = ''
  –在當前數據庫創建新數據庫角色。
  EXEC sp_addrole @rolename = '', @ownername = ''
  –在當前數據庫刪除某數據庫角色。
  EXEC sp_droprole @rolename = ''
  –在當前數據庫中添加數據庫角色新成員。
  EXEC sp_addrolemember @rolename = '', @membername =''
  –在當前數據庫中刪除數據庫角色某成員。
  EXEC sp_droprolemember @rolename = '', @membername =''
  –權限分配給數據庫角色、表、存儲過程等對象
  –1、授權訪問
  GRANT
  –2、拒絕訪問
  DENY
  –3、取消授權或拒絕
  REVOKE
  –4、Sample(pubs):
  GRANT SELECT ON authors TO Limperator
  DENY SELECT ON authors TO Limperator
  REVOKE SELECT ON authors TO Limperator

兩個sql server2000的通用分頁存儲過程

 

發表日期:2007-3-17 |  

 

                       

 

-

第一個支持唯一主鍵,第二支持多主鍵,測試過,效率一般

 

CREATE PROC P_viewPage

   /*

       no_mIss 分頁存儲過程2007.2.20  QQ:34813284

       適用於單一主鍵或存在唯一值列的表或視圖         

   */

 

   @TableName VARCHAR(200),     --表名

   @FieldList VARCHAR(2000),    --顯示列名

   @PrimaryKey VARCHAR(100),    --單一主鍵或唯一值鍵

   @Where VARCHAR(1000),        --查詢條件 不含'where'字符

   @Order VARCHAR(1000),        --排序 不含'order by'字符,如id asc,userid desc,當@SortType=3時生效

   @SortType INT,               --排序規則 1:正序asc 2:倒序desc 3:多列排序

   @RecorderCount INT,          --記錄總數 0:會返回總記錄

   @PageSize INT,               --每頁輸出的記錄數

   @PageIndex INT,              --當前頁數

   @TotalCount INT OUTPUT,      --返回記錄總數

   @TotalPageCount INT OUTPUT   --返回總頁數

AS

   SET NOCOUNT ON

   IF ISNULL(@TableName,'') = '' OR ISNULL(@FieldList,'') = ''

       OR ISNULL(@PrimaryKey,'') = ''

       OR @SortType < 1 OR @SortType >3

       OR @RecorderCount < 0 OR @PageSize < 0 OR @PageIndex < 0

   BEGIN       

       RETURN

   END

 

   DECLARE @new_where1 VARCHAR(1000)

   DECLARE @new_where2 VARCHAR(1000)

   DECLARE @new_order VARCHAR(1000)  

   DECLARE @Sql VARCHAR(8000)

   DECLARE @SqlCount NVARCHAR(4000)

 

   IF ISNULL(@where,'') = ''

       BEGIN

           SET @new_where1 = ' '

           SET @new_where2 = ' WHERE  '

       END

   ELSE

       BEGIN

           SET @new_where1 = ' WHERE ' + @where

           SET @new_where2 = ' WHERE ' + @where + ' AND '

       END

 

   IF ISNULL(@order,'') = '' OR @SortType = 1  OR @SortType = 2

       BEGIN

           IF @SortType = 1 SET @new_order = ' ORDER BY ' + @PrimaryKey + ' ASC'

           IF @SortType = 2 SET @new_order = ' ORDER BY ' + @PrimaryKey + ' DESC'

       END

   ELSE

       BEGIN

           SET @new_order = ' ORDER BY ' + @Order

       END

 

   SET @SqlCount = 'SELECT@TotalCount=COUNT(*),@TotalPageCount=CEILING((COUNT(*)+0.0)/'

                    + CAST(@PageSize ASVARCHAR)+') FROM ' + @TableName + @new_where1

   

   IF @RecorderCount = 0

       BEGIN

            EXEC SP_EXECUTESQL @SqlCount,N'@TotalCount INT OUTPUT,@TotalPageCountINT OUTPUT',

                               @TotalCountOUTPUT,@TotalPageCount OUTPUT

       END

   ELSE

       BEGIN

            SELECT @TotalCount = @RecorderCount           

       END

 

   IF @PageIndex > CEILING((@TotalCount+0.0)/@PageSize)

       BEGIN

           SET @PageIndex = CEILING((@TotalCount+0.0)/@PageSize)

       END

   IF @PageIndex = 1

       BEGIN

           SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '

                       + @TableName +@new_where1 + @new_order

       END

   ELSE

       BEGIN

           IF @SortType = 1

                BEGIN

                    SET @Sql = 'SELECT TOP ' +STR(@PageSize) + ' ' + @FieldList + ' FROM '

                               + @TableName +@new_where2 + @PrimaryKey + ' > '

                               + '(SELECT MAX('+ @PrimaryKey + ') FROM (SELECT TOP '

                               +STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey

                               + ' FROM ' +@TableName

                               + @new_where1 +@new_order +' ) AS TMP) '+ @new_order

                END

           IF @SortType = 2

                BEGIN

                    SET @Sql = 'SELECT TOP ' +STR(@PageSize) + ' ' + @FieldList + ' FROM '

                               + @TableName +@new_where2 + @PrimaryKey + ' < '

                               + '(SELECT MIN('+ @PrimaryKey + ') FROM (SELECT TOP '

                               + STR(@PageSize*(@PageIndex-1)) + '' + @PrimaryKey

                               +' FROM '+@TableName

                               + @new_where1 +@new_order + ') AS TMP) '+ @new_order                              

                END       

           IF @SortType = 3

                BEGIN

                    IF CHARINDEX(',',@Order) =0 BEGIN RETURN END

                    SET @Sql = 'SELECT TOP ' +STR(@PageSize) + ' ' + @FieldList + ' FROM '

                               + @TableName +@new_where2 + @PrimaryKey + ' NOT IN (SELECT TOP '

                               +STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey

                               + ' FROM ' +@TableName + @new_where1 + @new_order + ')'

                               + @new_order

                END

       END

   EXEC(@Sql)

GO

 

 

 

CREATE PROC P_public_ViewPage_per

   /*

       no_mIss 通用分頁存儲過程2007.3.1  QQ:34813284

       適用於聯合主鍵/單主鍵/存在能確定唯一行列/存在能確定唯一行的多列 (用英文,隔開)

       調用:

           第一頁查詢時返回總記錄和總頁數及第一頁記錄:

           EXECUTE P_public_ViewPage_per'TableName','col1,col2,col3,col4','pk1,pk2,pk3',

                'col5>0 and col7<9','pk1asc,pk2 asc,pk3 asc',0,10,1,

                @TotalCountOUTPUT,@TotalPageCount OUTPUT

           其它頁調用,比如第89頁(假設第一頁查詢時返回總記錄爲2000000):

           EXECUTE P_public_ViewPage_per'TableName','col1,col2,col3,col4','pk1,pk2,pk3',

                'col5>0 and col7<9','pk1asc,pk2 asc,pk3 asc',2000000,10,89,

                @TotalCountOUTPUT,@TotalPageCount OUTPUT

   */

 

   @TableName VARCHAR(200),     --表名

   @FieldList VARCHAR(2000),    --顯示列名

   @PrimaryKey VARCHAR(100),    --單一主鍵或唯一值鍵或聯合主鍵列表(用英文,隔開)或能確定唯一行的多列列表(用英文,隔開)

   @Where VARCHAR(1000),        --查詢條件 不含'where'字符

   @Order VARCHAR(1000),        --排序不含'order by'字符,用英文,隔開 

   @RecorderCount INT,          --記錄總數 0:會返回總記錄

   @PageSize INT,               --每頁輸出的記錄數

   @PageIndex INT,              --當前頁數

   @TotalCount INT OUTPUT,      --返回記錄總數

   @TotalPageCount INT OUTPUT   --返回總頁數

AS

 

    SET NOCOUNT ON

   

   SET @FieldList = REPLACE(@FieldList,' ','')

   IF @FieldList = '*'

       BEGIN SET @FieldList = 'A.*'END

   ELSE

       BEGIN

           SET @FieldList = 'A.' + REPLACE(@FieldList,',',',A.')

       END

   

   WHILE CHARINDEX(', ',@Order)>0

   BEGIN

       SET @Order = REPLACE(@Order,', ',',')

   END

 

   IF ISNULL(@TableName,'') = '' OR ISNULL(@PrimaryKey,'') = ''       

       OR @RecorderCount < 0 OR @PageSize < 0 OR @PageIndex < 0

   BEGIN       

       RETURN

   END

 

   DECLARE @new_where1 VARCHAR(1000)

   DECLARE @new_where2 VARCHAR(1000)

   DECLARE @new_where3 VARCHAR(1000)

   DECLARE @new_where4 VARCHAR(1000)

   DECLARE @new_order1 VARCHAR(1000)

   DECLARE @new_order2 VARCHAR(1000)

   DECLARE @Fields VARCHAR(1000)

   DECLARE @Sql VARCHAR(8000)

   DECLARE @SqlCount NVARCHAR(4000)

 

   SET @Fields = @PrimaryKey + ','

   SET @new_where2 = ''

   SET @new_where4 = ''

 

 

   IF ISNULL(@where,'') = ''

       BEGIN

           SET @new_where1 = ' '

            SET @new_where3 = ' WHERE '

       END

   ELSE

       BEGIN           

           SET @new_where1 = ' WHERE ' + @where + ' '

           SET @new_where3 = ' WHERE 1=1 '

                    + REPLACE(' AND ' +@where,' AND ',' AND A.')+ ' AND '

       END

   

   WHILE CHARINDEX(',',@Fields)>0

   BEGIN

       SET @new_where2 = @new_where2

           + 'A.' + LTRIM(LEFT(@Fields,CHARINDEX(',',@Fields)-1))

           + ' = B.' + LTRIM(LEFT(@Fields,CHARINDEX(',',@Fields)-1)) + ' AND '

       SET @new_where4 = @new_where4

           + 'B.' + LTRIM(LEFT(@Fields,CHARINDEX(',',@Fields)-1)) + ' IS NULL AND '

       SET @Fields = SUBSTRING(@Fields,CHARINDEX(',',@Fields)+1,LEN(@Fields))

   END

   SET @new_where2 = LEFT(@new_where2,LEN(@new_where2)-4)

   SET @new_where4 = LEFT(@new_where4,LEN(@new_where4)-4)

 

   IF ISNULL(@order,'') = ''

       BEGIN

           SET @new_order1 = ''

           SET @new_order2 = ''

       END

   ELSE

       BEGIN

           SET @new_order1 = ' ORDER BY ' + @Order

           SET @new_order2 = ' ORDER BY '

                    + RIGHT(REPLACE(',' +@Order,',',', A.' ),

                            LEN(REPLACE(',' +@Order,',',', A.' ))-1)

       END

 

   SET @SqlCount = 'SELECT @TotalCount=COUNT(*),@TotalPageCount=CEILING((COUNT(*)+0.0)/'

                    + CAST(@PageSize ASVARCHAR)+') FROM ' + @TableName

                    + ' A ' +  @new_where1

   

   IF @RecorderCount = 0

       BEGIN

            EXEC SP_EXECUTESQL @SqlCount,N'@TotalCount INT OUTPUT,@TotalPageCountINT OUTPUT',

                               @TotalCountOUTPUT,@TotalPageCount OUTPUT

       END

   ELSE

       BEGIN

            SELECT @TotalCount = @RecorderCount           

       END

 

   IF @PageIndex > CEILING((@TotalCount+0.0)/@PageSize)

       BEGIN

           SET @PageIndex = CEILING((@TotalCount+0.0)/@PageSize)

       END

   IF @PageIndex = 1

       BEGIN

           SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '

                       + @TableName + ' A'+@new_where1 + @new_order1

       END

   ELSE

       BEGIN

           SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '

                       + @TableName + ' A LEFTJOIN (SELECT TOP '

                       + STR(@PageSize*(@PageIndex-1))

                       + ' ' + @PrimaryKey + 'FROM ' + @TableName + @new_where1

                       + @new_order1 + ' )B ON' + @new_where2 + @new_where3

                       + @new_where4 +@new_order2

       END

 

EXEC(@Sql)

GO

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章