程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL2008 >> SQLServer 2008中SQL加強之三 Merge(在一條語句中應用Insert,Update,Delete)

SQLServer 2008中SQL加強之三 Merge(在一條語句中應用Insert,Update,Delete)

編輯:MSSQL2008

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治理體系,如許就為年夜家今後查找器械供給了方便,勤儉了時光,願望年夜家可以或許愛好上文中引見的常識點。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved