當前位置:首頁 » 編程語言 » sqlvariant
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sqlvariant

發布時間: 2023-02-07 23:52:30

『壹』 sql-variant是指什麼

一種數據類型,用於存儲 SQL Server 2005 支持的各種數據類型(不包括 text、ntext、image、timestamp 和 sql_variant)的值。

sql_variant 的最大長度可以是 8016 個位元組。這包括基類型信息和基類型值。實際基類型值的最大長度是 8,000 個位元組。

對於 sql_variant 數據類型,必須先將它轉換為其基本數據類型值,然後才能參與諸如加減這類運算。

可以為 sql_variant 分配默認值。該數據類型還可以將 NULL 作為其基礎值,但是 NULL 值沒有關聯的基類型。而且,sql_variant 不能以另一個 sql_variant 作為它的基類型。

唯一鍵、主鍵或外鍵可能包含類型為 sql_variant 的列,但是,組成指定行的鍵的數據值的總長度不應大於索引的最大長度。該最大長度是 900 個位元組。

一個表可以包含任意多個 sql_variant 列。

不能在 CONTAINSTABLE 和 FREETEXTTABLE 中使用 sql_variant。

ODBC 不完全支持 sql_variant。因此,使用 Microsoft OLE DB Provider for ODBC (MSDASQL) 時,sql_variant 列的查詢將作為二進制數據返回。例如,包含字元串數據 'PS2091' 的 sql_variant 列將作為 0x505332303931 返回。

下列規則適用於 sql_variant 比較:

當不同基本數據類型的 sql_variant 值進行比較,而且基本數據類型屬於不同的數據類型系列時,則在層次結構圖中數據類型系列較高的值被認為在兩個值中較大。

當不同基本數據類型的 sql_variant 值進行比較,而且基本數據類型屬於相同的數據類型系列時,則在層次結構圖中基本數據類型較低的值先隱式轉換為其他數據類型,然後再進行比較。

在比較 char、nvarchar、nchar 或 varchar 數據類型的 sql_variant 值時,將基於以下條件進行計算:LCID、LCID 版本、比較標志和排序 ID。各個條件按所列出的順序作為整數值進行比較。

『貳』 SQL中數據類型有哪些

int 整型 int 數據類型可以存儲從- 231(-2147483648)到231 (2147483 647)之間的整數。存儲到資料庫的幾乎所有數值型的數據都可以用這種數據類型。這種數據類型在資料庫里佔用4個位元組

tinyint 整型 tinyint 數據類型能存儲從0到255 之間的整數。它在你只打算存儲有限數目的數值時很有用。 這種數據類型在資料庫中佔用1 個位元組

float 近似數值型 float 數據類型是一種近似數值類型,供浮點數使用。說浮點數是近似的,是因為在其范圍內不是所有的數都能精確表示。浮點數可以是從-1.79E+308到1.79E+308 之間的任意數

bit 整型 bit 數據類型是整型,其值只能是0、1或空值。這種數據類型用於存儲只有兩種可能值的數據,如Yes 或No、True 或Fa lse 、On 或Off

char 字元型 char數據類型用來存儲指定長度的定長非統一編碼型的數據。當定義一列為此類型時,你必須指定列長。當你總能知道要存儲的數據的長度時,此數據類型很有用。例如,當你按郵政編碼加4個字元格式來存儲數據時,你知道總要用到10個字元。此數據類型的列寬最大為8000 個字元

varchar 字元型 varchar數據類型,同char類型一樣,用來存儲非統一編碼型字元數據。與char 型不一樣,此數據類型為變長。當定義一列為該數據類型時,你要指定該列的最大長度。 它與char數據類型最大的區別是,存儲的長度不是列長,而是數據的長度

nchar 統一編碼字元型 nchar 數據類型用來存儲定長統一編碼字元型數據。統一編碼用雙位元組結構來存儲每個字元,而不是用單位元組(普通文本中的情況)。它允許大量的擴展字元。此數據類型能存儲4000種字元,使用的位元組空間上增加了一倍

nvarchar 統一編碼字元型 nvarchar 數據類型用作變長的統一編碼字元型數據。此數據類型能存儲4000種字元,使用的位元組空間增加了一倍

text 字元型 text 數據類型用來存儲大量的非統一編碼型字元數據。這種數據類型最多可以有231-1或20億個字元

datetime 日期時間型 datetime數據類型用來表示日期和時間。這種數據類型存儲從1753年1月1日到9999年12月3 1日間所有的日期和時間數據, 精確到三百分之一秒或3.33毫秒

Smalldatetime 日期時間型 smalldatetime 數據類型用來表示從1900年1月1日到2079年6月6日間的日期和時間,精確到一分鍾

image 二進制數據類型 image 數據類型用來存儲變長的二進制數據,最大可達231-1或大約20億位元組

基本查詢
select column1,columns2,...
from table_name
說明:把table_name 的特定欄位資料全部列出來
select *
from table_name
where column1 = ***
[and column2 > yyy] [or column3 <> zzz]
說明:
1.'*'表示全部的欄位都列出來。
2.where 之後是接條件式,把符合條件的資料列出來。

select column1,column2
from table_name
order by column2 [desc]
說明:order by 是指定以某個欄位做排序,[desc]是指從大到小排列,若沒有指明,則是從小到大
排列

組合查詢
組合查詢是指所查詢得資料來源並不只有單一的表格,而是聯合一個以上的
表格才能夠得到結果的。
select *
from table1,table2
where table1.colum1=table2.column1
說明:
1.查詢兩個表格中其中 column1 值相同的資料。
2.當然兩個表格相互比較的欄位,其資料形態必須相同。
3.一個復雜的查詢其動用到的表格可能會很多個。

整合性的查詢:
select count (*)
from table_name
where column_name = ***
說明:
查詢符合條件的資料共有幾筆。
select sum(column1)
from table_name
說明:
1.計算出總和,所選的欄位必須是可數的數字形態。
2.除此以外還有 avg() 是計算平均、max()、min()計算最大最小值的整合性查詢。
select column1,avg(column2)
from table_name
group by column1
having avg(column2) > ***
說明:
1.group by: 以column1 為一組計算 column2 的平均值必須和 avg、sum等整合性查詢的關鍵字
一起使用。
2.having : 必須和 group by 一起使用作為整合性的限制。

復合性的查詢
select *
from table_name1
where exists (
select *<BR>from table_name2
where conditions )
說明:
1.where 的 conditions 可以是另外一個的 query。
2.exists 在此是指存在與否。
select *
from table_name1
where column1 in (
select column1
from table_name2
where conditions )
說明:
1. in 後面接的是一個集合,表示column1 存在集合裡面。
2. select 出來的資料形態必須符合 column1。

其他查詢
select *
from table_name1
where column1 like 'x%'
說明:like 必須和後面的'x%' 相呼應表示以 x為開頭的字串。
select *
from table_name1
where column1 in ('***','yyy',..)
說明:in 後面接的是一個集合,表示column1 存在集合裡面。
select *
from table_name1
where column1 between xx and yy
說明:between 表示 column1 的值介於 xx 和 yy 之間。

3、更改資料:
update table_name
set column1='***'
where conditoins
說明:
1.更改某個欄位設定其值為'***'。
2.conditions 是所要符合的條件、若沒有 where 則整個 table 的那個欄位都會全部被更改。

4、刪除資料:
delete from table_name
where conditions
說明:刪除符合條件的資料。

說明:關於where條件後面如果包含有日期的比較,不同資料庫有不同的表達式。具體如下:
(1)如果是access資料庫,則為:where mydate>#2000-01-01#
(2)如果是oracle資料庫,則為:where mydate>cast('2000-01-01' as date)
或:where mydate>to_date('2000-01-01','yyyy-mm-dd')
在delphi中寫成:
thedate='2000-01-01';
query1.sql.add('select * from abc where mydate>cast('+''''+thedate+''''+' as date)');

如果比較日期時間型,則為:
where mydatetime>to_date('2000-01-01 10:00:01','yyyy-mm-dd hh24:mi:ss')

4、增加資料:
insert into table_name (column1,column2,...)
values ( value1,value2, ...)
說明:
1.若沒有指定column 系統則會按表格內的欄位順序填入資料。
2.欄位的資料形態和所填入的資料必須吻合。
3.table_name 也可以是景觀 view_name。

insert into table_name (column1,column2,...)
select columnx,columny,... from another_table
說明:也可以經過一個子查詢(subquery)把別的表格的資料填入。

『叄』 SQL Server資料庫--表--新建表時的數據類型都是什麼意思啊

