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