資料表值建構函式(Transact-SQL)

文章推薦指數: 80 %
投票人數:10人

VALUES 陳述式的VALUES 子句,或指定為MERGE 陳述式之USING 子句或FROM 子句中的 ... VALUES ( ) [ ,...n ] )[,...n] ::= {}[,...n] ::= {DEFAULT|NULL|expression} 注意 若要檢視SQLServer2014與更早版本的Transact-SQL語法,請參閱舊版文件。

引數 VALUES 導入資料列值運算式清單。

每一個清單都必須以括號括住,並以逗點隔開。

每一個清單中指定的值數目都必須相同,而且值的順序必須與資料表中的資料行相同。

必須指定資料表中每一個資料行的值,或者資料行清單必須明確指定每一個內送值的資料行。

DEFAULT 強制DatabaseEngine插入定義給資料行的預設值。

如果資料行的預設值不存在,而且資料行允許Null值,就會插入NULL。

DEFAULT對識別欄位無效。

在資料表值建構函式中指定時,INSERT陳述式中只允許DEFAULT。

expression 這是一個常數、變數或運算式。

此運算式不能包含EXECUTE陳述式。

限制事項 用作衍生資料表時,資料列數目沒有限制。

作為INSERT...VALUES陳述式的VALUES子句時,資料列數目限制為1000個。

如果資料列數目超過最大值,就會傳回錯誤10738。

若要插入1000個以上的資料列,請使用下列其中一種方法: 建立多個INSERT陳述式 使用衍生資料表 使用bcp公用程式(.NETSqlBulkCopyclass、OPENROWSET(BULK...))或BULKINSERT陳述式來大量匯入資料 只允許使用單一純量值當做資料列值運算式。

不允許使用牽涉多個資料行的子查詢當做資料列值運算式。

例如,下列程式碼會產生語法錯誤,因為第三個資料列值運算式清單包含具有多個資料行的子查詢。

USEAdventureWorks2012; GO CREATETABLEdbo.MyProducts(NameVARCHAR(50),ListPriceMONEY); GO --Thisstatementfailsbecausethethirdvalueslistcontainsmultiplecolumnsinthesubquery. INSERTINTOdbo.MyProducts(Name,ListPrice) VALUES('Helmet',25.50), ('Wheel',30.00), (SELECTName,ListPriceFROMProduction.ProductWHEREProductID=720); GO 不過,您可以個別在子查詢中指定每個資料行,藉以重新撰寫此陳述式。

下列範例會成功地將三個資料列插入MyProducts資料表中。

INSERTINTOdbo.MyProducts(Name,ListPrice) VALUES('Helmet',25.50), ('Wheel',30.00), ((SELECTNameFROMProduction.ProductWHEREProductID=720), (SELECTListPriceFROMProduction.ProductWHEREProductID=720)); GO 資料類型 在多重資料列INSERT陳述式中指定的值會遵循UNIONALL語法的資料類型轉換屬性。

這會導致將不相符的類型隱含地轉換成較高優先順序的類型。

如果轉換不是支援的隱含轉換,就會傳回錯誤。

例如,下列陳述式會將整數值和字元值插入至類型為char的資料行中。

CREATETABLEdbo.t(aINT,bCHAR); GO INSERTINTOdbo.tVALUES(1,'a'),(2,1); GO 當執行INSERT陳述式時,SQLServer會嘗試將'a'轉換成整數,因為資料類型優先順序指出整數的類型高於字元。

轉換會失敗,並傳回錯誤。

您可以適當且明確地轉換值來避免這個錯誤。

例如,可以依照以下方式撰寫上面的陳述式。

INSERTINTOdbo.tVALUES(1,'a'),(2,CONVERT(CHAR,1)); 範例 A.插入多個資料列 下列範例會建立dbo.Departments資料表,然後使用資料表值建構函式將五個資料列插入此資料表。

由於提供了所有資料行的值,而且依照資料表中資料行的相同順序來列出它們,因此,不需要在資料行清單中指定資料行名稱。

USEAdventureWorks2012; GO INSERTINTOProduction.UnitMeasure VALUES(N'FT2',N'SquareFeet','20080923'),(N'Y',N'Yards','20080923'), (N'Y3',N'CubicYards','20080923'); GO B.插入具有DEFAULT和NULL值的多個資料列 下列範例會示範在使用資料表值建構函式將資料列插入資料表時,如何指定DEFAULT和NULL。

USEAdventureWorks2012; GO CREATETABLESales.MySalesReason( SalesReasonIDintIDENTITY(1,1)NOTNULL, Namedbo.NameNULL, ReasonTypedbo.NameNOTNULLDEFAULT'NotApplicable'); GO INSERTINTOSales.MySalesReason VALUES('Recommendation','Other'),('Advertisement',DEFAULT),(NULL,'Promotion'); SELECT*FROMSales.MySalesReason; C.將多個值指定為FROM子句中的衍生資料表 下列範例會使用資料表值建構函式,在SELECT陳述式的FROM子句中指定多個值。

SELECTa,bFROM(VALUES(1,2),(3,4),(5,6),(7,8),(9,10))ASMyTable(a,b); GO --Usedinaninnerjointospecifyvaluestoreturn. SELECTProductID,a.Name,Color FROMProduction.ProductASa INNERJOIN(VALUES('Blade'),('CrownRace'),('AWCLogoCap'))ASb(Name) ONa.Name=b.Name; D.在MERGE陳述式中將多個值指定為衍生的來源資料表 下列範例會使用MERGE,藉由更新或插入資料列來修改SalesReason資料表。

當來源資料表中的NewName值符合目標資料表(Name)中SalesReason資料行內的值時,就會更新目標資料表中的ReasonType資料行。

當NewName的值不相符時,來源資料列會插入目標資料表中。

來源資料表是一種衍生資料表,可使用Transact-SQL資料表值建構函式針對來源資料表指定多個資料列。

USEAdventureWorks2012; GO --Createatemporarytablevariabletoholdtheoutputactions. DECLARE@SummaryOfChangesTABLE(ChangeVARCHAR(20)); MERGEINTOSales.SalesReasonASTarget USING(VALUES('Recommendation','Other'),('Review','Marketing'),('Internet','Promotion')) ASSource(NewName,NewReasonType) ONTarget.Name=Source.NewName WHENMATCHEDTHEN UPDATESETReasonType=Source.NewReasonType WHENNOTMATCHEDBYTARGETTHEN INSERT(Name,ReasonType)VALUES(NewName,NewReasonType) OUTPUT$actionINTO@SummaryOfChanges; --Querytheresultsofthetablevariable. SELECTChange,COUNT(*)ASCountPerChange FROM@SummaryOfChanges GROUPBYChange; E.插入超過1000個資料列 下列範例示範如何使用資料表值建構函式作為衍生資料表。

這允許從單一資料表值建構函式插入超過1000個資料列。

CREATETABLEdbo.Test([Value]INT); INSERTINTOdbo.Test([Value]) SELECTdrvd.[NewVal] FROM(VALUES(0),(1),(2),(3),...,(5000))drvd([NewVal]); 另請參閱 INSERT(Transact-SQL) MERGE(Transact-SQL) FROM(Transact-SQL) 本文內容



請為這篇文章評分?