昨天乙個同事突然問我,說他在 sql 2000 資料庫建立如下表的時候,突然碰到了下面一條警告資訊。 sql 指令碼和警告資訊如下:
object_id(n'
log'
) is
null
begin
create
table
log(
[date
]datetime,[
thread
]nvarchar
(255),[
level
]nvarchar(50
),[logger
]nvarchar
(255),[
message
]nvarchar
(4000),[
exception
]nvarchar
(4000))
endelse
print('
該錶已經存在,請檢查資料庫');
gowarning: the
table
'log
'has been created but its maximum row size (
17159
) exceeds the maximum
number
ofbytes per row (
8060
). insert
orupdate
ofa row
inthis
table
will fail
ifthe resulting row length exceeds
8060
bytes.
create
table
test
(field1
char
(4000
),field2
char
(4000
),field3
char(53
))create
table
test1
(field1
char
(4000
),field2
char
(4000
),field3
char(54
)
最小行大小8061 = 4000 + 4000 + 54 + 7(內部開銷)。下面我們改變下上面指令碼的資料型別,如下所示,看看在sql server 2005下的情況
ifobject_id(n'
log'
) is
null
begin
create
table
log(
[date
]datetime,[
thread
]char
(255),[
level
]char(50
),[logger
]char
(255),[
message
]char
(4000),[
exception
]char
(4000))
endelse
print('
該錶已經存在,請檢查資料庫');
那麼最小行8575是怎麼算出來的呢,我們先看這張經典資料行結構圖(引自inside sql server)
其實就是8 + 255 + 50 + 255 + 4000 + 4000 = 8568 + 7 = 8575 其中的7個位元組是這樣來的
length of fixed-length ........ 2
null bitmap 1 bit for each column (6/8)1
17159) ,
1 + 1 + 2 + 2 + 1 + 2 + 2* 5 = 19
那麼17128 + 19 = 17147 但是結果是17159,有點不明,查了很多資料也沒搞清楚,這個17159 是怎麼算出來的,呵呵,希望高手來解答!
SQL SERVER 表最小行的乙個糾結問題
昨天乙個同事突然問我,說他在 sql 2000 資料庫建立如下表的時候,突然碰到了下面一條警告資訊。sql指令碼和警告資訊如下 ifobject id n log is null begin create table log date datetime,thread nvarchar 255 lev...
在SQLServer2005中實現表的行列轉換
pivot和unpivot關係運算子是sql server 2005提供的新增功能,因此,對公升級到sql server 2005的資料庫使用pivot和unpivot時,資料庫的相容級別必須設定為90 可以使用sp dbcmptlevel儲存過程設定相容級別 在查詢的from子句中使用pivot和...
SQLserver 多行合併為一行
將表和插入模擬資料 create table test id int course varchar 255 insert into test values 1,語文 insert into test values 2,數學 insert into test values 3,英語 insert in...