例如Northwind.sql中的程式碼:
1 | -- Customers |
2 | INSERT "Customers" VALUES ( 'ALFKI' , 'Alfreds Futterkiste' , 'Maria Anders' , 'Sales Representative' , 'Obere Str. 57' , 'Berlin' , NULL , '12209' , 'Germany' , '030-0074321' , '030-0076545' ) |
3 | INSERT "Customers" VALUES ( 'ANATR' , 'Ana Trujillo Emparedados y helados' , 'Ana Trujillo' , 'Owner' , 'Avda. de la Constitución 2222' , 'México D.F.' , NULL , '05021' , 'Mexico' , '(5) 555-4729' , '(5) 555-3745' ) |
4 | INSERT "Customers" VALUES ( 'ANTON' , 'Antonio Moreno Taquería' , 'Antonio Moreno' , 'Owner' , 'Mataderos 2312' , 'México D.F.' , NULL , '05023' , 'Mexico' , '(5) 555-3932' , NULL ) |
5 | INSERT "Customers" VALUES ( 'AROUT' , 'Around the Horn' , 'Thomas Hardy' , 'Sales Representative' , '120 Hanover Sq.' , 'London' , NULL , 'WA1 1DP' , 'UK' , '(171) 555-7788' , '(171) 555-6750' ) |
這種Code要你從100行或500行裡找出問題,或是從前端(*.aspx)組合出來的Code,要人命。不過這種情況到了MS SQL Server2008之後有了改善,MS SQL Server 2008之後支援了一個「資料表值建構函式」,看起來文言文,但用起來是相當容易:
1 | INSERT "Customers" VALUES |
2 | ( 'ALFKI' , 'Alfreds Futterkiste' , 'Maria Anders' , 'Sales Representative' , 'Obere Str. 57' , 'Berlin' , NULL , '12209' , 'Germany' , '030-0074321' , '030-0076545' ), |
3 | ( 'ANATR' , 'Ana Trujillo Emparedados y helados' , 'Ana Trujillo' , 'Owner' , 'Avda. de la Constitución 2222' , 'México D.F.' , NULL , '05021' , 'Mexico' , '(5) 555-4729' , '(5) 555-3745' ), |
4 | ( 'ANTON' , 'Antonio Moreno Taquería' , 'Antonio Moreno' , 'Owner' , 'Mataderos 2312' , 'México D.F.' , NULL , '05023' , 'Mexico' , '(5) 555-3932' , NULL ), |
5 | ( 'AROUT' , 'Around the Horn' , 'Thomas Hardy' , 'Sales Representative' , '120 Hanover Sq.' , 'London' , NULL , 'WA1 1DP' , 'UK' , '(171) 555-7788' , '(171) 555-6750' ) |
有沒有看出差異?
1 | Insert 資料表 |
2 | Values (第一筆資料), (第二筆資料), (第三筆資料), ...n |
我就不用每一筆資料就必須寫一行Insert,在Values之後可以接最大1000筆的資料。這樣簡化Insert ... Values ...語法之後,不論是字串的組合上,或是後續的除錯上都可減輕工作量。
重點整理:
- SQL Server 2008後才有支援。
- Values後的資料列,以括號括住,並以逗點隔開。
- Values後的資料列,最大1000筆,超過部分(1001筆)必須建立新的Insert來執行。
T-SQL -- UPDATE加強版之WRITE子句修改大數值資料類型(MAX)
在MS SQL Server 2005新增了「MAX」的資料類型,如:varchar(MAX)、nvarchar(MAX)、varbinary(MAX),MSDN翻譯為「大數值資料類型」,基本上是可以儲存到2^31-1位元組的資料,而且加強了數種功能:
如果你使用MS SQL Server 2005之後的版本,請注意以上訊息。
我們來看Update含Write()子句的語法:
看實例:
使用Write()子句只有一點點不方便,就是你必須自己計算「起點位置」及「長度」,還有不能更新值為Null等。
- 在triger中,可以在inserted和deleted資料表中使用大數值資料類型;
- Update新增Write()函數,可以對大數值資料類型執行區塊更新;
在未來的 Microsoft SQL Server 版本中,將移除 ntext、text 和 image 等資料類型。請避免在新的開發工作中使用這些資料類型,並規劃修改目前在使用這些資料類型的應用程式。請改用 nvarchar(max)、varchar(max) 和 varbinary(max)。
如果你使用MS SQL Server 2005之後的版本,請注意以上訊息。
UPDATE之WRITE()子句
我們來看Update含Write()子句的語法:
1 | Update 資料表 |
2 | Set 資料行 = .Write(運算式, 起點位置,長度) |
3 | From 來源資料表 |
4 | Where 條件 |
看實例:
01 | -- 暫存資料表 |
02 | CREATE TABLE #t1 |
03 | ( |
04 | id INT IDENTITY(1,1) NOT NULL , |
05 | CONTENT NVARCHAR( MAX ) |
06 | ); |
07 | GO |
08 |
09 | -- 新增兩筆資料,也是使用SQL Server 2005的新語法 |
10 | INSERT #t1 VALUES |
11 | (N '在MS SQL Server 2005新增了「MAX」的資料類型,如:varchar(MAX)、nvarchar(MAX)、varbinary(MAX),MSDN翻譯為「大數值資料類型」,基本上是可以儲存到2^31-1位元組的資料,而且加強了數種功能' ), |
12 | (N '在未來的 Microsoft SQL Server 版本中,將移除 ntext、text 和 image 等資料類型。請避免在新的開發工作中使用這些資料類型,並規劃修改目前在使用這些資料類型的應用程式。請改用 nvarchar(max)、varchar(max) 和 varbinary(max)。' ) |
13 | GO |
14 |
15 | -- 將id=1的MS換成Microsoft |
16 | -- 起點位置由0開始計算 |
17 | UPDATE #t1 |
18 | SET CONTENT.write( 'Microsoft' ,1,2) |
19 | WHERE id=1 |
20 |
21 | -- 將id=2的Microsoft換成MS |
22 | UPDATE #t1 |
23 | SET CONTENT.write( 'MS' ,5,9) |
24 | WHERE id=2 |
25 | GO |
26 |
27 | SELECT * |
28 | FROM #t1 |
29 | GO |
30 |
31 | DROP TABLE #t1 |
32 | GO |
使用Write()子句只有一點點不方便,就是你必須自己計算「起點位置」及「長度」,還有不能更新值為Null等。