生成唯一id号解决方法
1 添加一個id自增表t_Next FUserID(用戶唯一標示符) FTableName(要唯一id號的表的名稱) FNextNo(下一個id號)
2 添加存儲過程如下
GO
Create proc [dbo].[p_Next]
@pCOID varchar(40),
@pTblname varchar(40),
@pStep int,
@pIdentity bigint out
as
if @pTblname='t_A' or @pTblname='t_B' set @pCOID='system' 特殊情況處理
begin try
begin tran
update t_Next
set @pIdentity=FNext,FNext=FNext+@pStep
where?FCOID=@pCOID?and?FName=@pTblname
if @@rowcount=0
begin
if @pTblname='t_A'
set @pIdentity=1
else
select @pIdentity=FCompanyID*10000000000+1
from t_Company
where?fcoid=@pCOID
insert into t_Next(FCOID,FName,FNext)
values(@pCOID,@pTblName,@pIdentity+@pStep)
end
commit tran
end try
begin catch
if @@trancount>0 rollback tran
print Error_Number()
print Error_Message()
end catch
?
?
?
?
?
?
PS:存儲過程語法
一、簡介:
存儲過程(Stored Procedure), 是一組為了完成特定功能的SQL 語句,集經編譯后
存儲在數據庫中,用戶通過指定存儲過程的名字并給出參數,如果該存儲過程帶有參數來執行
它,
在SQL Server 的系列版本中,存儲過程分為兩類:系統提供的存儲過程和用戶自定義存儲過程
。
系統SP,主要存儲master 數據庫中,并以sp_為前綴并且系統存儲過程主要是從系統表中獲取
信息,從而為系統管理員管理SQL Server。 用戶自定義存儲過程是由用戶創建,并能完成
某一特定功能,如:查詢用戶所需數據信息的存儲過程。
存儲過程具有以下優點
1.存儲過程允許標準組件式編程(模塊化設計)
存儲過程在被創建以后,可以在程序中被多次調用,而不必重新編寫該存儲過程的SQL語句,而
且數
據庫專業人員可隨時對存儲過程進行修改,但對應用程序源代碼毫無影響。因為應用程序源代
碼只包含存
儲過程的調用語句,從而極大地提高了程序的可移植性。
2.存儲過程能夠實現快速的執行速度
如果某一操作包含大量的Transaction-SQL 代碼,,或分別被多次執行,那么存儲過程要比批處理
的
執行速度快很多,因為存儲過程是預編譯的,在首次運行一個存儲過程時,查詢優化器對其進
行分析優
化,并給出最終被存在系統表中的執行計劃,而批處理的Transaction-SQL 語句在每次運行時
都要進行
編譯和優化,因此速度相對要慢一些。
3.存儲過程能夠減少網絡流量
對于同一個針對數據數據庫對象的操作,如查詢修改,如果這一操作所涉及到的Transaction-SQL?
語句被組織成一存儲過程,那么當在客戶計算機上調用該存儲過程時,網絡中傳送的只是該調
用語句,否
則將是多條SQL 語句從而大大增加了網絡流量降低網絡負載。
4.存儲過程可被作為一種安全機制來充分利用
系統管理員通過,對執行某一存儲過程的權限進行限制,從而能夠實現對相應的數據訪問權限的
限
制。
二、變量
@I
三、流程控制語句(if else | select case | while )
Select ... CASE 實例
DECLARE @iRet INT, @PKDisp VARCHAR(20)
SET @iRet = '1'
Select @iRet =?
CASE
WHEN @PKDisp = '一' THEN 1
WHEN @PKDisp = '二' THEN 2
WHEN @PKDisp = '三' THEN 3
WHEN @PKDisp = '四' THEN 4
WHEN @PKDisp = '五' THEN 5
ELSE 100
END
四、存儲過程格式
創建存儲過程
Create Proc dbo.存儲過程名
存儲過程參數
AS
執行語句
RETURN
執行存儲過程
GO
*********************************************************/?
-- 變量的聲明,sql里面聲明變量時必須在變量前加@符號
DECLARE @I INT
-- 變量的賦值,變量賦值時變量前必須加set
SET @I = 30
-- 聲明多個變量
DECLARE @s varchar(10),@a INT
-- Sql 里if語句
IF 條件 BEGIN
執行語句
END
ELSE BEGIN
執行語句
END
DECLARE @d INT
set @d = 1
IF @d = 1 BEGIN
-- 打印
PRINT '正確'
END
ELSE BEGIN
PRINT '錯誤'
END
-- Sql 里的多條件選擇語句.
DECLARE @iRet INT, @PKDisp VARCHAR(20)
SET @iRet = 1
Select @iRet =
CASE
WHEN @PKDisp = '一' THEN 1
WHEN @PKDisp = '二' THEN 2
WHEN @PKDisp = '三' THEN 3
WHEN @PKDisp = '四' THEN 4
WHEN @PKDisp = '五' THEN 5
ELSE 100
END
-- 循環語句
WHILE 條件 BEGIN?
執行語句
END
DECLARE @i INT
SET @i = 1
WHILE @i<1000000 BEGIN
set @i=@i+1
END
-- 打印
PRINT @i
-- TRUNCATE 刪除表中的所有行,而不記錄單個行刪除操作,不能帶條件
/*
TRUNCATE TABLE 在功能上與不帶 Where 子句的 Delete 語句相同:二者均刪除表中的全部行
。但 TRUNCATE TABLE 比 Delete 速度快,且使用的系統和事務日志資源少。
Delete 語句每次刪除一行,并在事務日志中為所刪除的每行記錄一項。TRUNCATE TABLE 通過
釋放存儲表數據所用的數據頁來刪除數據,并且只在事務日志中記錄頁的釋放。
TRUNCATE TABLE 刪除表中的所有行,但表結構及其列、約束、索引等保持不變。新行標識所用
的計數值重置為該列的種子。如果想保留標識計數值,請改用 Delete。如果要刪除表定義及其數據,請
使用 Drop TABLE 語句。
對于由 FOREIGN KEY 約束引用的表,不能使用 TRUNCATE TABLE,而應使用不帶 Where 子句的
Delete 語句。由于 TRUNCATE TABLE 不記錄在日志中,所以它不能激活觸發器。
TRUNCATE TABLE 不能用于參與了索引視圖的表。
示例
下例刪除 authors 表中的所有數據。*/
TRUNCATE TABLE authors
?
-- Select INTO 從一個查詢的計算結果中創建一個新表。 數據并不返回給客戶端,這一點和普通的
-- Select 不同。 新表的字段具有和 Select 的輸出字段相關聯(相同)的名字和數據類型。
select * into NewTable
from Uname
-- Insert INTO Select
-- 表ABC必須存在
-- 把表Uname里面的字段Username復制到表ABC
Insert INTO ABC Select Username FROM Uname
-- 創建臨時表
Create TABLE #temp(
UID int identity(1, 1) PRIMARY KEY,
UserName varchar(16),
Pwd varchar(50),
Age smallint,
Sex varchar(6)
)
-- 打開臨時表
Select * from #temp
-- 存儲過程
-- 要創建存儲過程的數據庫
Use Test
-- 判斷要創建的存儲過程名是否存在
if Exists(Select name From sysobjects Where name='csp_AddInfo' And
type='P')
-- 刪除存儲過程
Drop Procedure dbo.csp_AddInfo
Go
-- 創建存儲過程
Create Proc dbo.csp_AddInfo
-- 存儲過程參數
@UserName varchar(16),
@Pwd varchar(50),
@Age smallint,
@Sex varchar(6)
AS
-- 存儲過程語句體
insert into Uname (UserName,Pwd,Age,Sex)
values (@UserName,@Pwd,@Age,@Sex)
RETURN
-- 執行
GO
-- 執行存儲過程
EXEC csp_AddInfo 'Junn.A','123456',20,'男'
?
?
@@ROWCOUNT (Transact-SQL)返回受上一語句影響的行數。如果行數大于 20 億,請使用?ROWCOUNT_BIG。
@@TRANCOUNT (Transact-SQL)返回在當前連接上已發生的 BEGIN TRANSACTION 語句的數目。
注釋BEGIN TRANSACTION 語句將 @@TRANCOUNT 增加 1。ROLLBACK TRANSACTION 將 @@TRANCOUNT 遞減到 0,但 ROLLBACK TRANSACTION?savepoint_name?除外,它不影響 @@TRANCOUNT。COMMIT TRANSACTION 或 COMMIT WORK 將 @@TRANCOUNT 遞減
?
本文轉自linzheng 51CTO博客,原文鏈接:http://blog.51cto.com/linzheng/1081900
總結
以上是生活随笔為你收集整理的生成唯一id号解决方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网上搜集的软件2
- 下一篇: CPU亲缘性及网卡中断绑定