(1) 整數型
整數包括bigint、int、smallint和tinyint,從標識符的含義就可以看出,它們的表示數范圍逐漸縮小。
l bigint:大整數,數范圍為 -263 (-9223372036854775808)~263-1 (9223372036854775807) ,其精度為19,小數位數為0,長度為8位元組。
l int:整數,數范圍為 -231 (-2,147,483,648) ~231 - 1 (2,147,483,647) ,其精度為10,小數位數為0,長度為4位元組。
l smallint:短整數,數范圍為 -215 (-32768) ~215 - 1 (32767) ,其精度為5,小數位數為0,長度為2位元組。
l tinyint:微短整數,數范圍為 0~255,長度為1位元組,其精度為3,小數位數為0,長度為1位元組。
(2) 精確整數型
精確整數型數據由整數部分和小數部分構成,其所有的數字都是有效位,能夠以完整的精度存儲十進制數。精確整數型包括decimal 和 numeric兩類。從功能上說兩者完全等價,兩者的唯一區別在於decimal不能用於帶有identity關鍵字的列。
聲明精確整數型數據的格式是numeric | decimal(p[,s]),其中p為精度,s為小數位數,s的預設值為0。例如指定某列為精確整數型,精度為6,小數位數為3,即decimal(6,3),那麼若向某記錄的該列賦值56.342689時,該列實際存儲的是56.3427。
decimal和numeric可存儲從 -1038 +1 到 1038 –1 的固定精度和小數位的數字數據,它們的存儲長度隨精度變化而變化,最少為5位元組,最多為17位元組。
l 精度為1~9時,存儲位元組長度為5;
l 精度為10~19時,存儲位元組長度為9;
l 精度為20~28時,存儲位元組長度為13;
l 精度為29~38時,存儲位元組長度為17。
例如若有聲明numeric(8,3),則存儲該類型數據需5位元組,而若有聲明numeric(22,5),則存儲該類型數據需13位元組。
注意:聲明精確整數型數據時,其小數位數必須小於精度;在給精確整數型數據賦值時,必須使所賦數據的整數部分位數不大於列的整數部分的長度。
(3) 浮點型
浮點型也稱近似數值型。顧名思義,這種類型不能提供精確表示數據的精度,使用這種類型來存儲某些數值時,有可能會損失一些精度,所以它可用於處理取值范圍非常大且對精確度要求不是十分高的數值量,如一些統計量。
有兩種近似數值數據類型:float[(n)]和real,兩者通常都使用科學計數法表示數據,即形為:尾數E階數,如5.6432E20,-2.98E10,1.287659E-9等。
l real:使用4位元組存儲數據,表數范圍為-3.40E + 38 到 3.40E + 38,數據精度為7位有效數字。
l float:定義中的n取值范圍是1~53,用於指示其精度和存儲大小。當n在1~24之間時,實際上是定義了一個real型數據,存儲長度為4位元組,精度為7位有效數字;當n在25~53之間時,存儲長度為8位元組,精度為15位有效數字。當預設n時,代表n在25~53之間。float型數據的數范圍為- 1.79E+308 到 1.79E+308。
(4) 貨幣型
SQL Server提供了兩個專門用於處理貨幣的數據類型:money和smallmoney,它們用十進制數表示貨幣值。
l money:數據的數范圍為-263 (-922337203685477.5808)~263-1 (922337203685477.5807) ,其精度為19,小數位數為4,長度為8位元組。money的數的范圍與bigint相同,不同的只是money型有4位小數,實際上,money就是按照整數進行運算的,只是將小數點固定在末4位。
l smallmoney:數范圍為 –231 (-2,147,48.3648) ~231 - 1 (2,147,48.3647) ,其精度為10,小數位數為4,長度為4位元組。可見smallmoney與int的關系就如同money與bigint的關系。
當向表中插入money或smallmoney類型的值時,必須在數據前面加上貨幣表示符號($),並且數據中間不能有逗號(,);若貨幣值為負數,需要在符號$的後面加上負號(-)。例如:$15000.32,$680,$-20000.9088都是正確的貨幣數據表示形式。
(5) 位型
SQL Server中的位(bit)型數據相當於其他語言中的邏輯型數據,它只存儲0和1,長度為一個位元組。但要注意,SQL Server對表中bit類型列的存儲作了優化:如果一個表中有不多於 8 個的bit列,這些列將作為一個位元組存儲,如果表中有 9 到 16 個 bit 列,這些列將作為兩個位元組存儲,更多列的情況依此類推。
當為bit類型數據賦0時,其值為0,而賦非0(如100)時,其值為1。
若表中某列為bit類型數據,那麼該列不允許為空值(有關空值概念本節稍後即做介紹),並且不允許對其建立索引。
(6) 字元型
字元型數據用於存儲字元串,字元串中可包括字母、數字和其它特殊符號(如#、@、&等等)。在輸入字元串時,需將串中的符號用單引號或雙引號括起來,如』abc』、」Abc<Cde」。
SQL Server字元型包括兩類:固定長度 (char) 或可變長度 (varchar) 字元數據類型。
l char[(n)]
定長字元數據類型,其中n定義字元型數據的長度,n在1到8000之間,預設為1。當表中的列定義為char(n)類型時,若實際要存儲的串長度不足n時,則在串的尾部添加空格以達到長度n,所以char(n)的長度為n。例如某列的數據類型為char(20),而輸入的字元串為」ahjm1922」,則存儲的是字元ahjm1922和12個空格。若輸入的字元個數超出了n,則超出的部分被截斷。
l varchar[(n)]
變長字元數據類型,其中n的規定與定長字元型char中n完全相同,但這里n表示的是字元串可達到的最大長度。varchar(n)的長度為輸入的字元串的實際字元個數,而不一定是n。例如,表中某列的數據類型為varchar(100),而輸入的字元串為」ahjm1922」,則存儲的就是字元ahjm1922,其長度為8位元組。
當列中的字元數據值長度接近一致時,例如姓名,此時可使用 char;而當列中的數據值長度顯著不同時,使用varchar較為恰當,可以節省存儲空間。
(7) Unicode字元型
Unicode是「統一字元編碼標准」,用於支持國際上非英語語種的字元數據的存儲和處理。SQL Server的Unicode字元型可以存儲Unicode標准字元集定義的各種字元。
Unicode字元型包括nchar[(n)]和nvarchar[(n)]兩類。nchar是固定長度 Unicode 數據的數據類型,nvarchar 是可變長度 Unicode 數據的數據類型,二者均使用 UNICODE UCS-2 字元集。
l nchar[(n)]:nchar[(n)]為包含n個字元的固定長度 Unicode 字元型數據,n 的值在 1 與 4,000 之間,預設為1。長度為2n位元組。若輸入的字元串長度不足n,將以空白字元補足。
l nvarchar[(n)]:nvarchar[(n)]為最多包含n個字元的可變長度 Unicode 字元型數據,n 的值在 1 與 4,000之間,預設為1。長度是所輸入字元個數的兩倍。
實際上,nchar、nvarchar與char、varchar的使用非常相似,只是字元集不同(前者使用Unicode字元集,後者使用ASCII字元集)。
(8) 文本型
當需要存儲大量的字元數據,如較長的備注、日誌信息等等,字元型數據的最長8000個字元的限制可能使它們不能滿足這種應用需求,此時可使用文本型數據。
文本型包括text和ntext兩類,分別對應ASCII字元和Unicode字元。text類型可以表示最大長度為 231-1 (2,147,483,647) 個字元,其數據的存儲長度為實際字元數個位元組。ntext可表示最大長度為 230 - 1 (1,073,741,823) 個Unicode字元,其數據的存儲長度是實際字元個數的兩倍(以位元組為單位)。
(9) 二進制型
二進制數據類型表示的是位數據流,包括binary(固定長度)和varbinary(可變長度)兩種。
l binary [(n) ]:固定長度的n個位元組二進制數據。n取值范圍為 1 到 8,000,預設為1。binary(n)數據的存儲長度為 n+4 位元組。若輸入的數據長度小於n,則不足部分用0填充;若輸入的數據長度大於n,則多餘部分被截斷。
輸入二進制值時,在數據前面要加上0x,可以用的數字元號為0—9、A—F(字母大小寫均可)。因此,二進制數據有時也被稱為十六進制數據。例如0xFF、0x12A0分別表示值FF和12A0。因為每位元組的數最大為FF,故在「0x」格式的數據每兩位佔1個位元組。
l varbinary [(n) ]:n個位元組變長二進制數據。n取值范圍為 1 到 8,000,預設為1。varbinary(n)數據的存儲長度為實際輸入數據長度+4個位元組。
(10) 日期時間類型
日期時間類型數據用於存儲日期和時間信息,包括datetime和smalldatetime兩類。
l datetime:datetime類型可表示的日期范圍從 1753 年 1 月 1 日到 9999 年 12 月 31 日的日期和時間數據,精確度為百分之三秒(3.33 毫秒或 0.00333 秒),例如1到3毫秒的值都表示為0毫秒,4到6毫秒的值都表示為4毫秒。
datetime類型數據長度為8位元組,日期和時間分別使用4個位元組存儲。前4 位元組用於存儲datetime類型數據中距1900 年 1 月 1 日的天數,為正數表示日期在1900年1月1日之後,為負數則表示日期在1900年1月1日之前。後4個位元組用於存儲datetime類型數據中距12:00(24小時制)的毫秒數。
用戶以字元串形式輸入datetime類型數據,系統也以字元串形式輸出datetime類型數據,將用戶輸入到系統以及系統輸出的datetime類型數據的字元串形式稱為datetime類型數據的「外部形式」,而將datetime在系統內的存儲形式稱為「內部形式」,SQL Server負責datetime類型數據的兩種表現形式之間的轉換,包括合法性檢查。
用戶給出datetime類型數據值時,日期部分和時間部分分別給出。
日期部分的表示形式常用的格式如下:

年 月 日 2001 Jan 20、2001 Janary 20
年 日 月 2001 20 Jan
月 日[,]年 Jan 20 2001、Jan 20,2001、Jan 20,01
月 年 日 Jan 2001 20
日 月[,]年 20 Jan 2001、20 Jan,2001
日 年 月 20 2001 Jan
年(4位數) 2001表示2001年1月1日
年月日 20010120、010120
月/日/年 01/20/01、1/20/01、01/20/2001、1/20/2001
月-日-年 01-20-01、1-20-01、01-20-2001、1-20-2001
月.日.年 01.20.01、1.20.01、01.20.2001、1.20.2001

說明:年可用4位或2位表示,月和日可用1位或2位表示。
時間部分常用的表示格式如下:

時:分 10:20、08:05
時:分:秒 20:15:18、20:15:18.2
時:分:秒:毫秒 20:15:18:200
時:分AM|PM 10:10AM、10:10PM

l smalldatetime:smalldatetime類型數據可表示從 1900 年 1 月 1 日到 2079 年 6 月 6 日的日期和時間,數據精確到分鍾,即29.998 秒或更低的值向下舍入為最接近的分鍾,29.999 秒或更高的值向上舍入為最接近的分鍾。Smalldatetime類型數據的存儲長度為4位元組,前2個位元組用來存儲smalldatetime類型數據中日期部分距1900年1月1日之後的天數;後2個位元組用來存儲smalldatetime類型數據中時間部分距中午12點的分鍾數。
用戶輸入smalldatetime類型數據的格式與datetime類型數據完全相同,只是它們的內部存儲可能不相同。
(11) 時間戳型
標識符是timestamp。若創建表時定義一個列的數據類型為時間戳類型,那麼每當對該表加入新行或修改已有行時,都由系統自動將一個計數器值加到該列,即將原來的時間戳值加上一個增量。記錄timestamp列的值實際上反映了系統對該記錄修改的相對(相對於其他記錄)順序。一個表只能有一個timestamp 列。Timestamp類型數據的值實際上是二進制格式數據,其長度為8位元組。
(12) 圖象數據類型
標識符是image,它用於存儲圖片、照片等。實際存儲的是可變長度二進制數據,介於 0 與 231-1 (2,147,483,647) 位元組之間。
(13) 其它數據類型
除了上面所介紹的常用數據類型外,SQL Server 2000還提供了其它幾種數據類型:cursor、sql_variant、table和uniqueidentifier。
Cursor:是游標數據類型,用於創建游標變數或定義存儲過程的輸出參數。
Sql_variant:是一種存儲 SQL Server 支持的各種數據類型(除text、ntext、image、timestamp 和 sql_variant 外)值的數據類型。Sql_variant的最大長度可達 8016 位元組。
Table:是用於存儲結果集的數據類型,結果集可以供後續處理。
Uniqueidentifier:是唯一標識符類型。系統將為這種類型的數據產生唯一標識值,它是一個16位元組長的二進制數據。

『肆』 SQL 建表

alter table hh [decimal](18, 4) NULL
decimal類型保留小數點後面四位

ALTER TABLE
通過更改、添加、除去列和約束,或者通過啟用或禁用約束和觸發器來更改表的定義。

語法
ALTER TABLE table
{ [ ALTER COLUMN column_name
{ new_data_type [ ( precision [ , scale ] ) ]
[ COLLATE < collation_name > ]
[ NULL | NOT NULL ]
| {ADD | DROP } ROWGUIDCOL }
]
| ADD
{ [ < column_definition > ]
| column_name AS computed_column_expression
} [ ,...n ]
| [ WITH CHECK | WITH NOCHECK ] ADD
{ < table_constraint > } [ ,...n ]
| DROP
{ [ CONSTRAINT ] constraint_name
| COLUMN column } [ ,...n ]
| { CHECK | NOCHECK } CONSTRAINT
{ ALL | constraint_name [ ,...n ] }
| { ENABLE | DISABLE } TRIGGER
{ ALL | trigger_name [ ,...n ] }
}

< column_definition > ::=
{ column_name data_type }
[ [ DEFAULT constant_expression ] [ WITH VALUES ]
| [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ]
]
[ ROWGUIDCOL ]
[ COLLATE < collation_name > ]
[ < column_constraint > ] [ ...n ]

< column_constraint > ::=
[ CONSTRAINT constraint_name ]
{ [ NULL | NOT NULL ]
| [ { PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[ WITH FILLFACTOR = fillfactor ]
[ ON { filegroup | DEFAULT } ]
]
| [ [ FOREIGN KEY ]
REFERENCES ref_table [ ( ref_column ) ]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ]
[ NOT FOR REPLICATION ]
]
| CHECK [ NOT FOR REPLICATION ]
( logical_expression )
}

< table_constraint > ::=
[ CONSTRAINT constraint_name ]
{ [ { PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
{ ( column [ ,...n ] ) }
[ WITH FILLFACTOR = fillfactor ]
[ ON { filegroup | DEFAULT } ]
]
| FOREIGN KEY
[ ( column [ ,...n ] ) ]
REFERENCES ref_table [ ( ref_column [ ,...n ] ) ]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ]
[ NOT FOR REPLICATION ]
| DEFAULT constant_expression
[ FOR column ] [ WITH VALUES ]
| CHECK [ NOT FOR REPLICATION ]
( search_conditions )
}

參數
table

是要更改的表的名稱。如果表不在當前資料庫中或者不屬於當前用戶所擁有,可以顯式指定資料庫和所有者。

ALTER COLUMN

指定要更改給定列。如果兼容級別是 65 或小於 65,將不允許使用 ALTER COLUMN。有關更多信息,請參見 sp_dbcmptlevel。

要更改的列不能是:

數據類型為 text、image、ntext 或 timestamp 的列。

表的 ROWGUIDCOL 列。

計算列或用於計算列中的列。

被復制列。

用在索引中的列,除非該列數據類型是 varchar、nvarchar 或 varbinary,數據類型沒有更改,而且新列大小等於或者大於舊列大小。

用在由 CREATE STATISTICS 語句創建的統計中的列。首先用 DROP STATISTICS 語句刪除統計。由查詢優化器自動生成的統計會由 ALTER COLUMN 自動除去。

用在 PRIMARY KEY 或 [FOREIGN KEY] REFERENCES 約束中的列。

用在 CHECK 或 UNIQUE 約束中的列,除非用在 CHECK 或 UNIQUE 約束中的可變長度列的長度允許更改。

有相關聯的默認值的列,除非在不更改數據類型的情況下允許更改列的長度、精度或小數位數。
有些數據類型的更改可能導致數據的更改。例如,將數據類型為 nchar 或 nvarchar 的列更改為 char 或 varchar 類型,將導致擴展字元的轉換。有關更多信息,請參見 CAST 和 CONVERT。降低列的精度和小數位數可能導致數據截斷。

column_name

是要更改、添加或除去的列的名稱。對於新列,如果數據類型為 timestamp,column_name 可以省略。對於 timestamp 數據類型的列,如果未指定 column_name,將使用名稱 timestamp。

new_data_type

是要更改的列的新數據類型。要更改的列的 new_data_type 應符合下列准則:

原來的數據類型必須可以隱式轉換為新數據類型。

new_data_type 類型不能為 timestamp。

對 ALTER COLUMN,ANSI 空默認值始終打開;如果沒有指定,列將可為空。

對 ALTER COLUMN,ANSI 填充始終打開。

如果要更改的列是標識列,new_data_type 必須是支持標識屬性的數據類型。

將忽略 SET ARITHABORT 的當前設置。ALTER TABLE 語句的行為如同 ARITHABORT 選項為 ON 時一樣。
precision

是指定數據類型的精度。有關有效精度值的更多信息,請參見精度、小數位數和長度。

scale

是指定數據類型的小數位數。有關有效小數位數值的更多信息,請參見精度、小數位數和長度。

COLLATE < collation_name >

為更改列指定新的排序規則。排序規則名稱既可以是 Windows 排序規則名稱,也可以是 SQL 排序規則名稱。有關列表及更多信息,請參見 Windows 排序規則名稱 和 SQL 排序規則名稱。

COLLATE 子句只能用於更改數據類型為 char、varchar、text、nchar、nvarchar 和 ntext 的列的排序規則。如果未指定,則此列採用資料庫的默認排序規則。

若滿足下列條件,則 ALTER COLUMN 不能更改排序規則:

檢查約束、外鍵約束或計算列引用了更改列。

在此列上創建了索引、統計或全文索引。更改列的排序規則時,該列上自動創建的統計將除去。

SCHEMABOUND 視圖或函數引用了此列。
有關 COLLATE 子句的更多信息,請參見 COLLATE。

NULL | NOT NULL

指定該列是否可接受空值。不允許空值的列只有在指定了默認值的情況下,才能用 ALTER TABLE 語句向表中添加。添加到表中的新列要麼允許空值,要麼必須指定默認值。

如果新列允許空值,而且沒有指定默認值,那麼新列在表中每一行都包含空值。如果新列允許空值並且指定了新列的默認值,那麼可以使用 WITH VALUES 選項在表中所有現有行的新列中存儲默認值。

如果新列不允許空值,那麼新列必須具有 DEFAULT 定義,而且新列的所有現有行中將自動裝載該默認值。

可在 ALTER COLUMN 語句中指定 NULL 以使 NOT NULL 列允許空值,但 PRIMARY KEY 約束中的列除外。只有列中不包含空值時,ALTER COLUMN 中才可指定 NOT NULL。必須將空值更新為非空值後,才允許執行 ALTER COLUMN NOT NULL 語句,比如:

UPDATE MyTable SET NullCol = N'some_value' WHERE NullCol IS NULL

ALTER TABLE MyTable ALTER COLUMN NullCOl NVARCHAR(20) NOT NULL

如果 ALTER COLUMN 中指定了 NULL 或 NOT NULL,那麼必須同時指定 new_data_type [(precision [, scale ])]。如果不更改數據類型、精度和小數位數,請指定列的這些值的當前值。

[ {ADD | DROP} ROWGUIDCOL ]

指定在指定列上添加或除去 ROWGUIDCOL 屬性。ROWGUIDCOL 是一個關鍵字,表示列是行全局唯一標識符列。對於每個表只能指派一個 uniqueidentifier 列作為 ROWGUIDCOL 列。ROWGUIDCOL 屬性只能指派給 uniqueidentifier 列。

ROWGUIDCOL 屬性並不強制列中所存儲值的唯一性。該屬性也不會為插入到表中的新行自動生成值。若要為每列生成唯一值,那麼或者在 INSERT 語句中使用 NEWID 函數,或者將 NEWID 函數指定為該列的默認值。

ADD

指定要添加一個或多個列定義、計算列定義或者表約束。

computed_column_expression

是一個定義計算列的值的表達式。計算列是並不物理地存儲在表中的虛擬列,該列用表達式計算得出,該表達式使用同一表中的其它列。例如,計算列的定義可以是:cost AS price * qty。表達式可以是非計算列的列名、常量、函數、變數,也可以是用一個或多個運算符連接的上述元素的任意組合。表達式不能為子查詢。

計算列可用於選擇列表、WHERE 子句、ORDER BY 字句或其它任何可以使用常規表達式的位置,但下列情況除外:

計算列不能用作 DEFAULT 或 FOREIGN KEY 約束定義,也不能與 NOT NULL 約束定義一起使用。但是,如果計算列由具有確定性的表達式定義,並且索引列中允許計算結果的數據類型,則可將該列用作索引中的鍵列,或用作 PRIMARY KEY 或 UNIQUE 約束的一部分。
例如,如果表中有整數列 a 和 b,那麼計算列 a+b 上可建立索引,而計算列 a+DATEPART(dd, GETDATE()) 上則不能,因為該值將在後續調用時更改。

計算列不能作為 INSERT 或 UPDATE 語句的目標。

說明 由於表中計算列所用列中的各行可能有不同的值,所以計算列的每一行可能有不同的值。

n

是表示前面的項可重復 n 次的佔位符。

WITH CHECK | WITH NOCHECK

指定表中的數據是否用新添加的或重新啟用的 FOREIGN KEY 或 CHECK 約束進行驗證。如果沒有指定,對於新約束,假定為 WITH CHECK,對於重新啟用的約束,假定為 WITH NOCHECK。

WITH CHECK 和 WITH NOCHECK 子句不能用於 PRIMARY KEY 和 UNIQUE 約束。

如果不想用新 CHECK 或 FOREIGN KEY 約束對現有數據進行驗證,請用 WITH NOCHECK,除了個別情況,不建議這樣使用。新約束將在以後的所有更新中生效。任何在添加約束時由 WITH NOCHECK 抑制的約束違規都可能導致將來的更新失敗,如果這些更新操作要更新的行中包含不符合約束條件的數據。

查詢優化器不考慮用 WITH NOCHECK 定義的約束。將忽略這些約束,直到使用 ALTER TABLE table CHECK CONSTRAINT ALL語句重新啟用這些約束為止。

DROP { [CONSTRAINT] constraint_name | COLUMN column_name }

指定從表中刪除 constraint_name 或者 column_name。如果兼容級別小於或等於 65,將不允許 DROP COLUMN。可以列出多個列或約束。下面的列不能除去:

被復制列。

用在索引中的列。

用在 CHECK、FOREIGN KEY、UNIQUE 或 PRIMARY KEY 約束中的列。

有相關聯的默認值(由 DEFAULT 關鍵字定義)的列,或綁定到默認對象的列。

綁定到規則的列。
{ CHECK | NOCHECK} CONSTRAINT

指定啟用或禁用 constraint_name。如果禁用,將來插入或更新該列時將不用該約束條件進行驗證。此選項只能與 FOREIGN KEY 和 CHECK 約束一起使用。

ALL
指定使用 NOCHECK 選項禁用所有約束,或者使用 CHECK 選項啟用所有約束。
{ENABLE | DISABLE} TRIGGER

指定啟用或禁用 trigger_name。當一個觸發器被禁用時,它對表的定義依然存在;然而,當在表上執行 INSERT、UPDATE 或 DELETE 語句時,觸發器中的操作將不執行,除非重新啟用該觸發器。

ALL
指定啟用或禁用表中所有的觸發器。

trigger_name
指定要啟用或禁用的觸發器名稱。
column_name data_type

新列的數據類型。data_type 可以是任何 Microsoft® SQL Server™ 數據類型或用戶定義數據類型。

DEFAULT

是指定列默認值的關鍵字。DEFAULT 定義可用於為表中現有行的新列提供值。DEFAULT 定義不能添加到具有 timestamp 數據類型、IDENTITY 屬性、現有 DEFAULT 定義或綁定默認值的列。如果列已有默認值,必須除去舊默認值後才能添加新默認值。為同 SQL Server 先前版本保持兼容性,向 DEFAULT 賦予約束名是可能的。

IDENTITY

指定新列是標識列。在表中添加新行時,SQL Server 為列提供一個唯一的增量值。標識列通常與 PRIMARY KEY 約束一起用作表的唯一行標識符。IDENTITY 屬性可賦予 tinyint、smallint、int、bigint、decimal(p,0) 或者 numeric(p,0) 列。對於每個表只能創建一個標識列。DEFAULT 關鍵字和綁定默認值不能用於標識列。要麼種子和增量都同時指定,要麼都不指定。如果二者都未指定,則取默認值 (1,1)。

Seed
是用於表中所裝載的第一行的值。

Increment
是添加到前一行的標識值的增量值。
NOT FOR REPLICATION

指定當復制登錄(如 sqlrepl)向表中插入數據時,不強制 IDENTITY 屬性。也可對約束指定 NOT FOR REPLICATION。當復制登錄向表中插入數據時,不檢查約束條件。

CONSTRAINT

指定 PRIMARY KEY、UNIQUE、FOREIGN KEY 或 CHECK 約束的開始,或者指定 DEFAULT 定義的開始。

constrain_name

是新約束。約束的名稱必須符合標識符規則,但其名稱的首字元不能為 #。如果沒有提供 constraint_name,約束使用系統生成的名稱。

PRIMARY KEY

是通過唯一索引對給定的一列或多列強制實體完整性的約束。對每個表只能創建一個 PRIMARY KEY 約束。

UNIQUE

是通過唯一索引為給定的一列或多列提供實體完整性的約束。

CLUSTERED | NONCLUSTERED

指定為 PRIMARY KEY 或 UNIQUE 約束創建聚集或非聚集索引。PRIMARY KEY 約束默認為 CLUSTERED;UNIQUE 約束默認為 NONCLUSTERED。

如果表中已存在聚集約束或索引,那麼在 ALTER TABLE 中就不能指定 CLUSTERED。如果表中已存在聚集約束或索引,PRIMARY KEY 約束默認為 NONCLUSTERED。

WITH FILLFACTOR = fillfactor

指定 SQL Server 存儲索引數據時每個索引頁的充滿程度。用戶指定的 fillfactor 取值范圍從 1 到 100。如果沒有指定,那麼默認值為 0。創建索引時,fillfactor 值越低,不必分配新空間即可添加的新索引條目的可用空間就越多。有關詳細信息,請參見 CREATE INDEX。

ON {filegroup | DEFAULT}

指定為約束創建的索引的存儲位置。如果指定了 filegroup,索引將在該文件組內創建。如果指定了 DEFAULT,索引將在默認文件組內創建。如果未指定 ON,索引將在表所在的文件組內創建。當為 PRIMARY KEY 或 UNIQUE 約束添加聚集索引時,如果指定了 ON,那麼創建聚集索引時整個表都將移到指定的文件組中。

在這里,DEFAULT 不是一個關鍵字。DEFAULT 是默認文件組的標識符,必須用符號界定,如 ON "DEFAULT" 或 ON [DEFAULT]。

FOREIGN KEY...REFERENCES

是為列中數據提供引用完整性的約束。FOREIGN KEY 約束要求列中的每個值在被引用表的指定列中都存在。

ref_table

是 FOREIGN KEY 約束所引用的表。

ref_column

是新 FOREIGN KEY 約束所引用的一列或多列(置於括弧中)。

ON DELETE {CASCADE | NO ACTION}

指定當表中被更改的行具有引用關系,並且該行所引用的行從父表中刪除時,要對被更改行採取的操作。默認設置為 NO ACTION。

如果指定 CASCADE,則從父表中刪除被引用行時,也將從引用表中刪除引用行。如果指定 NO ACTION,SQL Server 將產生一個錯誤並回滾父表中的行刪除操作。

如果表中已存在 ON DELETE 的 INSTEAD OF 觸發器,那麼就不能定義 ON DELETE 的CASCADE 操作。

例如,在 Northwind 資料庫中,Orders 表和 Customers 表之間有引用關系。Orders.CustomerID 外鍵引用 Customers.CustomerID 主鍵。

如果對 Customers 表的某行執行 DELETE 語句,並且為 Orders.CustomerID 指定 ON DELETE CASCADE 操作,則 SQL Server 將在 Orders 表中檢查是否有與被刪除的行相關的一行或多行。如果存在相關行,那麼 Orders 表中的相關行將隨 Customers 表中的被引用行一同刪除。

反之,如果指定 NO ACTION,若在 Orders 表中至少有一行引用 Customers 表中要刪除的行,則 SQL Server 將產生一個錯誤並回滾 Customers 表中的刪除操作。

ON UPDATE {CASCADE | NO ACTION}

指定當表中被更改的行具有引用關系,並且該行所引用的行在父表中更新時,要對被更改行採取的操作。默認設置為 NO ACTION。

如果指定 CASCADE,則在父表中更新被引用行時,也將在引用表中更新引用行。如果指定 NO ACTION,SQL Server 將產生一個錯誤並回滾父表中的行更新操作。

如果表中已存在 ON DELETE 的 INSTEAD OF 觸發器,那麼就不能定義 ON DELETE 的CASCADE 操作。

例如,在 Northwind 資料庫中,Orders 表和 Customers 表之間有引用關系。Orders.CustomerID 外鍵引用 Customers.CustomerID 主鍵。

如果對 Customers 表的某行執行 UPDATE 語句,並且為 Orders.CustomerID 指定 ON UPDATE CASCADE 操作,則 SQL Server 將在 Orders 表中檢查是否有與被更新行相關的一行或多行。如果存在相關行,那麼 Orders 表中的相關行將隨 Customers 表中的被引用行一同更新。

反之,如果指定了 NO ACTION,若在 Orders 表中至少存在一行引用 Customers 表中要更新的行,那麼 SQL Server 將引發一個錯誤並回滾 Customers 表中的更新操作。

[ASC | DESC]

指定加入到表約束中的一列或多列的排序次序。默認設置為 ASC。

WITH VALUES

指定在添加到現有行的新列中存儲 DEFAULT constant_expression 中所給定的值。只有在 ADD 列子句中指定了 DEFAULT 的情況下,才能使用 WITH VALUES。如果要添加的列允許空值且指定了 WITH VALUES,那麼將在現有行的新列中存儲默認值。如果沒有指定 WITH VALUES 且列允許空值,那麼將在現有行的新列中存儲 NULL 值。如果新列不允許空值,那麼不論是否指定 WITH VALUES,都將在現有行的新列中存儲默認值。

column[,...n]

是新約束所用的一列或多列(置於括弧中)。

constant_expression

是用作列的默認值的字面值、NULL 或者系統函數。

FOR column

指定與表級 DEFAULT 定義相關聯的列。

CHECK

是通過限制可輸入到一列或多列中的可能值強制域完整性的約束。

logical_expression

是用於 CHECK 約束的返回 TRUE 或 FALSE 的邏輯表達式。用於 CHECK 約束的 Logical_expression 不能引用其它表,但可引用同一表中同一行的其它列。

注釋
若要添加新數據行,請使用 INSERT 語句。若要刪除數據行,請使用 DELETE 或 TRUNCATE TABLE 語句。若要更改現有行中的值,請使用 UPDATE 語句。

ALTER TABLE 語句指定的更改將立即實現。如果這些更改需要修改表中的行,ALTER TABLE 將更新這些行。ALTER TABLE 將獲取表上的架構修改鎖,以確保在更改期間其它連接不能引用該表(甚至不能引用其元數據)。對表進行的更改將記錄於日誌中,並且可以完全恢復。影響非常大的表中所有行的更改,比如除去一列或者用默認值添加 NOT NULL 列,可能需要較長時間才能完成,並會生成大量日誌記錄。如同影響大量行的 INSERT、UPDATE 或者 DELETE 語句一樣,這一類 ALTER TABLE 語句也應小心使用。

如果過程高速緩存中存在引用該表的執行計劃,ALTER TABLE 會將這些執行計劃標記為下次執行時重新編譯。

如果 ALTER TABLE 語句指定更改其它表所引用的列值,那麼根據引用表中 ON UPDATE 或者 ON DELETE 所指定的操作,將發生以下兩個事件之一。

如果在引用表中沒有指定值或指定了 NO ACTION(默認值),那麼 ALTER TABLE 語句導致的更改父表中被引用列的操作將回滾,並且 SQL Server 將引發一個錯誤。

如果在引用表中指定了 CASCADE,那麼由 ALTER TABLE 語句導致的對父表的更改將應用於父表及其相關表。
添加 sql_variant 列的 ALTER TABLE 語句會生成下列警告:

The total row size (xx) for table 'yy' exceeds the maximum number of bytes per row (8060). Rows that exceed the maximum number of bytes will not be added.
因為 sql_variant 的最大長度為 8016 個位元組,所以產生該警告。當某 sql_variant 列所含值接近最大長度時,即會超過行長度的最大位元組限制。

ALTER TABLE 語句對具有架構綁定視圖的表執行時,所受限制與當前在更改具有簡單索引的表時所受的限制相同。添加列是允許的。但是,不允許刪除或更改參與架構綁定視圖的表中的列。如果 ALTER TABLE 語句要求更改用在架構綁定視圖中的列,更改操作將失敗,並且 SQL Server 將引發一條錯誤信息。有關 SCHEMABINDING 和索引視圖的更多信息,請參見 CREATE VIEW。

創建引用表的架構綁定視圖不會影響在基表上添加或刪除觸發器。

當除去約束時,作為約束的一部分而創建的索引也將除去。而通過 CREATE INDEX 創建的索引必須使用 DROP INDEX 語句來除去。DBCC DBREINDEX 語句可用來重建約束定義的索引部分;而不必使用 ALTER TABLE 先除去再重新添加約束。

必須刪除所有基於列的索引和約束後,才能刪除列。

添加約束時,所有現有數據都要進行約束違規驗證。如果發生違規,ALTER TABLE 語句將失敗並返回一個錯誤。

當在現有列上添加新 PRIMARY KEY 或 UNIQUE 約束時,該列中的數據必須唯一。如果存在重復值,ALTER TABLE 語句將失敗。當添加 PRIMARY KEY 或 UNIQUE 約束時,WITH NOCHECK 選項不起作用。

每個 PRIMARY KEY 和 UNIQUE 約束都將生成一個索引。UNIQUE 和 PRIMARY KEY 約束的數目不能導致表上非聚集索引的數目大於 249,聚集索引的數目大於 1。

如果要添加的列的數據類型為 uniqueidentifier,那麼該列可以使用 NEWID() 函數作為默認值,以向表中現有行的新列提供唯一標識符值。

SQL Server 在列定義中並不強制以特定的順序指定 DEFAULT、IDENTITY、ROWGUIDCOL 或列約束。

ALTER TABLE 的 ALTER COLUMN 子句並不會在列上綁定或取消綁定任何規則。必須分別使用 sp_bindrule 或 sp_unbindrule 來綁定或取消綁定規則。

可將規則綁定到用戶定義數據類型。然後 CREATE TABLE 將自動在以該用戶定義數據類型定義的列上綁定該規則。當用 ALTER COLUMN 更改列數據類型時,並不會取消綁定這些規則。原用戶定義數據類型上的規則仍然綁定在該列上。在 ALTER COLUMN 更改了列的數據類型之後,隨後執行的任何從該用戶定義數據類型上取消綁定規則的 sp_unbindrule 都不會導致從更改了數據類型的列上取消綁定該規則。如果 ALTER COLUMN 將列的數據類型更改為綁定了規則的用戶定義數據類型,那麼綁定到新數據類型的規則不會綁定到該列。

許可權
ALTER TABLE 許可權默認授予表的所有者、sysadmin 固定伺服器角色成員、db_owner 和 db_ddladmin 固定資料庫角色成員且不可轉讓。

示例
A. 更改表以添加新列
下例添加一個允許空值的列,而且沒有通過 DEFAULT 定義提供值。各行的新列中的值將為 NULL。

CREATE TABLE doc_exa ( column_a INT)
GO
ALTER TABLE doc_exa ADD column_b VARCHAR(20) NULL
GO
EXEC sp_help doc_exa
GO
DROP TABLE doc_exa
GO

B. 更改表以除去列
下例修改表以刪除一列。

CREATE TABLE doc_exb ( column_a INT, column_b VARCHAR(20) NULL)
GO
ALTER TABLE doc_exb DROP COLUMN column_b
GO
EXEC sp_help doc_exb
GO
DROP TABLE doc_exb
GO

C. 更改表以添加具有約束的列
下例向表中添加具有 UNIQUE 約束的新列。

CREATE TABLE doc_exc ( column_a INT)
GO
ALTER TABLE doc_exc ADD column_b VARCHAR(20) NULL
CONSTRAINT exb_unique UNIQUE
GO
EXEC sp_help doc_exc
GO
DROP TABLE doc_exc
GO

『伍』 請教一棘手問題,sql_ variant 轉換 nvarchar 的問題

select convert(nvarchar(max),EP.value) from sys.extended_properties
轉換一下嘍

『陸』 關於查詢數據表屬性的SQL代碼

CREATE TABLE
創建新表。

語法
CREATE TABLE
[ database_name.[ owner ] .| owner.] table_name
( { < column_definition >
| column_name AS computed_column_expression
| < table_constraint > ::= [ CONSTRAINT constraint_name ] }

| [ { PRIMARY KEY | UNIQUE } [ ,...n ]
)

[ ON { filegroup | DEFAULT } ]
[ TEXTIMAGE_ON { filegroup | DEFAULT } ]

< column_definition > ::= { column_name data_type }
[ COLLATE < collation_name > ]
[ [ DEFAULT constant_expression ]
| [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ]
]
[ ROWGUIDCOL]
[ < column_constraint > ] [ ...n ]

< column_constraint > ::= [ CONSTRAINT constraint_name ]
{ [ NULL | NOT NULL ]
| [ { PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[ WITH FILLFACTOR = fillfactor ]
[ON {filegroup | DEFAULT} ] ]
]
| [ [ FOREIGN KEY ]
REFERENCES ref_table [ ( ref_column ) ]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ]
[ NOT FOR REPLICATION ]
]
| CHECK [ NOT FOR REPLICATION ]
( logical_expression )
}

< table_constraint > ::= [ CONSTRAINT constraint_name ]
{ [ { PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
{ ( column [ ASC | DESC ] [ ,...n ] ) }
[ WITH FILLFACTOR = fillfactor ]
[ ON { filegroup | DEFAULT } ]
]
| FOREIGN KEY
[ ( column [ ,...n ] ) ]
REFERENCES ref_table [ ( ref_column [ ,...n ] ) ]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ]
[ NOT FOR REPLICATION ]
| CHECK [ NOT FOR REPLICATION ]
( search_conditions )
}

參數
database_name

是要在其中創建表的資料庫名稱。database_name 必須是現有資料庫的名稱。如果不指定資料庫,database_name 默認為當前資料庫。當前連接的登錄必須在 database_name 所指定的資料庫中有關聯的現有用戶 ID,而該用戶 ID 必須具有創建表的許可權。

owner

是新表所有者的用戶 ID 名,owner 必須是 database_name 所指定的資料庫中的現有用戶 ID,owner 默認為與 database_name 所指定的資料庫中的當前連接相關聯的用戶 ID。如果 CREATE TABLE 語句由 sysadmin 固定伺服器角色成員或 database_name 所指定的資料庫中的 db_dbowner 或 db_ddladmin 固定資料庫角色成員執行,則 owner 可以指定與當前連接的登錄相關聯的用戶 ID 以外的其它用戶 ID。如果與執行 CREATE TABLE 語句的登錄相關聯的用戶 ID 僅具有創建表的許可權,則 owner 必須指定與當前登錄相關聯的用戶 ID。sysadmin 固定伺服器角色成員或別名為 dbo 用戶的登錄與用戶 ID dbo 相關聯;因此,由這些用戶創建的表的默認所有者為 dbo。不是由上述兩種角色的登錄創建的表所有者默認為與該登錄相關聯的用戶 ID。

table_name

是新表的名稱。表名必須符合標識符規則。資料庫中的 owner.table_name 組合必須唯一。table_name 最多可包含 128 個字元,但本地臨時表的表名(名稱前有一個編號符 #)最多隻能包含 116 個字元。

column_name

是表中的列名。列名必須符合標識符規則,並且在表內唯一。以 timestamp 數據類型創建的列可以省略 column_name。如果不指定 column_name,timestamp 列的名稱默認為 timestamp。

computed_column_expression

是定義計算列值的表達式。計算列是物理上並不存儲在表中的虛擬列。計算列由同一表中的其它列通過表達式計算得到。例如,計算列可以這樣定義:cost AS price * qty。表達式可以是非計算列的列名、常量、函數、變數,也可以是用一個或多個運算符連接的上述元素的任意組合。表達式不能為子查詢。

計算列可用於選擇列表、WHERE 子句、ORDER BY 子句或任何其它可使用常規表達式的位置,但下列情況除外:

計算列不能用作 DEFAULT 或 FOREIGN KEY 約束定義,也不能與 NOT NULL 約束定義一起使用。但是,如果計算列由具有確定性的表達式定義,並且索引列中允許計算結果的數據類型,則可將該列用作索引中的鍵列,或用作 PRIMARY KEY 或 UNIQUE 約束的一部分。
例如,如果表中含有整型列 a 和 b,則可以在計算列 a+b 上創建索引。但不能在計算列 a+DATEPART(dd, GETDATE()) 上創建索引,因為在以後的調用中,其值可能發生改變。

計算列不能作為 INSERT 或 UPDATE 語句的目標。

說明 表中計算列所使用的列值因行而異,因此每行的計算列值可能不同。

計算列的為空性是由 SQL Server 根據使用的表達式自動確定的。即使只有不可為空的列,大多數表達式的結果也認為是可為空的,因為可能的下溢或溢出也將生成 NULL 結果。使用 COLUMNPROPERTY 函數(AllowsNull 屬性)查看錶中任何計算列的為空性。通過指定 ISNULL(check_expression, constant),其中常量為替代任何 NULL 結果的非 NULL 值,可為空的表達式 expr 可以轉換為不可為空的表達式。

ON {filegroup | DEFAULT}

指定存儲表的文件組。如果指定 filegroup,則表將存儲在指定的文件組中。資料庫中必須存在該文件組。如果指定 DEFAULT,或者根本未指定 ON 參數,則表存儲在默認文件組中。

ON {filegroup | DEFAULT} 也可以在 PRIMARY KEY 約束或 UNIQUE 約束中指定。這些約束會創建索引。如果指定 filegroup,則索引將存儲在指定的文件組中。如果指定 DEFAULT,則索引將存儲在默認文件組中。如果約束中沒有指定文件組,則索引將與表存儲在同一文件組中。如果 PRIMARY KEY 約束或 UNIQUE 約束創建聚集索引,則表的數據頁將與索引存儲在同一文件組中。

說明 在 ON {filegroup | DEFAULT} 和 TEXTIMAGE_ON {filegroup | DEFAULT} 的上下文中,DEFAULT 並不是關鍵字。DEFAULT 是默認文件組的標識符並需對其進行定界,如 ON "DEFAULT"、ON [DEFAULT] 和 TEXTIMAGE_ON "DEFAULT" 或 TEXTIMAGE_ON [DEFAULT]。

TEXTIMAGE_ON

是表示 text、ntext 和 image 列存儲在指定文件組中的關鍵字。如果表中沒有 text、ntext 或 image 列,則不能使用 TEXTIMAGE ON。如果沒有指定 TEXTIMAGE_ON,則 text、ntext 和 image 列將與表存儲在同一文件組中。

data_type

指定列的數據類型。可以是系統數據類型或用戶定義數據類型。用戶定義數據類型必須先用 sp_addtype 創建,然後才能在表定義中使用。

在 CREATE TABLE 語句中,用戶定義數據類型的 NULL/NOT NULL 賦值可被替代。但長度標准不能更改;不能在 CREATE TABLE 語句中指定用戶定義數據類型的長度。

DEFAULT

如果在插入過程中未顯式提供值,則指定為列提供的值。DEFAULT 定義可適用於除定義為 timestamp 或帶 IDENTITY 屬性的列以外的任何列。除去表時,將刪除 DEFAULT 定義。只有常量值(如字元串)、系統函數(如 SYSTEM_USER())或 NULL 可用作默認值。為保持與 SQL Server 早期版本的兼容,可以給 DEFAULT 指派約束名。

constant_expression

是用作列的默認值的常量、NULL 或系統函數。

IDENTITY

表示新列是標識列。當向表中添加新行時,Microsoft® SQL Server™ 將為該標識列提供一個唯一的、遞增的值。標識列通常與 PRIMARY KEY 約束一起用作表的唯一行標識符。可以將 IDENTITY 屬性指派給 tinyint、smallint、int、bigint、decimal(p,0) 或 numeric(p,0) 列。對於每個表只能創建一個標識列。不能對標識列使用綁定默認值和 DEFAULT 約束。必須同時指定種子和增量,或者二者都不指定。如果二者都未指定,則取默認值 (1,1)。

seed

是裝入表的第一行所使用的值。

increment

是添加到前一行的標識值的增量值。

NOT FOR REPLICATION

表示當復制登錄(如 sqlrepl)向表中插入數據時,不強制 IDENTITY 屬性。復制的行必須保留發布資料庫中所賦予的鍵值;NOT FOR REPLICATION 子句確保不向復制進程所插入的行賦予新的標識值。其它登錄所插入的行仍然具有以通常的方式創建的新標識值。建議同時使用具有 NOT FOR REPLICATION 的 CHECK 約束,以確保賦予的標識值處於當前資料庫所需的范圍內。

ROWGUIDCOL

表示新列是行的全局唯一標識符列。對於每個表只能指派一個 uniqueidentifier 列作為 ROWGUIDCOL 列。ROWGUIDCOL 屬性只能指派給 uniqueidentifier 列。如果資料庫兼容級別小於或等於 65,則 ROWGUIDCOL 關鍵字無效。有關更多信息,請參見 sp_dbcmptlevel。

ROWGUIDCOL 屬性並不強制列中所存儲值的唯一性。該屬性也不會為插入到表中的新行自動生成值。若要為每列生成唯一值,那麼或者在 INSERT 語句中使用 NEWID 函數,或者將 NEWID 函數指定為該列的默認值。

collation_name

指定列的排序規則。排序規則名稱既可以是 Windows 排序規則名稱,也可以是 SQL 排序規則名稱。collation_name 僅適用於數據類型為 char、varchar、text、nchar、nvarchar 及 ntext 的列。如果沒有指定該參數,那麼如果列的數據類型是用戶定義的,則該列的排序規則就是用戶定義數據類型的排序規則,否則就是資料庫的默認排序規則。

有關 Windows 和 SQL 排序規則名稱的更多信息,請參見 COLLATE。

CONSTRAINT

是可選關鍵字,表示 PRIMARY KEY、NOT NULL、UNIQUE、FOREIGN KEY 或 CHECK 約束定義的開始。約束是特殊屬性,用於強制數據完整性並可以為表及其列創建索引。

constrain_name

是約束的名稱。約束名在資料庫內必須是唯一的。

NULL | NOT NULL

是確定列中是否允許空值的關鍵字。從嚴格意義上講,NULL 不是約束,但可以使用與指定 NOT NULL 同樣的方法指定。

PRIMARY KEY

是通過唯一索引對給定的一列或多列強制實體完整性的約束。對於每個表只能創建一個 PRIMARY KEY 約束。

UNIQUE

是通過唯一索引為給定的一列或多列提供實體完整性的約束。一個表可以有多個 UNIQUE 約束。

CLUSTERED | NONCLUSTERED

是表示為 PRIMARY KEY 或 UNIQUE 約束創建聚集或非聚集索引的關鍵字。PRIMARY KEY 約束默認為 CLUSTERED,UNIQUE 約束默認為 NONCLUSTERED。

在 CREATE TABLE 語句中只能為一個約束指定 CLUSTERED。如果在為 UNIQUE 約束指定 CLUSTERED 的同時又指定了 PRIMARY KEY 約束,則 PRIMARY KEY 將默認為 NONCLUSTERED。

[ WITH FILLFACTOR = fillfactor ]

指定 SQL Server 存儲索引數據時每個索引頁的充滿程度。用戶指定的 fillfactor 取值范圍從 1 到 100。如果沒有指定 fillfactor,則默認為 0。創建索引時,fillfactor 的值越低,不必分配新空間即可由新索引項使用的空間就越多。

FOREIGN KEY...REFERENCES

是為列中的數據提供引用完整性的約束。FOREIGN KEY 約束要求列中的每個值在被引用表中對應的被引用列中都存在。FOREIGN KEY 約束只能引用被引用表中為 PRIMARY KEY 或 UNIQUE 約束的列或被引用表中在 UNIQUE INDEX 內引用的列。

ref_table

是 FOREIGN KEY 約束所引用的表名。

(ref_column[,...n])

是 FOREIGN KEY 約束所引用的表中的一列或多列。

ON DELETE {CASCADE | NO ACTION}

指定當要創建的表中的行具有引用關系,並且從父表中刪除該行所引用的行時,要對該行採取的操作。默認設置為 NO ACTION。

如果指定 CASCADE,則從父表中刪除被引用行時,也將從引用表中刪除引用行。如果指定 NO ACTION,SQL Server 將產生一個錯誤並回滾父表中的行刪除操作。

例如,在 Northwind 資料庫中,Orders 表和 Customers 表之間有引用關系。Orders.CustomerID 外鍵引用 Customers.CustomerID 主鍵。

如果對 Customers 表的某行執行 DELETE 語句,並且為 Orders.CustomerID 指定 ON DELETE CASCADE 操作,則 SQL Server 將在 Orders 表中檢查是否有與被刪除的行相關的一行或多行。如果存在相關行,則 Orders 表中的相關行將隨 Customers 表中的被引用行一同刪除。

反之,如果指定 NO ACTION,若在 Orders 表中至少有一行引用 Customers 表中要刪除的行,則 SQL Server 將產生一個錯誤並回滾 Customers 表中的刪除操作。

ON UPDATE {CASCADE | NO ACTION}

指定當要創建的表中的行具有引用關系,並且在父表中更新該行所引用的行時,要對該行採取的操作。默認設置為 NO ACTION。

如果指定 CASCADE,則在父表中更新被引用行時,也將在引用表中更新引用行。如果指定 NO ACTION,SQL Server 將產生一個錯誤並回滾父表中的行更新操作。

例如,在 Northwind 資料庫中,Orders 表和 Customers 表之間有引用關系:Orders.CustomerID 外鍵引用 Customers.CustomerID 主鍵。

如果對 Customers 表的某行執行 UPDATE 語句,並且為 Orders.CustomerID 指定 ON UPDATE CASCADE 操作,則 SQL Server 將在 Orders 表中檢查是否有與被更新行相關的一行或多行。如果存在相關行,則 Orders 表中的相關行將隨 Customers 表中的被引用行一同更新。

反之,如果指定 NO ACTION,若在 Orders 表中至少有一行引用 Customers 行,則 SQL Server 將產生一個錯誤並回滾對 Customers 行的更新操作。

CHECK

是通過限制可輸入到一列或多列中的可能值強制域完整性的約束。

NOT FOR REPLICATION

是用於防止在復制所使用的分發過程中強制 CHECK 約束的關鍵字。當表是復制發布的訂戶時,請不要直接更新訂閱表,而要更新發布表,然後讓復制進程將數據分發回訂閱表。可以在訂閱表上定義 CHECK 約束,以防用戶修改訂閱表。但是如果不使用 NOT FOR REPLICATION 子句,CHECK 約束同樣會防止復制進程將修改從發布表分發給訂閱表。NOT FOR REPLICATION 子句表示對用戶的修改(而不是對復制進程)強加約束。

NOT FOR REPLICATION CHECK 約束適用於被更新記錄的前像和後像,以防在復制范圍中添加記錄或從復制范圍中刪除記錄。將檢查所有刪除和插入操作;如果操作在復制范圍內,則拒絕執行該操作。

如果對標識符列使用此約束,則當復制用戶更新標識列時,SQL Server 將允許不必重新計算表標識列的種子值。

logical_expression

是返回 TRUE 或 FALSE 的邏輯表達式。

column

是用括弧括起來的一列或多列,在表約束中表示這些列用在約束定義中。

[ASC | DESC]

指定加入到表約束中的一列或多列的排序次序。默認設置為 ASC。

n

是表示前面的項可重復 n 次的佔位符。

注釋
SQL Server 的每個資料庫最多可存儲 20 億個表,每個表可以有 1024 列。表的行數及總大小僅受可用存儲空間的限制。每行最多可以存儲 8,060 位元組。如果創建具有 varchar、nvarchar 或 varbinary 列的表,並且列的位元組總數超過 8,060 位元組,雖然仍可以創建此表,但會出現警告信息。如果試圖插入超過 8,060 位元組的行或對行進行更新以至位元組總數超過 8,060,將出現錯誤信息並且語句執行失敗。

包含 sql_variant 列的 CREATE TABLE 語句可以生成下列警告:

The total row size (xx) for table 'yy' exceeds the maximum number of bytes per row (8060). Rows that exceed the maximum number of bytes will not be added.
出現該警告是因為 sql_variant 的最大長度只能為 8016 位元組。當某個 sql_variant 列包含與最大長度接近的值時,它可以超過行的最大大小限制。

每個表最多可以有 249 個非聚集索引和一個聚集索引。其中包括所有為支持表中所定義的 PRIMARY KEY 和 UNIQUE 約束而生成的索引。

SQL Server 在列定義中並不強制以特定的順序指定 DEFAULT、IDENTITY、ROWGUIDCOL 或列約束。

臨時表
可以創建本地和全局臨時表。本地臨時表僅在當前會話中可見;全局臨時表在所有會話中都可見。

本地臨時表的名稱前面有一個編號符 (#table_name),而全局臨時表的名稱前面有兩個編號符 (##table_name)。

SQL 語句使用 CREATE TABLE 語句中為 table_name 指定的名稱引用臨時表:

CREATE TABLE #MyTempTable (cola INT PRIMARY KEY)
INSERT INTO #MyTempTable VALUES (1)

如果本地臨時表由存儲過程創建或由多個用戶同時執行的應用程序創建,則 SQL Server 必須能夠區分由不同用戶創建的表。為此,SQL Server 在內部為每個本地臨時表的表名追加一個數字後綴。存儲在 tempdb 資料庫的 sysobjects 表中的臨時表,其全名由 CREATE TABLE 語句中指定的表名和系統生成的數字後綴組成。為了允許追加後綴,為本地臨時表指定的表名 table_name 不能超過 116 個字元。

除非使用 DROP TABLE 語句顯式除去臨時表,否則臨時表將在退出其作用域時由系統自動除去:

當存儲過程完成時,將自動除去在存儲過程中創建的本地臨時表。由創建表的存儲過程執行的所有嵌套存儲過程都可以引用此表。但調用創建此表的存儲過程的進程無法引用此表。

所有其它本地臨時表在當前會話結束時自動除去。

全局臨時表在創建此表的會話結束且其它任務停止對其引用時自動除去。任務與表之間的關聯只在單個 Transact-SQL 語句的生存周期內保持。換言之,當創建全局臨時表的會話結束時,最後一條引用此表的 Transact-SQL 語句完成後,將自動除去此表。
在存儲過程或觸發器中創建的本地臨時表與在調用存儲過程或觸發器之前創建的同名臨時表不同。如果查詢引用臨時表,而同時有兩個同名的臨時表,則不定義針對哪個表解析該查詢。嵌套存儲過程同樣可以創建與調用它的存儲過程所創建的臨時表同名的臨時表。嵌套存儲過程中對表名的所有引用都被解釋為是針對該嵌套過程所創建的表,例如:

CREATE PROCEDURE Test2
AS
CREATE TABLE #t(x INT PRIMARY KEY)
INSERT INTO #t VALUES (2)
SELECT Test2Col = x FROM #t
GO
CREATE PROCEDURE Test1
AS
CREATE TABLE #t(x INT PRIMARY KEY)
INSERT INTO #t VALUES (1)
SELECT Test1Col = x FROM #t
EXEC Test2
GO
CREATE TABLE #t(x INT PRIMARY KEY)
INSERT INTO #t VALUES (99)
GO
EXEC Test1
GO

下面是結果集:

(1 row(s) affected)

Test1Col
-----------
1

(1 row(s) affected)

Test2Col
-----------
2

當創建本地或全局臨時表時,CREATE TABLE 語法支持除 FOREIGN KEY 約束以外的其它所有約束定義。如果在臨時表中指定 FOREIGN KEY 約束,該語句將返回警告信息,指出此約束已被忽略,表仍會創建,但不具有 FOREIGN KEY 約束。在 FOREIGN KEY 約束中不能引用臨時表。

考慮使用表變數而不使用臨時表。當需要在臨時表上顯式地創建索引時,或多個存儲過程或函數需要使用表值時,臨時表很有用。通常,表變數提供更有效的查詢處理。有關更多信息,請參見 table。

PRIMARY KEY 約束
一個表只能包含一個 PRIMARY KEY 約束。

由 PRIMARY KEY 約束生成的索引不能使表中的非聚集索引超過 249 個,聚集索引超過 1 個。

如果沒有在 PRIMARY KEY 約束中指定 CLUSTERED 或 NONCLUSTERED,並且沒有為 UNIQUE 約束指定聚集索引,則將對該 PRIMARY KEY 約束使用 CLUSTERED。

在 PRIMARY KEY 約束中定義的所有列都必須定義為 NOT NULL。如果沒有指定為空性,加入 PRIMARY KEY 約束的所有列的為空性都將設置為 NOT NULL。
UNIQUE 約束
如果 UNIQUE 約束中沒有指定 CLUSTERED 或 NONCLUSTERED,則默認為 NONCLUSTERED。

每個 UNIQUE 約束都生成一個索引。由 UNIQUE 約束生成的索引不能使表中的非聚集索引超過 249 個,聚集索引超過 1 個。
FOREIGN KEY 約束
如果在 FOREIGN KEY 約束的列中輸入非 NULL 值,則此值必須在被引用的列中存在,否則將返回違反外鍵約束的錯誤信息。

FOREIGN KEY 約束應用於前面所講的列,除非指定了源列。

FOREIGN KEY 約束僅能引用位於同一伺服器上的同一資料庫中的表。資料庫間的引用完整性必須通過觸發器實現。有關更多信息,請參見 CREATE TRIGGER。

FOREIGN KEY 可以引用同一表中的其它列(自引用)。

列級 FOREIGN KEY 約束的 REFERENCES 子句僅能列出一個引用列,且該列必須與定義約束的列具有相同的數據類型。

表級 FOREIGN KEY 約束的 REFERENCES 子句中引用列的數目必須與約束列列表中的列數相同。每個引用列的數據類型也必須與列表中相應列的數據類型相同。

如果 timestamp 類型的列是外鍵或被引用鍵的一部分,則不能指定 CASCADE。

可以在相互間具有引用關系的表上組合使用 CASCADE 和 NO ACTION。如果 SQL Server 遇到 NO ACTION,將終止執行語句並回滾相關的 CASCADE 操作。當 DELETE 語句導致 CASCADE 和 NO ACTION 組合操作時,在 SQL Server 檢查 NO ACTION 操作之前將執行所有 CASCADE 操作。

一個表最多可包含 253 個 FOREIGN KEY 約束。

對於臨時表不強制 FOREIGN KEY 約束。

每個表在其 FOREIGN KEY 約束中最多可以引用 253 個不同的表。

FOREIGN KEY 約束只能引用被引用表的 PRIMARY KEY 或 UNIQUE 約束中的列或被引用表上 UNIQUE INDEX 中的列。
DEFAULT 定義
每列只能有一個 DEFAULT 定義。

DEFAULT 定義可以包含常量值、函數、SQL-92 niladic 函數或 NULL。下表顯示 niladic 函數及其在執行 INSERT 語句時返回的默認值。 SQL-92 niladic 函數 返回的值
CURRENT_TIMESTAMP 當前日期和時間。
CURRENT_USER 執行插入操作的用戶名。
SESSION_USER 執行插入操作的用戶名。
SYSTEM_USER 執行插入操作的用戶名。
USER 執行插入操作的用戶名。

DEFAULT 定義中的 constant_expression 不能引用表中的其它列,也不能引用其它表、視圖或存儲過程。

不能在數據類型為 timestamp 的列或具有 IDENTITY 屬性的列上創建 DEFAULT 定義。

如果用戶定義數據類型綁定到默認對象,則不能在該用戶定義數據類型的列上創建 DEFAULT 定義。
CHECK 約束
列可以有任意多個 CHECK 約束,並且約束條件中可以包含用 AND 和 OR 組合起來的多個邏輯表達式。列上的多個 CHECK 約束按創建順序進行驗證。

搜索條件必須取值為布爾表達式,並且不能引用其它表。

列級 CHECK 約束只能引用被約束的列,表級 CHECK 約束只能引用同一表中的列。
當執行 INSERT 和 DELETE 語句時,CHECK CONSTRAINTS 和規則具有相同的數據驗證功能。

當列上存在規則和一個或多個 CHECK 約束時,將驗證所有限制。
其它約束信息
為約束創建的索引不能用 DROP INDEX 語句除去;必須用 ALTER TABLE 語句除去約束。可以用 DBCC DBREINDEX 語句重建為約束創建的並由其使用的索引。

約束的名稱必須符合標識符規則,但其名稱的首字元不能為 #。如果沒有提供 constraint_name,則使用系統生成的名稱。約束名將出現在所有與違反約束有關的錯誤信息中。

當 INSERT、UPDATE 或 DELETE 語句違反約束時,將終止執行該語句。但將繼續處理事務(如果此語句為顯式事務的組成部分)。可以通過檢查系統函數 @@ERROR,在事務定義中使用 ROLLBACK TRANSACTION 語句。
如果某個表具有 FOREIGN KEY 或 CHECK CONSTRAINTS 及觸發器,則將在觸發器執行前先檢查約束條件。

若要獲得關於表及其列的報表,請使用 sp_help 或 sp_helpconstraint。若要重命名表,請使用 sp_rename。若要獲得與表相關的視圖和存儲過程的報表,請使用 sp_depends。

通常情況下,為表和索引分配空間時,每次以一個擴展盤區為增量單位。當創建表或索引時,首先從混合擴展盤區為其分配頁,直到它具有足夠的頁填滿一個統一擴展盤區。當有足夠的頁填滿統一擴展盤區後,每當當前分配的擴展盤區填滿時,將再為其分配另一個擴展盤區。若要獲得關於由表分配和佔用的空間量的報表,請執行 sp_spaceused。

表定義中的為空性規則
列的為空性規則決定該列中是否允許以空值 (NULL) 作為其數據。NULL 不是零或空白:它表示沒有輸入任何內容,或提供了一個顯式 NULL 值,通常表示該值未知或不適用。

當用 CREATE TABLE 或 ALTER TABLE 語句創建或更改表時,資料庫或會話設置會影響且可能替代列定義中數據類型的為空性。建議始終將列顯式定義為非計算列的 NULL 或 NOT NULL,如果使用用戶定義數據類型,則建議允許該列使用此數據類型的默認為空性。

在沒有顯式指定時,列的為空性遵循以下規則:

如果該列以用戶定義數據類型定義:
SQL Server 使用在創建數據類型時指定的為空性。使用 sp_help 可獲得該數據類型的默認為空性。
如果該

『柒』 不允許從數據類型 sql_variant 到數據類型 char 的隱性轉換

你看下這篇文章能解決不?

『捌』 SQL server 常用基本數據類型有哪些

一、
整數數據類型
整數數據類型是最常用的數據類型之一。
1、int
(integer)
2、smallint
3、tinyint
4、bigint
二、
浮點數據類型
浮點數據類型用於存儲十進制小數。浮點數值的數據在sql
server
中採用上舍入(round
up
或稱為只入不舍)方式進行存儲。所謂上舍入是指,當(且僅當)要舍入的數是一個非零數時,對其保留數字部分的最低有效位上的數值加1
,並進行必要的進位。若一個數是上舍入數,其絕對值不會減少。如:對3.14159265358979
分別進行2
位和12位舍入,結果為3.15
和3.141592653590。
1、real
數據類型
2、float
3、decimal
4、numeric
三、二進制數據類型
1、binary
2、varbinary
四、
邏輯數據類型
bit:
bit數據類型佔用1
個位元組的存儲空間,其值為0
或1
。如果輸入0
或1
以外的值,將被視為1。
bit
類型不能定義為null
值(所謂null
值是指空值或無意義的值)。
五、字元數據類型
字元數據類型是使用最多的數據類型。它可以用來存儲各種字母、數字元號、特殊符號。一般情況下,使用字元類型數據時須在其前後加上單引號』或雙引號」

1
char
2、nchar
3、varchar
4、nvarchar
六、文本和圖形數據類型
這類數據類型用於存儲大量的字元或二進制數據。
1、text
2
ntext
3
image
七、
日期和時間數據類型
1
datetime
2
smalldatetime
八、貨幣數據類型
1
money
2
smallmoney
smallmoney數據類型類似於money
類型,但其存儲的貨幣值范圍比money數據類型小,其取值從-214,748.3648到+214,748.3647,存儲空間為4
個位元組。
九、
特定數據類型
sql
server
中包含了一些用於數據存儲的特殊數據類型。
1
timestamp
十、用戶自定義數據類型
sysname
sysname
數據類型是系統提供給用戶的,便於用戶自定義數據類型。它被定義為nvarchar(128),即它可存儲128個unicode字元或256個一般字元。其具體使用方法請參見第7章「管理資料庫表」中的「自定義數據類型」章節。
十一、
新數據類型
sql
server
2000
中增加了3
種數據類型:bigint、sql_variant和table。其中bigint數據類型已在整數類型中介紹,下面介紹其餘兩種:
1
sql_variant
sql_variant數據類型可以存儲除文本、圖形數據(text、ntext、image)和timestamp類型數據外的其它任何合法的sql
server數據。此數據類型大大方便了sql
server的開發工作。
2
table
table
數據類型用於存儲對表或視圖處理後的結果集。這一新類型使得變數可以存儲一個表,從而使函數或過程返回查詢結果更加方便快、捷其、使用請參見第13章「游標、視圖和自定義函數」。

『玖』 sql中如何將字元型轉化為整型,如將123.00轉化為123,謝謝

將某種數據類型的表達式顯式轉換為另一種數據類型。CAST 和 CONVERT 提供相似的功能。

語法
使用 CAST:

CAST ( expression AS data_type )

使用 CONVERT:

CONVERT (data_type[(length)], expression [, style])

參數
expression

是任何有效的 Microsoft SQL Server" 表達式。有關更多信息,請參見表達式。

data_type

目標系統所提供的數據類型,包括 bigint 和 sql_variant。不能使用用戶定義的數據類型。有關可用的數據類型的更多信息,請參見數據類型。

length

nchar、nvarchar、char、varchar、binary 或 varbinary 數據類型的可選參數。

style

日期格式樣式,藉以將 datetime 或 smalldatetime 數據轉換為字元數據(nchar、nvarchar、char、varchar、nchar 或 nvarchar 數據類型);或者字元串格式樣式,藉以將 float、real、money 或 smallmoney 數據轉換為字元數據(nchar、nvarchar、char、varchar、nchar 或 nvarchar 數據類型)。

將某種數據類型的表達式顯式轉換為另一種數據類型。有關可用的數據類型的更多信息,請參見數據類型。日期格式樣式,藉以將 datetime 或 smalldatetime 數據轉換為字元數據(nchar、nvarchar、char、varchar、nchar 或 nvarchar 數據類型);或者字元串格式樣式,藉以將 float、real、money 或 smallmoney 數據轉換為字元數據(nchar、nvarchar、char、varchar、nchar 或 nvarchar 數據類型)。當轉換為字元數據時輸出。

隱性轉換對於用戶是不可見的。
SQL Server 自動將數據從一種數據類型轉換成另一種數據類型。例如,如果一個 smallint 變數和一個 int 變數相比較,這個 smallint 變數在比較前即被隱性轉換成 int 變數。

顯式轉換使用 CAST 或 CONVERT 函數。
CAST 和 CONVERT 函數將數值從一個數據類型(局部變數、列或其它表達式)轉換到另一個數據類型。例如,下面的 CAST 函數將數值 $157.27 轉換成字元串 ''$157.27'':CAST ( $157.27 AS VARCHAR(10) )
CAST 函數基於 SQL-92 標准並且優先於 CONVERT。

當從一個 SQL Server 對象的數據類型向另一個轉換時,一些隱性和顯式數據類型轉換是不支持的。例如,nchar 數值根本就不能被轉換成 image 數值。nchar 只能顯式地轉換成 binary,隱性地轉換到 binary 是不支持的。nchar 可以顯式地或者隱性地轉換成 nvarchar。

當處理 sql_variant 數據類型時,SQL Server 支持將具有其它數據類型的對象隱性轉換成 sql_variant 類型。然而,SQL Server 並不支持從 sql_variant 數據隱性地轉換到其它數據類型的對象。

『拾』 MS SQL Server 2000系統數據類型有哪些

MS SQL Server 2000 系統數據類型:
bigint 從 -2^63 到 2^63-1 之間的 integer (整數)數據
binary 定長的binary數據,最長為8,000位元組
bit integer數據,值為1或0
char 定長的非unicode character數據,長度為8,000個字元
cursor 含有對游標的引用的變數或存儲過程OUTPUT參數所採用的MS SQL Server 2000系統數據類型
datetime date和time數據,從1753年1月1日到9999年12月31日
decimal 定點精度和小數的numeric數據,從-10^38-1到10^38-1之間
float 浮點精度數字數據,從-1.79E+308到1.79E+308之間
image 長度可變的binary數據,最長為2^31-1位元組
int 從-2^31到2^31-1之間的integer(整數)數據
money monetary數據值,從-2^63到2^63-1,准確度為貨幣單位的千分之一
nchar 定長的unicode數據,長度為4,000個字元
ntext 長度可變的unicode數據,最長為2^30-1個字元
numeric decimal的同義詞
nvarchar 長度可變的unicode數據,最長為4,000字元
real 浮點精度數字數據,從-3.40E+38到3.40E+38之間
rowversion 資料庫范圍內的唯一號
smalldatetime date和time數據,從1900年1月1日到2079年6月6日
smallint 從-2^15到2^15-1之間的integer數據
smallmoney monetary數據值,-214,748.3648到+214,748.3647之間
sql_variant 可存儲多種SQL Server支持的數據類型的值的MS SQL Server 2000系統數據類型,
但不存儲text, ntext, timestamp和sql_variant類型的值
sysname 系統提供的用戶定義的數據類型,為nvarchar(128)的同義詞
table 一種特殊的數據MS SQL Server 2000系統數據類型,可用於為以後進行處理而存儲結果集
text 長度可變的非unicode數據,最長為2^31-1個字元
timestamp 資料庫范圍內的唯一號
tinyint 從0到255之間的integer數據
uniqueidentifier全局唯一標識符(GUID)
varbinary 長度可變的binary數據,最長為2^31-1位元組
varchar 長度可變的非unicode數據,最長為8,000個字元