昨天一个同事突然问我,说他在
SQL 2000
数据库创建如下表的时候,突然碰到了下面一条警告信息。
SQL
脚本和警告信息如下:
IF
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
)
)
END
ELSE
PRINT
(
'
该表已经存在,请检查数据库
'
);
GO
Warning: The
table
'
Log
'
has been created but its maximum row size (
17159
) exceeds the maximum
number
of
bytes per row (
8060
).
INSERT
or
UPDATE
of
a row
in
this
table
will fail
if
the resulting row length exceeds
8060
bytes.
我以前也没有遇见过这样的警告信息,当时我在
SQL SERVER 2000
下面执行这段脚本,果然有这个警告信息,还有就是为什么Maximun
ROW SIZE
是
17159
?;
当我在
SQL SERVER
2005
下面执行这段脚本却没有警告信息出现,难道
SQL SERVER 2005
与SQL SERVER 2000在
存贮机制上面有什么不同?
在搞清楚这些问题前,我们先来看看其它的一些相关问题,就是
SQL SERVER
2000/2005
中最大数据行都是8060字节(对定长数据而言), 其中SQL SERVER 2000中可以使用的大小为8039字节, 而SQL SERVER 2005可以使用的大小为8053字节。我们可以从下面的脚本中实验一下(SQL SERVER 2005)
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下的情况
IF
OBJECT_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
)
)
END
ELSE
PRINT
(
'
该表已经存在,请检查数据库
'
);
GO

那么最小行8575是怎么算出来的呢,我们先看这张经典数据行结构图(引自Inside SQL SERVER)
其实就是8 + 255 + 50 + 255 + 4000 + 4000 = 8568 + 7 = 8575 其中的7个字节是这样来的
Status Bits A
1
Status Bits B
1
Length of fixed-length ........ 2
number of columns
2
Null bitmap 1 bit for each column (6/8)1
由于表里面没有变长字段,所以其它与变长相关的字节为0 所以为7。 那么接下来我们看看开篇的问题为什么 maximum row size (
17159
)
,
8 + 255* 2 + 50 * 2 + 255 * 2 + 4000 * 2 + 4000 *2
= 17128
1 + 1 + 2 + 2 + 1 + 2 + 2* 5 = 19
那么17128 + 19 = 17147 但是结果是17159,有点不明,查了很多资料也没搞清楚,这个17159 是怎么算出来的,呵呵,希望高手来解答!
分享到:
相关推荐
昨天遇到一个SQL Server的问题:需要写一个储存过程来处理几个表中的数据,最后问题出在我想将一个表的一个列的多行内容拼接成一行,比如表中有两列数据 : 类别 名称 AAA 企业1 AAA 企业2 AAA 企业3 ...
SQLServer 中将一个字段的多个记录值合并到一行显示的实现方法 SQL Server 是一种关系型数据库管理系统,具有强大的数据处理能力和存储能力。在实际应用中,我们经常需要将一个字段的多个记录值合并到一行显示,以...
这通常涉及到安装ODBC驱动,如SQL Server Native Client或Microsoft ODBC Driver for SQL Server,并在ODBC Data Source Administrator中创建一个新的系统DSN。确保在配置时勾选“允许保存密码”,否则你可能无法...
针对这个需求,存在一种名为“SQLServer数据库表中数据导出成SQL语句工具”的实用程序,它能够帮助我们高效地完成这项任务。这个工具通常以MHT(Multi-Part/Related)格式提供,这是一种单一文件Web页面存储格式,...
10.SQL Server 2014定义表主键、外键.mp4 11.SQL Server 2014新增表记录.mp4 12.SQL Server 2014查询表记录.mp4 13.SQL Server 2014修改表记录.mp4 14.SQL Server 2014删除表记录.mp4 15.SQL Server 2014条件...
快捷方便,可查看sqlserver数据库每个表的使用情况,一次下载终身使用,此文件为sql语句格式,免费试用
在SQL Server环境中,有时我们需要将一个数据库中的某个表复制到另一个数据库中,这可能是为了备份、数据迁移或创建测试环境等目的。根据提供的标题、描述和部分代码内容,我们可以整理出一套较为完整的操作流程和...
首先,SQL Server Management Studio (SSMS) 是微软官方提供的一个全面的集成环境,专为管理和开发SQL Server设计。它包含了对SQL Server实例的各种管理工具,例如对象资源管理器,用于浏览和操作数据库、表、存储...
标题“C# 开发SQLSERVER数据库自动建表”表明我们将讨论一个使用C#开发的程序,该程序可以自动化创建SQL Server数据库中的表结构。这个功能对于数据导入、系统初始化或简化数据库管理流程非常有用。 描述中提到,该...
本教程将引导你通过JDBC连接到SQL Server 2005数据库,创建一个最小的例子来展示MyBatis的基本用法。 首先,你需要在项目中添加MyBatis和JDBC驱动的依赖。对于SQL Server 2005,你需要Microsoft的JDBC驱动,如`sql...
首先,标题中的"sqlserver自动生成sql语句工具"指的是可以分析SQL Server数据库结构和数据,自动生成对应的SQL创建语句的软件。这种工具通常能帮助数据库管理员快速获取数据库的定义,便于备份、迁移或在其他环境中...
SQL Server 2019是Microsoft推出的一款关系型数据库管理系统,是SQL Server系列中的一个重要版本。它提供了强大的数据存储、处理和分析能力,广泛应用于企业级数据库应用开发和数据分析。在本安装包中,主要包含的是...
此工具可以将SQL Server表数据导出成Insert语句。SQL Server的导入导出功能可以导出创建数据库各对象的脚本,却不提供导出目标表的现有数据为Insert语句的功能,此工具可以将SQL Server表数据导出成Insert语句。
使用Navicat连接SQL Server 2000时,需要配置正确的驱动程序,SQL Server Native Client 10.0就是其中的一个选择,尽管它是为较新版本设计的,但也可以用于连接较老的SQL Server 2000实例。 在连接过程中,以下是...
1. 右击 Sql Server 2005 中的 jmmaj 数据库,选择“任务”->“导入数据”,然后选择数据源和目标数据,复制一个或多个表或视图数据。 2. 在选择源表和源视图的时候,点击下面的“编辑影射”按钮,然后把“启用标识...
osql 是 SQL Server 提供的一个命令行工具,用于执行 SQL 语句和运行 SQL 脚本文件。osql 工具可以在命令行下执行 SQL 语句,非常适合批量执行 SQL 任务。 如何使用 osql 导入超大 SQL 脚本文件? 在 SQL Server ...
用SQL语句查看SQL Server中的数据库查看所有表大小,所占空间
通过这种方式,KEPServer充当了一个桥梁,使PLC能够实时访问和操作SQL Server数据库中的数据,这对于实现基于数据库的自动化控制策略至关重要。例如,可以使用PLC读取数据库中的状态信息,根据这些信息执行控制逻辑...
sqlserver 实现 行转列 split 分割的函数,具体使用方法写有在文件里。
表结构的创建比较简单,但是表的数据量太大,一时也想不到怎么把sqlserver表数据复制到oracle中,于是请教公司主管,用存储过程实现可以查询出所有数据的insert脚本,在oracle库中创建好表,直接把sqlserver中的...