T-SQL是微軟在關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)SQL Server中的SQL-3標(biāo)準(zhǔn)的實(shí)現(xiàn),是微軟對(duì)SQL的擴(kuò)展,具有SQL的主要特點(diǎn),同時(shí)增加了變量、運(yùn)算符、函數(shù)、流程控制和注釋等語(yǔ)言元素,使得其功能更加強(qiáng)大。并且T-SQL自帶了許多實(shí)用的函數(shù),DBA可以利用這些函數(shù)來(lái)進(jìn)行更有效地管理。 T-SQL字符串函數(shù) T-SQL字符串函數(shù)---截取字符串的值 下面的一組函數(shù)詳細(xì)描述了如何截取字符串的一部分。這些函數(shù)大部分都包含在下面的SELECT語(yǔ)句中: SELECT ProductName, LEFT(ProductName, 12) AS A, SUBSTRING(ProductName, 9, 4) AS B, RIGHT(ProductName, 2) AS C, RTRIM(ProductName) AS D FROM Products 可以看到,SELECT語(yǔ)句中包括函數(shù)LEFT,SUBSTRING,RIGHT和RTRIM。執(zhí)行結(jié)果: LEFT函數(shù)返回ProductName列的前12個(gè)字符。該函數(shù)有兩個(gè)參數(shù):第一個(gè)參數(shù)是字符串表達(dá)式,第二個(gè)參數(shù)是字符數(shù)。在這個(gè)例子中,字符串表達(dá)式是ProductName列,字符數(shù)是“12”。結(jié)果,ProductName列所有值的后半部分都被截掉了,只剩下12個(gè)字符返回。 RIGHT函數(shù)的用法也是一樣的,它截取字符串右邊的部分。 SUBSTRING函數(shù)可以提取字符串的任意部分。該函數(shù)有三個(gè)參數(shù):第一個(gè)參數(shù)是字符串表達(dá)式,第二個(gè)參數(shù)是指定從哪里開(kāi)始截取,第三個(gè)參數(shù)表示截取多長(zhǎng)的字符串。在上面的例子中,字符串表達(dá)式仍然是ProductName列。第二個(gè)參數(shù)“9”的意思是我們應(yīng)該從第九個(gè)字符開(kāi)始(截取),第三個(gè)參數(shù)“4”意思是獲取四個(gè)字符。 RTRIM的功能是去掉字符串(在第一個(gè)參數(shù)中指定)尾部的所有空格。RTRIM函數(shù)還有與它相對(duì)的另一個(gè)函數(shù):LTRIM函數(shù)。它會(huì)刪除字符串左側(cè)的空格。 T-SQL字符串函數(shù)---修改字符串的值 T-SQL還包括可以在SQL Server中修改字符串值的一組函數(shù)。下面的語(yǔ)句就是一個(gè)例子: ![]() SELECT REPLACE(ProductName, 'Mountain', 'Mtn') AS ReplaceName, STUFF(ProductName, 11, 2, 'x01') AS StuffName, REVERSE(ProductName) AS ReverseNum, STUFF(ProductName, 1, 2, REPLICATE(0, 3)) AS ReplicateNum, ProductName + SPACE(4) + LOWER (ProductName) AS LowerProdLine FROM Products SELECT語(yǔ)句中包括函數(shù)REPALCE,STUFF,REVERSE和REPLICATE,LOWER。執(zhí)行結(jié)果:
函數(shù)REPLACE,用來(lái)替換給定字符串值中指定的一組字符串為新的字符串。該函數(shù)有三個(gè)參數(shù):第一個(gè)參數(shù)是字符串表達(dá)式,第二個(gè)參數(shù)是被替換的字符串,第三個(gè)參數(shù)是要替換的新字符串。 函數(shù)STUFF,它的作用是按照給定的位置刪除一組指定的字符,并插入一組新的字符。該函數(shù)有四個(gè)參數(shù):第一個(gè)參數(shù)是待操作的字符串表達(dá)式,第二個(gè)參數(shù)是待刪除的字符串的起始位置,第三個(gè)參數(shù)是要?jiǎng)h除字符的數(shù)量,第四個(gè)參數(shù)是要插入的字符串。在上面的例子中,STUFF函數(shù)指定ProductName列為待操作的字符串。要?jiǎng)h除的字符串從第11個(gè)字符(第二個(gè)參數(shù))開(kāi)始,刪除兩個(gè)字符(第三個(gè)參數(shù))。在那些字符刪除后,新字符(x01)被插入到該位置。 函數(shù)RESERVSE的作用是:把給定字符串按逆序排列。 函數(shù)REPLICATE,該函數(shù)可以把指定字符串值重復(fù)指定的次數(shù)。該函數(shù)有兩個(gè)參數(shù):第一個(gè)參數(shù)是待處理的字符串值,第二個(gè)參數(shù)是重復(fù)次數(shù)。在上面的例子中,“0”被重復(fù)了三次。 函數(shù)SPACE與函數(shù)REPLICATE類似,它返回一組空格。該函數(shù)有一個(gè)參數(shù),指定返回的空格數(shù)量。 函數(shù)LOWER,很簡(jiǎn)單,它把字符串中的大寫(xiě)字符轉(zhuǎn)換為小寫(xiě)字符。 T-SQL字符串函數(shù)---轉(zhuǎn)換字符串值 T-SQL提供可以轉(zhuǎn)換字符串值的函數(shù),如下面的SELECT語(yǔ)句所示: SELECT ProductName + CHAR(9) + STR(ProductID) AS Product, ASCII(ProductName) AsciiProductName, RTRIM(ProductName) AS ProductName, UNICODE(RTRIM(ProductName)) AS UnicodeProductName FROM Products SELECT語(yǔ)句中包括函數(shù)CHAR,STR,ASCII和RTRIM,UNICODE。執(zhí)行結(jié)果: 第一個(gè)函數(shù)是CHAR,可以把一個(gè)ASCII碼整數(shù)(從0到255)轉(zhuǎn)換為字符,該函數(shù)只有一個(gè)參數(shù)(一個(gè)ASCII碼整數(shù)值)。該函數(shù)在給你的字符串插入控制字符時(shí)非常方便,比如tab鍵(ASCII碼為9),換行符號(hào)(ASCII碼為10)或者回車符(ASCII碼為13)。 函數(shù)STR,它可以把數(shù)值型數(shù)據(jù)轉(zhuǎn)換為字符型數(shù)據(jù)。STR函數(shù)的參數(shù)是待轉(zhuǎn)換的數(shù)值型表達(dá)式。 T-SQL還支持ASCII函數(shù),可以轉(zhuǎn)換單個(gè)字符為ASCII碼整數(shù)。 UNICODE函數(shù),該函數(shù)用來(lái)把一個(gè)字符轉(zhuǎn)換為Unicode整數(shù)。該函數(shù)只有一個(gè)參數(shù):Unicode字符表達(dá)式。 T-SQL字符串函數(shù)---獲取字符串的相關(guān)信息 還有一些函數(shù)可以提供與字符串有關(guān)的信息,比如字符串長(zhǎng)度或者值內(nèi)部子串的位置。下面的SELECT語(yǔ)句就演示了幾個(gè)提供字符串相關(guān)信息的函數(shù): SELECT LEN(ProductName) AS LengthProductName, CHARINDEX('Bob', ProductName) AS CharIndexProductName, PATINDEX('%Pears%', ProductName) AS PatIndexProductName FROM Products WHERE ProductID=7 SELECT語(yǔ)句中包括函數(shù)CHAR,STR,ASCII和RTRIM,UNICODE。執(zhí)行結(jié)果:
函數(shù)LEN返回指定字符串的字符數(shù)量。該函數(shù)只有唯一參數(shù)就是待計(jì)數(shù)的字符串。 函數(shù)CHARINDEX的功能是從某字符串中指定的開(kāi)始位置查找某字符串所在位置。該函數(shù)有三個(gè)參數(shù):第一個(gè)參數(shù)是要搜索的字符串,第二個(gè)參數(shù)是待搜索范圍字符串,第三個(gè)參數(shù)是搜索開(kāi)始的位置。最后一個(gè)參數(shù)是可選的。在上面的例子中,我們?cè)赑roductName列中搜索Bob第一次出現(xiàn)的位置,它是從字符串的第7個(gè)位置開(kāi)始的。 函數(shù)PATINDEX。該函數(shù)在字符串中搜索第一次出現(xiàn)某字符串的位置。該函數(shù)有兩個(gè)參數(shù):第一個(gè)參數(shù)是要匹配的字符串,第二個(gè)參數(shù)是在其中進(jìn)行搜索的字符串。可以用通配符定義匹配模式,提供靈活的搜索模式類型。然而,如果你使用通配符“%”,你必須在待搜索字符的前面或者后面都加上它,除非你搜索以指定字符串開(kāi)頭或結(jié)尾的匹配。例如,在上面的語(yǔ)句中,“%Pears%”被指定為在ProductName值中搜索的匹配模式。結(jié)果顯示,第一次匹配的實(shí)例在第27個(gè)字符位置。 T-SQL集合函數(shù) T-SQL集合函數(shù)---基礎(chǔ)函數(shù) 在操作SQL Server數(shù)據(jù)庫(kù)中的數(shù)據(jù)時(shí),有時(shí)你可能會(huì)需要對(duì)一組數(shù)值執(zhí)行計(jì)算。此處灰?;A(chǔ),就不過(guò)多說(shuō)了。 MAX函數(shù):最大值函數(shù)。MIN函數(shù):最小值函數(shù)。AVG函數(shù):平均值函數(shù)。SUM函數(shù):求和函數(shù)。COUNT函數(shù):總計(jì)函數(shù)。 利用集合函數(shù)處理分組數(shù)據(jù)的時(shí)候,可以使用ROLLUP,CUBE或者GOURPING SETS操作符來(lái)指定包含在結(jié)果集中的附加統(tǒng)計(jì)數(shù)據(jù)。 T-SQL集合函數(shù)---獲取統(tǒng)計(jì)數(shù)據(jù) SQL Server有四個(gè)集合函數(shù)可以支持你對(duì)數(shù)值型列的一組值做數(shù)據(jù)統(tǒng)計(jì): STDEV:返回值的統(tǒng)計(jì)標(biāo)準(zhǔn)方差。 SELECT STDEV(UnitPrice) AS StdevPrice, STDEVP(UnitPrice) AS StdevpPrice, VAR(UnitPrice) AS VarPrice, VARP(UnitPrice) AS VarpPrice FROM Products 執(zhí)行結(jié)果: T-SQL 系統(tǒng)函數(shù) SQL Server內(nèi)建有可以支持你執(zhí)行各種任務(wù)的函數(shù),比如轉(zhuǎn)換數(shù)據(jù),操作字符串值,以及執(zhí)行數(shù)學(xué)計(jì)算的函數(shù)。一些SQL Server函數(shù)被歸類為系統(tǒng)函數(shù),這些函數(shù)支持你查看關(guān)于更新和插入操作的信息,提取服務(wù)器屬性設(shè)置,訪問(wèn)當(dāng)前會(huì)話及其用戶的詳細(xì)信息。你還可以利用系統(tǒng)函數(shù)執(zhí)行許多語(yǔ)言相關(guān)的任務(wù)。 T-SQL系統(tǒng)函數(shù)---查看有關(guān)數(shù)據(jù)修改的信息 SQL Server的一些系統(tǒng)函數(shù)支持獲取你的更新和插入操作的明細(xì)信息。例如,你可以獲取插入到某個(gè)表中的最后一個(gè)標(biāo)識(shí)值,或者對(duì)某個(gè)表增加或者更新的行數(shù)。要展示這些函數(shù)如何使用,我定義了下面的表并給它填充了幾行數(shù)據(jù): ![]() USE Northwind; IF OBJECT_ID('TableA', 'U') IS NOT NULL DROP TABLE dbo.TableA; CREATE TABLE dbo.TableA ( ColA INT IDENTITY(101, 100) NOT NULL, ColB VARCHAR(20) NOT NULL ); INSERT INTO TableA (ColB) VALUES('red'); INSERT INTO TableA (ColB) VALUES('blue'); INSERT INTO TableA (ColB) VALUES('green'); INSERT INTO TableA (ColB) VALUES('yellow'); INSERT INTO TableA (ColB) VALUES('orange'); SELECT * FROM TableA; 現(xiàn)在,我們來(lái)看一個(gè)例子,其中使用了幾個(gè)系統(tǒng)函數(shù)提取關(guān)于剛插入上面那個(gè)表的數(shù)據(jù)相關(guān)的信息。下面的“SELECT語(yǔ)句”包括五個(gè)函數(shù),其中三個(gè)與身份列值有關(guān),而另兩個(gè)與行數(shù)有關(guān): SELECT IDENT_CURRENT('TableA') AS LastValue, IDENT_SEED('TableA') AS SeedValue, IDENT_INCR('TableA') AS IncrValue, @@ROWCOUNT AS RowsAffected, ROWCOUNT_BIG() AS BigRowsAffected; 執(zhí)行結(jié)果: 第一個(gè)函數(shù)是IDENT_CURRENT,它提取插入表“TableA”的最后一個(gè)身份值。如你所見(jiàn),表“TableA”被指定為該函數(shù)的一個(gè)入?yún)?。該函?shù)返回的信息與添加數(shù)據(jù)時(shí)的會(huì)話無(wú)關(guān),也與添加時(shí)執(zhí)行的語(yǔ)句范圍無(wú)關(guān)。這一點(diǎn)非常重要,因?yàn)镾QL Server支持其他身份相關(guān)的函數(shù),包括專門(mén)針對(duì)當(dāng)前會(huì)話(@@IDENTITY)和當(dāng)前范圍和會(huì)話(SCOPE_IDENTITY)的函數(shù)。 IDENT_SEED函數(shù)返回起始值,而IDENT_INCR函數(shù)返回增量值。 @@ROWCOUNT 函數(shù)返回最后一個(gè)語(yǔ)句影響的行數(shù)。“ROWCOUNT_BIG”函數(shù)也做同樣的事情,唯一區(qū)別是返回值類型是bigint。如果你預(yù)計(jì)影響的行數(shù)會(huì)多于20億條數(shù)據(jù),你應(yīng)該使用這個(gè)函數(shù)。要注意,這兩個(gè)函數(shù)都不是關(guān)聯(lián)于某個(gè)表的,因?yàn)檫@兩個(gè)函數(shù)基于最后一條執(zhí)行的語(yǔ)句獲取數(shù)據(jù)。 T-SQL系統(tǒng)函數(shù)---查看服務(wù)器屬性 有時(shí),你可能想要檢索特定的服務(wù)器屬性值,這種情況下,你可以使用“SERVERPROPERTY”函數(shù)。該函數(shù)有一個(gè)參數(shù)(屬性名稱),請(qǐng)看下面的示例: SELECT SERVERPROPERTY('Edition') AS SrvEdition, SERVERPROPERTY('InstanceName') AS SrvInstance, SERVERPROPERTY('Collation') AS SrvCollation; 在這個(gè)“SELECT”語(yǔ)句中,我檢索了“Edition”,“InstanceName ”和“Collation ”屬性的設(shè)置,它們以參數(shù)的形式傳遞到函數(shù)中。該“SELECT”語(yǔ)句返回下面結(jié)果: |
|