2013年1月16日 星期三

Published 凌晨2:45 by with 0 comment

Insert / Update 加強版

例如Northwind.sql中的程式碼:












1-- Customers










2INSERT "Customers" VALUES('ALFKI','Alfreds Futterkiste','Maria Anders','Sales Representative','Obere Str. 57','Berlin',NULL,'12209','Germany','030-0074321','030-0076545')










3INSERT "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')










4INSERT "Customers" VALUES('ANTON','Antonio Moreno Taquería','Antonio Moreno','Owner','Mataderos  2312','México D.F.',NULL,'05023','Mexico','(5) 555-3932',NULL)










5INSERT "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之後支援了一個「資料表值建構函式」,看起來文言文,但用起來是相當容易:












1INSERT "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')





有沒有看出差異?












1Insert 資料表










2Values (第一筆資料), (第二筆資料), (第三筆資料), ...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位元組的資料,而且加強了數種功能:


  1. 在triger中,可以在inserted和deleted資料表中使用大數值資料類型;

  2. Update新增Write()函數,可以對大數值資料類型執行區塊更新;

我在「透過資料庫上傳下載檔案」裡提過一次,我再提一次:


在未來的 Microsoft SQL Server 版本中,將移除 ntext、text 和 image 等資料類型。請避免在新的開發工作中使用這些資料類型,並規劃修改目前在使用這些資料類型的應用程式。請改用 nvarchar(max)、varchar(max) 和 varbinary(max)

如果你使用MS SQL Server 2005之後的版本,請注意以上訊息。


UPDATE之WRITE()子句



我們來看Update含Write()子句的語法:











1Update 資料表










2Set 資料行 = .Write(運算式, 起點位置,長度)










3From 來源資料表










4Where 條件





看實例:












01-- 暫存資料表










02CREATE TABLE #t1










03(










04 id INT IDENTITY(1,1) NOT NULL,










05 CONTENT NVARCHAR(MAX)










06);










07GO










08 










09-- 新增兩筆資料,也是使用SQL Server 2005的新語法










10INSERT #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)。')










13GO










14 










15-- 將id=1的MS換成Microsoft










16-- 起點位置由0開始計算










17UPDATE #t1










18SET CONTENT.write('Microsoft',1,2)










19WHERE id=1










20 










21-- 將id=2的Microsoft換成MS










22UPDATE #t1










23SET CONTENT.write('MS',5,9)










24WHERE id=2










25GO










26 










27SELECT  *










28FROM    #t1










29GO










30 










31DROP TABLE #t1










32GO






使用Write()子句只有一點點不方便,就是你必須自己計算「起點位置」及「長度」,還有不能更新值為Null等。

 

Read More
      edit