SQLServer 2008中SQL加強之三 Merge(在一條語句中應用Insert,Update,Delete)。本站提示廣大學習愛好者:(SQLServer 2008中SQL加強之三 Merge(在一條語句中應用Insert,Update,Delete))文章只能為提供參考,不一定能成為您想要的結果。以下是SQLServer 2008中SQL加強之三 Merge(在一條語句中應用Insert,Update,Delete)正文
SQL Server 2008供給了一個加強的SQL敕令Merge,用法參看MSDN:http://msdn.microsoft.com/zh-cn/library/bb510625.aspx
功效:依據與源表聯接的成果,對目的表履行拔出、更新或刪除操作。例如,依據在另外一個表中找到的差別在一個表中拔出、更新或刪除行,可以對兩個表停止同步。
我們看一個例子,假設,有一總產物列表,一個分店產物列表,須要從分店添加產物時更新總產物列表。
總產物表,分店產物表構造完整分歧:
if OBJECT_ID('Demo_AllProducts') is not null
drop table Demo_AllProducts
go
Create table Demo_AllProducts
(PKID int not null identity(1,1) primary key
,DName Nvarchar(20) null
,DCode NVarchar(30) null
,DDate datetime null
)
go
--this SQL is only for SQL Server 2008
Insert into Demo_AllProducts
(DName,DCode,DDate)
values
('DemoA','AAA',GETDATE()),
('DemoB','BBB',GETDATE()),
('DemoC','CCC',GETDATE()),
('DemoD','DDD',GETDATE()),
('DemoE','EEE',GETDATE())
select * from Demo_AllProducts
--PKID DName DCode DDate
--1 DemoA AAA 2010-10-12 20:33:54.417
--2 DemoB BBB 2010-10-12 20:33:54.417
--3 DemoC CCC 2010-10-12 20:33:54.417
--4 DemoD DDD 2010-10-12 20:33:54.417
--5 DemoE EEE 2010-10-12 20:33:54.417
if OBJECT_ID('Demo_Shop1_Product') is not null
drop table Demo_Shop1_Product
go
Create table Demo_Shop1_Product
(PKID int not null identity(1,1) primary key
,DName Nvarchar(20) null
,DCode NVarchar(30) null
,DDate datetime null
)
go
--this SQL is only for SQL Server 2008
Insert into Demo_Shop1_Product
(DName,DCode,DDate)
values
('DemoA','AAA',GETDATE()),
('DemoB','CCC',GETDATE()),
('DemoF','FFF',GETDATE())
select * from Demo_Shop1_Product
--PKID DName DCode DDate
--1 DemoA AAA 2010-10-17 20:19:32.767
--2 DemoB CCC 2010-10-17 20:19:32.767
--3 DemoF FFF 2010-10-17 20:19:32.767
假定如今須要將分店數據完整歸並到總產物表中,以編碼字段為根據,假如產物稱號不致,則用分店的產物稱號調換總產物稱號。
假如總產物表中不存在,則添加。
可選項:假如分店表中不存在,則從總產物表中刪除分店中沒有的行。假如如許,總產物表和分店表就完整同步了。現實操作中能夠不須要刪除目的表的行。
語句以下:
--肯定目的表
Merge Into Demo_AllProducts p
--從數據源查找編碼雷同的產物
using Demo_Shop1_Product s on p.DCode=s.DCode
--假如編碼雷同,則更新目的表的稱號
When Matched and P.DName<>s.DName Then Update set P.DName=s.DName
--假如目的表中不存在,則從數據源拔出目的表
When Not Matched By Target Then Insert (DName,DCode,DDate) values (s.DName,s.DCode,s.DDate)
--假如數據源的行在源表中不存在,則刪除源表行
When Not Matched By Source Then Delete;
此時,履行完成後,兩個表的行均以下:
--PKID DName DCode DDate
--1 DemoA AAA 2010-10-17 20:31:00.827
--2 DemoB CCC 2010-10-17 20:31:00.827
--3 DemoF FFF 2010-10-17 20:31:00.827
假如不刪除,語句以下:
--肯定目的表
Merge Into Demo_AllProducts p
--從數據源查找編碼雷同的產物
using Demo_Shop1_Product s on p.DCode=s.DCode
--假如編碼雷同,則更新目的表的稱號
When Matched and P.DName<>s.DName Then Update set P.DName=s.DName
--假如目的表中不存在,則從數據源拔出目的表
When Not Matched By Target Then Insert (DName,DCode,DDate) values (s.DName,s.DCode,s.DDate);
履行後成果:
--PKID DName DCode DDate
--1 DemoA AAA 2010-10-17 20:30:28.350
--2 DemoB BBB 2010-10-17 20:30:28.350
--3 DemoB CCC 2010-10-17 20:30:28.350
--4 DemoD DDD 2010-10-17 20:30:28.350
--5 DemoE EEE 2010-10-17 20:30:28.350
--6 DemoF FFF 2010-10-17 20:31:00.827
--PKID DName DCode DDate
--1 DemoA AAA 2010-10-17 20:31:00.827
--2 DemoB CCC 2010-10-17 20:31:00.827
--3 DemoF FFF 2010-10-17 20:31:00.827
假如須要記載Merge語句影響的行,可以用Output子句,假如僅僅須要曉得影響的行數,可使用@@ROWCOUNT或ROWCOUNT_BIG(),修正後的示例以下:
--界說表變量以存儲輸入
Declare @tableVarRecord Table
(MPKID int not null identity(1,1) primary key
,PKID int null
,DName Nvarchar(20) null
,DCode NVarchar(30) null
,DDate datetime null
)
--肯定目的表
Merge Into Demo_AllProducts p
--從數據源查找編碼雷同的產物
using Demo_Shop1_Product s on p.DCode=s.DCode
--假如編碼雷同,則更新目的表的稱號
When Matched and P.DName<>s.DName Then
Update set P.DName=s.DName
--假如目的表中不存在,則從數據源拔出目的表
When Not Matched By Target Then
Insert (DName,DCode,DDate) values (s.DName,s.DCode,s.DDate)
--假如數據源的行在源表中不存在,則刪除源表行
When Not Matched By Source Then
Delete OUTPUT deleted.* INTO @tableVarRecord;
----Delete OUTPUT Inserted.* INTO @tableVarRecord;
--前往上個Merge語句影響的行數
select @@ROWCOUNT as Count1,ROWCOUNT_BIG() as Count2
select * from @tableVarRecord;
成果:
--影響的行數
--Count1 Count2
--5 5
--Deleted表的行
--MPKID PKID DName DCode DDate
--1 NULL NULL NULL NULL
--2 2 DemoB BBB 2010-10-17 21:42:30.700
--3 3 DemoC CCC 2010-10-17 21:42:30.700
--4 4 DemoD DDD 2010-10-17 21:42:30.700
--5 5 DemoE EEE 2010-10-17 21:42:30.700
關於@@ROWCOUNT和ROWCOUNT_BIG()的更多解釋,請查閱MSDN:
http://technet.microsoft.com/zh-tw/library/ms187316.aspx
http://msdn.microsoft.com/en-us/library/ms181406.aspx
假如影響的成果跨越20億,即整型的最年夜規模,請應用後者。
還有其它報表的設計辦法,如主動報表(縱欄表)、主動報表(表格)、圖標領導、標簽領導,我就紛歧一講了,年夜家可以本身測驗考試測驗考試。
6. 與其它軟件同享數據庫
(1)數據庫類型轉換
以往,分歧數據庫常常沒法分享彼此樹立的材料。假如你之前習氣應用dBase樹立數據庫,卻因Windows世界的到來,老板為了趕時興,下了一道敕令,今後公司不再應用dBase樹立數據庫,還要你將一切在dBase上所樹立的數據庫,全體從新輸出至Access 97的數據庫中,聽到這個新聞後,想必你必定是哭天怨地、七手八腳。就算有一千個應用Access 97的來由,你照樣不寧願改換數據庫。其實,關於這一點Access 97早就想好了對策,Access 97供給了挪用、導出等多種辦法來讓你做數據庫的轉換。你只需點擊“對象”菜雙數據庫適用對象”子菜單中的“轉換數據庫”,然後選摘要轉換的其它類型數據庫,如dBase,數據庫就會勝利地從dBase轉換到Access 97中,異常地簡略。
(2)在Word 中挪用Access 數��
可以以 RTF 格局 (.rtf) 文件保留數據表、窗體或報表的輸入。RTF 格局文件可保存字體和款式等帶格局的信息,可以用 Microsoft Word 和其他 Windows 字處置法式或桌面出書法式翻開。 如前例,在Microsoft Access中,翻開CD、 VCD治理體系數據庫的表1,點擊“保留為/導出”,把表1以 RTF 格局保留,然後在Microsoft Word文件指定地位翻開表1.rtf就好了。
(3)將Access 數據導出到Excel:
如前例所示,在數據庫窗口中單擊要導出的表或查詢的稱號,表1,然後在“文件”菜單上,單擊“另存為/導出”敕令,在“另存為”對話框,單擊“另存為一個內部文件或數據庫”,然後單擊“肯定”按鈕。在“保留類型”框中單擊所需的電子數據表格局。單擊“保留地位”框右邊的箭頭,選定導出的目的驅動器和文件夾。在已有的電子數據表,或許在“文件名”框內輸出新文件名。此時留意在保留到已有電子表時Access 將刪除並替換個中的數據,是以要特殊當心。f單擊“導出”按鈕,Access 將會創立包括表或查詢數據的電子數據表文件。表或查詢中的字段名被放置在電子數據表的第一行。
7. 掩護數據庫
(1)加密或解密數據庫
對數據庫停止加密將緊縮數據庫文件,並使其沒法經由過程對象法式或字處置法式解密。數據庫解密則為加密的反進程。
辦法:啟動Microsoft Access,但不翻開數據庫。單擊“對象”菜單“平安”子菜單中的“加密/解密數據庫”。指定要加密或解密的數據庫,然後單擊“肯定”按鈕。指定加密或解密以後的數據庫稱號、驅動器及文件夾,然後單擊“肯定”按鈕。假如應用原本的數據庫稱號、驅動器和文件夾,在加密或解密勝利後,Microsoft Access 會主動將原本的數據庫調換為加密或解密後的版本。但假如湧現���病,Microsoft Access將保存原本的數據庫文件。
(2)給數據庫設置暗碼:
辦法:翻開數據庫,並選擇“獨有”復選框,單擊“翻開”,然後單擊“對象”菜單“平安”子菜單中的“設置數據庫暗碼”,輸出暗碼,驗證,最初單擊“確認”就完成了數據庫設置的暗碼,當翻開VCD材料庫的時刻,要提醒輸出暗碼。
經由上文中的幾步就輕松的完成了在Access創立MIS治理體系,如許就為年夜家今後查找器械供給了方便,勤儉了時光,願望年夜家可以或許愛好上文中引見的常識點。