SQL Server將視圖或表的記錄不重復(fù)地插入到另一個表
SQL Server將視圖或表的記錄不重復(fù)地插入到另一個表中的方法與思路是本文我們要介紹的,接下來就讓我們來一起了解一下這部分內(nèi)容吧。
最近在做個自動更新數(shù)據(jù)的小程序,每天有幾個表的txt記錄集要更新到數(shù)據(jù)庫,并且txt記錄集中的數(shù)據(jù)列并不全用,只使用一部分。
在做完更新程序后,發(fā)現(xiàn)還少了一個功能:自動提示重要數(shù)據(jù)的功能,在編寫時發(fā)現(xiàn)需要一個表記錄是否關(guān)聯(lián)表記錄是否已提示,這牽涉一個問題,插入提示記錄的表數(shù)據(jù)會重復(fù)導(dǎo)致重復(fù)提示,沒有必要的短信會發(fā)送,當然可以通過以下步驟判斷記錄是否是重復(fù):
- 將關(guān)鍵字段生成唯一索引
- 從視圖或表中讀取記錄插入到提示表
這樣邏輯比較簡單,但是效率有點低了,要與sqlserve多次通訊,能不能在數(shù)據(jù)庫端就完成這些操作呢,反正取記錄、更新到表都是固定的,在網(wǎng)上找了一下倒是有不少,但沒有完整的實現(xiàn),經(jīng)過一上午的努力,終于解決了問題,所以作文以記之。
由于工作關(guān)系,不便使用原數(shù)據(jù),生成了兩個模擬的表,結(jié)構(gòu)如下:
- CREATE TABLE [dbo].[t1](
- [c1] [nchar](10) NOT NULL,
- [c2] [nchar](20) NOT NULL
- ) ON [PRIMARY]
- GO
- CREATE TABLE [dbo].[t2](
- [Id] [int] IDENTITY(1,1) NOT NULL,
- [c1] [nchar](10) NOT NULL,
- [c2] [nchar](20) NOT NULL,
- [IsHandled] [bit] NOT NULL
- ) ON [PRIMARY]
- GO
- ALTER TABLE [dbo].[t2] ADD CONSTRAINT [DF_t2_IsHandled] DEFAULT ((0)) FOR [IsHandled]
- GO
- --生成數(shù)據(jù)
- INSERT INTO [test].[dbo].[t1]([c1],[c2]) VALUES ('a1','a2')
- INSERT INTO [test].[dbo].[t1]([c1],[c3]) VALUES ('a1','a3')
- INSERT INTO [test].[dbo].[t1]([c1],[c4]) VALUES ('a1','a4')
- INSERT INTO [test].[dbo].[t1]([c1],[c5]) VALUES ('a1','a5')
- INSERT INTO [test].[dbo].[t1]([c1],[c6]) VALUES ('a1','a6')
- INSERT INTO [test].[dbo].[t1]([c1],[c7]) VALUES ('a1','a7')
- INSERT INTO [test].[dbo].[t1]([c1],[c8]) VALUES ('a1','a8')
- INSERT INTO [test].[dbo].[t1]([c1],[c9]) VALUES ('a1','a9')
- INSERT INTO [test].[dbo].[t1]([c1],[c10]) VALUES ('a1','a2')
- INSERT INTO [test].[dbo].[t1]([c1],[c11]) VALUES ('a1','a11')
思路:阻止重復(fù)數(shù)據(jù)插入不外兩個辦法,一是利用唯一索引,二是利用事務(wù),插入后判斷同樣的記錄是否有兩條,是的話,回滾事務(wù)。具體實現(xiàn)如下:
- 讀取T1的數(shù)據(jù),
- 用游標讀取每一條記錄,并插入T2
方法一、利用唯一索引
方法二、利用事務(wù),在這里建立一個存儲過程方便調(diào)用
- Create procedure [dbo].[insert_t2]
- @c1 varchar(10), --定義一個輸入?yún)?shù),就是那個是不是重復(fù)的值
- @c2 varchar(20) --把每一列弄成變量存入,不知你的表有幾字段,這里我就以兩個字段為例
- as
- declare @sum int
- begin tran
- insert into t2 (c1,c2) values (@c1,@c2)
- select @sum=count(*) from t2 where (c1=@c1) and (c2=@c2)
- if(@sum>1)
- begin
- raiserror('該記錄已經(jīng)存在',16,8)
- rollback tran --滾回事務(wù)
- end
- else
- commit tran --提交事務(wù)
下面是從T1取數(shù)據(jù)存入游標的存儲過程
- Create procedure [dbo].[GetT1]
- @MyCursor Cursor Varying Output
- --With Encryption
- As
- Set @MyCursor = Cursor
- For
- Select C1,C2 From T1
- Open @MyCursor
將數(shù)據(jù)插入T2的存儲過程
- Create Procedure InsertIntoT2
- As
- Declare @c1 varchar(20)
- Declare @c2 nvarchar(20)
- Declare @T1DataCursor Cursor
- Exec GetT1 @T1DataCursor out
- Fetch Next From @T1DataCursor
- InTo @c1,@c2
- While(@@Fetch_Status = 0)
- Begin
- exec [test].[dbo].[insert_t2] @c1,
- Fetch Next From @T1DataCursor
- InTo @c1,@c2
- End
- Close @T1DataCursor
- Deallocate @T1DataCursor
- Go
調(diào)用方法
- DECLARE @RC int
- -- TODO: 在此處設(shè)置參數(shù)值。
- EXECUTE @RC = [test].[dbo].InsertIntoT2
- GO
結(jié)果:
- SELECT TOP 1000 [Id]
- ,[c1]
- ,[c2]
- ,[IsHandled]
- FROM [test].[dbo].[t2]
可以看到t2只有9行記錄。
關(guān)于SQL Server數(shù)據(jù)庫中將視圖或表中的記錄不重復(fù)地插入到另一個表中的方法就介紹到這里了,希望本次的介紹能夠?qū)δ兴鶐椭?/p>
【編輯推薦】


2010-12-21 09:47:45




