如果新建的表中某一列屬性有約束,那麼在sqlserver中匯入資料過程中,如果有不符合該約束的值,就會導致衝突,匯入失敗。
一般的做法是先導入乙個沒有約束的表,然後在sqlserver中通過查詢語句篩選掉不符合約束條件的元組,然後insert進入有約束的表。
顯然這種方式簡單但是會損耗空間,並且如果匯入的資料表如果很多,這樣的操作會很繁瑣。
下面介紹用觸發器解決這一問題的方式:
create
table student(
number nchar(8
)not
null
,name varchar(50
)not
null
,*** nchar(2
)not
null
check
(*** in
('男'
,'女'))
,age int
notnull
,class int
notnull
,score decimal(5
,2)check
(score>=
0and score <=10)
,time
varchar(50
))
這裡為score屬性新增了約束
sqlserver的觸發器沒有before語法,所以只能通過重寫insert來解決,如果資料庫是mysql可以用before,會方便很多
create
trigger scorecheck
on student
instead of
insert
//建立觸發器的基本語句
asbegin
set nocount on
;//這裡開始建立虛表
declare
@number
nchar(8
),@name
varchar(50
),@***
nchar(2
),@age
int,
@class
int,
@score
decimal(5
,2),
@time
varchar(50
)declare yb cursor
forselect
[number]
,[name]
,[***]
,[age]
,[class]
,[score],[
time
]from inserted //inserted是sqlserver中自帶的引數,表示匯入的表
open yb //開啟匯入的虛表
fetch
next
from yb into
@number
,@name
,@***
,@age
,@class
,@score
,@time
//獲取第一行的元組
while @@fetch_status=0
//由於表有很多元組,我們需要遍歷每一行
//這裡相當於while hasnextline
beginif(
@score
)<0or
(@score
)>
10//篩選
begin
print
'分數不合法'
endelse
begin
insert
into student(number,name,***,age,class,score,
time
)values
(@number
,@name
,@***
,@age
,@class
,@score
,@time
)//符合條件的元組插入表中
endfetch
next
from yb into
@number
,@name
,@***
,@age
,@class
,@score
,@time
//獲取下一行
endclose yb
deallocate yb
end
sqlserver自帶的匯入資料程式是不經過我們建立的觸發器的,就是我們不能通過 任務->匯入檔案 來匯入資料
我們只能手寫匯入檔案
通過bulk insert匯入檔案,這邊檔案型別是csv,所以分隔符是,和\n,不同的檔案型別有不同的分隔符。
此外,一般資料庫都設有許可權,你可能沒有許可權匯入放在桌面或其他資料夾的檔案,解決方法是把該檔案放在c盤
bulk
insert student
from
'c:\student.csv'
//c盤的csv檔案
with
( fieldterminator=
',',
rowterminator=
'\n'
, firstrow=2,
fire_triggers //這行的意思是匯入過程經過所有觸發器
)
到這裡就可以了,不合法的資料會被篩選掉不匯入,並且有資料不合法的提示。 sqlserver觸發器複習
create table a a1 int,a2 int create table b b1 int,b2 int insert into a values 1,0 insert into b values 1,0 create trigger tri update a2 a on a for up...
SQL server 之 觸發器
今天對觸發器研究了一下,之前的學習感覺挺朦朧的,今天鼓搗了一天,算是有了一點點了解,把學習的體會記錄了下來。常見的觸發器 觸發器的作用 自動化操作,減少了手動操作以及出錯的機率 現實工作中用的比較少,因為想讓他執行起來效率高很難 一 dml觸發器 insert delete update 不支援se...
SQLSERVER的觸發器
觸發器的定義 觸發器是一種特殊型別的儲存過程,他不同於前面介紹過的一般的儲存過程 在sql內部把觸發器看做是儲存過程但是不能傳遞引數 一般的儲存過程通過儲存過程名稱被直接呼叫,而觸發器主要是通過事件進行觸發而被執行.總的來說,觸發器是一種功能強大的工具,在表中資料發生變化時自動強制執行,觸發器還可以...