用觸發器解決sqlserver匯入資料與表衝突問題

2021-10-05 07:29:18 字數 2735 閱讀 4436

如果新建的表中某一列屬性有約束,那麼在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內部把觸發器看做是儲存過程但是不能傳遞引數 一般的儲存過程通過儲存過程名稱被直接呼叫,而觸發器主要是通過事件進行觸發而被執行.總的來說,觸發器是一種功能強大的工具,在表中資料發生變化時自動強制執行,觸發器還可以...