可视化数据库工具使用注意事项

以下问题可能会影响可视化数据库工具的使用。

保存查询

若要保存在可视化数据库工具查询设计器中设计的查询，必须使用 SQL 查询分析器。

保存在查询设计器中设计的查询

  1. 设计查询。

  2. 在 SQL 窗格中，选择查询语句，右击，然后单击"复制"命令。

  3. 在 SQL Server 企业管理器中，在"工具"菜单上单击"SQL 查询分析器"命令。

  4. 在 SQL 查询分析器的"查询"窗口中右击，然后单击"粘贴"命令。

  5. 在"文件"菜单上单击"另存为"命令保存查询。

说明 尽管查询设计器提供了保存菜单选项，但这些选项是被禁用的。

有关 SQL 查询分析器的更多信息，请参见 SQL 查询分析器概述。

OLE DB 提供程序

将用于 SQL Server 的 Microsoft OLE DB 提供程序在客户端计算机上作为动态链接库 (DLL) 实现，在服务器上作为一套存储过程实现。除非两部分都安装，否则 OLE DB 提供程序将不能正确运行。

  • Sqloledb.dll 是 DLL。

  • 运行 Instcat.sql 将安装存储过程。

如果在每台运行 OLE DB 的 SQL Server 计算机上都安装 Sqloledb.dll 的更新版本，但不安装 Instcat.sql，那么有些 OLE DB 函数将返回不正确的结果。


可视化数据库工具和 SQL Server 数据库

Microsoft® 可视化数据库工具通过生成 SQL Server 特有的 SQL 命令、识别对 SQL Server 唯一的 SQL 语法等方式，透明地使用 SQL Server 数据库。

但在一些情况下将会发现，知道在使用 SQL Server 数据库时，数据库可视化工具有何不同是很有用的。例如，可能会发现了解当自己输入 SQL 命令时，查询设计器如何处理 SQL Server 特有的语法，以及了解有哪些可用的运算符是很有用的。

有关更多信息 | 请参见
对 SQL Server 数据库使用数据库设计器时的问题和注意事项 | 对 SQL Server 数据库使用数据库设计器时的注意事项
对 SQL Server 数据库使用查询设计器时的问题和注意事项 | 对 SQL Server 数据库使用查询设计器时的注意事项


对 SQL Server 数据库使用数据库设计器时的注意事项

下列原则概括了可以使用的 SQL Server 特有功能。

将了解下列相关信息：

  • 区分大小写

  • 全文索引

  • 修改列属性

区分大小写

SQL Server 数据库中的列名和表名能够以大写字母、小写字母或二者的组合形式进行存储。例如，列名可能以"LASTNAME"、"LastName"或"lastname"的形式出现。

数据库是否区分大小写取决于 SQL Server 的安装方式。如果数据库区分大小写，则必须用大小写字符的正确组合输入所有者、表和列的名称。如果使用区分大小写的数据库，按名称引用数据库对象时必须小心，因为两个名为"CUSTOMER"和"Customer"对象可以共存于同一个数据库内。

如果服务器是用不区分大小写的选项安装的，则可以用大小写字符的任意组合输入数据库对象名。

提示 若要确定服务器是否区分大小写，请执行存储过程 sp_server_info，然后检查第 18 行的内容。如果服务器是用不区分大小写的设置安装的，则 sort_order 选项将设置为"不区分大小写"。可以从查询分析器运行存储过程。

全文索引

表可以包含全文索引。数据库设计器和表设计器对操作带全文索引的表提供有限支持。不能使用数据库设计器或表设计器创建全文索引，但是如果修改带全文索引的表，当修改影响全文索引时，数据库设计器或表设计器将发出警告。但在大多数情况下，当保存修改时，数据库设计器或表设计器能够重新建立表的全文索引。

有关更多信息，请参见全文索引支持。

修改列属性

有关设置列属性的过程信息，请参见设置列属性。

以下项目包含 Microsoft SQL Server 数据库特有的信息：

  • 数据类型的默认值

  • 更改分配给列的数据类型

  • 更改列长

  • 更改列精度

  • 更改列小数位数

  • 更改分配给列的空选项

  • 给列分配默认值

  • 重新定义全局默认值

  • 更改列的标识属性

数据类型的默认值

下列默认值自动添加到新列：

数据类型 | 描述 | 默认值
Column Name | 表中的列名。列名必须符合标识符规则且在表中必须唯一。 | 空白
Datatype | 列的数据类型。可以接受系统或用户定义的数据类型。 | 字符 (char)
Length | 列中的值所允许的最多数字个数（对 numeric 数据类型）或字符数。 | 因不同数据类型而异（例如，对于字符为 10，对于 VARBINARY 为 50）
Precision | 最多可以存储的十进制数字的总个数，包括小数点左边和右边的位数。 | 0
Scale | 小数点右边最多可以存储的十进制数字个数。该值必须小于或等于精度值。仅适用于 DECIMAL 和 NUMERIC 数据类型。 | 0
Allow Nulls | 表示列是否可以接受空值。 | Yes（选定）
Default Value | 如果用户没有输入值，则在列中插入该值。将对含有时间戳数据类型的列忽略默认值。如果没有定义默认值且列允许空，则插入 NULL。 | 空白
Identity | 表示列是否基于 Identity Seed 和 Identity Increment 的设置值生成新行的增量值。 | No（未选定）
Identity Seed | 分配给表中首行的值。如果 Identity 的设置值是 No，则 Identity Seed 是空白。如果 Identity 的设置值是 Yes，则 Identity Seed 默认为 1。 | 空白或 1。
Identity Increment | 添加到 Identity Seed 并分配给表中第二行的值。后面每行的值都按该值增加。如果 Identity 的设置值是 No，则 Identity Increment 是空白。如果 Identity 的设置值是 Yes，则 Identity Increment 默认为 1。 | 空白或 1。

更改分配给列的数据类型

列的数据类型决定可存储在列中的数据类型。系统定义数据类型的列表出现在 Data type 列内。

可以为要存储在列中的信息选择适当的数据类型。用户定义数据类型出现在数据类型列表的最后。与用户定义数据类型相对应的系统定义数据类型出现在用户定义数据类型名称最后的括号中。例如："id (varchar)"。

给列分配用户定义数据类型时的特殊考虑

  • 选择数据类型时，将根据数据类型的定义自动设置列的长度、精度和小数位数。不能更改用户定义数据类型的设置值。

  • 仅当用户定义数据类型允许空值时，才能更改"允许空"的设置值。

有关更多信息，请参见创建用户定义的数据类型。

注意 当保存表或关系图时，更改数据类型将重新创建数据库中的表。

小心 如果更改与其它表中的列相关的列的数据类型，则必须也更改相关列的数据类型以保持引用完整性。保存表或关系图时，需要改变数据类型对话框允许自动更改相关列的数据类型。

有关更多信息，请参见数据类型。

更改列长

选择数据类型时，将自动定义列长。如果要增大或减小可接受的列长值，可以使用 binary、char、nchar、nvarchar、varbinary 或 varchar 数据类型重新设置该列的长度属性。对含有其它数据类型的列，长度是从数据类型派生出来的。

更改列精度

对于大多数数据类型，列精度是自动定义的。如果要重新定义含有 decimal 和 numeric 数据类型的列所使用的最多数字个数，可以更改这些列的精度。numeric 列的精度是指选定的数据类型所使用的最多数字个数。非 numeric 列的精度通常是指列的最大长度或列的定义长度。

数据库设计器禁止更改数据类型不是 decimal 或 numeric 的列的精度。

更改列小数位数

选择数据类型时，默认的列小数位数设置为 0。数字列的小数位数是指小数点后的最多数字个数。对含有近似浮点数的列，因为小数点后的数字个数不固定，所以不定义小数位数。

如果要重新定义小数点后的数字个数，可以更改 numeric 或 decimal 列的小数位数。

更改分配给列的空选项

对表中的每一列，都可以指定是允许空值还是不允许空值。空值或 NULL，不同于零 (0) 或空白；NULL 表示没有输入项。它的出现通常意味着未知值或未定义值。例如，在 pubs 示例数据库的 titles 表中，price 列内的空值不表示书没有价格，而是表示不知道价格或未定价。

如果不允许空值，则在表中输入数据的用户必须在列中输入值，否则数据库不接受表行。

注意 不能在主键列上更改该属性。而且，标识列不能有空值。也就是说，不能创建或修改这样的列：其 Identity 的设置值是 Yes，而 Nulls Allowed 的设置值是 Yes。

给列分配默认值

对表中的每列，都可以指定当用户没有在列中输入值时，在列中输入的默认值。如果没有分配默认值且用户未在列中输入值，则：

  • 如果设置允许空值的选项，将在列中插入 NULL。

  • 如果没设置允许空值的选项，列将保持空白，但直到为该列提供值时才能保存行。

在文本字符串中，用单引号 (') 将值括起来；不要使用双引号 (")，因为它们用于引用标识符。例如，键入：98036 或 'Paris, France'。

如果用 Default Value 列中的输入项替换绑定默认值（不带括号），则将解除绑定默认值，并用新值替换默认值。

重新定义全局默认值

全局默认值是为特定的数据库定义的，且由不同表中的列共享。例如，假设有几个表中含有 quantity 列。可以在数据库中定义全局默认值，每当用户没有在任何表中的 quantity 列中输入值时，该值便在该列中插入 1 值。

如果全局默认值绑定到列，可以在特定的表中为该列指定不同的默认值。在这种情况下，在新默认值绑定到列之前，现有的全局默认值将从该列中解除绑定。

重新定义全局默认值

  1. 在数据库关系图中，为要更改的列分配新的默认值。

  2. 出现一个消息框，提示永久解除绑定现有的默认值以便应用新的默认值。选择"确定"按钮。

更改列的标识属性

如果想重新定义在表中添加新行时自动生成并存储于列中的连续值，可以更改列的标识属性。在每个表中只能设置一个列的标识属性。

具有标识属性的列包含系统生成的连续值，该值唯一地标识表中的每行（如雇员标识号）。在含有标识列的表中插入值时，基于上一次使用的标识值（identity seed 属性）和在创建列的过程中指定的增量值（identity increment 属性），Microsoft SQL Server 自动生成下一个标识符。

只能为数据类型是 decimal、int、numeric、smallint、bigint 或 tinyint 且不允许空值的列设置标识属性。

更改列的标识属性

  1. 在数据库关系图中，选择要更改列标识属性的表。

  2. 如果不是在标准视图中，右击表并选择"表视图"命令，然后从快捷菜单中选择"标准"命令。

  3. 如果 Allow Nulls 属性被选定，则清除该复选框。

  4. 选择要自动递增其值的列的 Identity 单元。

    注意 每个表中只能有一列可定义为标识列。

  5. 在 Identity Seed 单元中键入值。该值将分配给表中的第一行。如果用户未在该单元中输入值，则给该单元分配默认值 1。

  6. 在 Identity Increment 单元中键入值。该值是添加到后面每行的 Identity Seed 中的增量值。如果用户未在该单元中输入值，则给该单元分配默认值 1。

例如，假设要为添加到 orders 表中的每一行自动地生成一个 5 位的 Order ID，从 10000 开始，增量值为 10。为此，应选中"标识"属性框，在 Identity Seed 中键入 10000，然后在 Identity Increment 中键入 10。

如果更改表的任何标识属性，则将保留现有的标识值。新设置值只适用于添加到表中的新行。

注意 如果在经常做删除的表中存在标识列，则标识值之间会出现间距。如果想避免这样的间距，请不要使用标识属性。

请参见

约束 | 创建表间的关系 | 创建索引 | 数据库设计器 | 删除 CHECK 约束 | 强制表间的引用完整性 | 设置列属性 | 表关系


对 SQL Server 数据库使用查询设计器时的注意事项

下列原则提供了有关可以使用的 SQL Server 特有功能的信息。

将了解下列相关信息：

  • 查询设计器中的 SQL 语法

  • 标识数据库对象

  • 使用引号

  • 区分大小写

  • 在网格窗格和 SQL 窗格中输入关键字

  • 输入货币值

  • 使用 GUID 数据类型

  • 输入空格

  • 包括优化程序提示注释

  • 从 ANSI 到 OEM 的字符转换

  • 不支持及部分支持的查询类型

  • 使用来自不同数据源的表

查询设计器中的 SQL 语法

查询设计器在 SQL 窗格中生成语句时，只要可能便使用 SQL Server 特有的语法。例如，诸如表和视图等数据库对象有资格使用 SQL Server 所有者名称。

还可以在 SQL 窗格中键入 SQL Server 特有的语法。在有些情况下，当验证查询时，查询设计器将服务器特有的语法转换为 ANSI 标准语法。然而，已更改的查询始终返回相同的结果。

标识数据库对象

当在 SQL 窗格中输入数据库对象（表、视图和列）的名称时，必须为 SQL Server 提供足够的信息来标识想要的对象。数据库对象由唯一的名称标识，该名称最多包含三部分（对于表和视图）或包含四部分（对于列）：

database.owner.table

database.owner.table.column

注意 可以在同一个服务器上联接来自不同数据库的表。在此情况下，数据库对象名可以包含四部分。有关更多详细信息，请参见使用来自不同数据源的表。

通常情况下，只需要提供足够的限定符来唯一地标识要使用的对象。例如，如果使用当前数据库中 titles 表内的 price 列，则只需按列名引用列，如下面的 SQL 语句所示：

SELECT price
FROM titles

但是，如果使用两个表，如 orders 和 products，每个表都有一个名为 price 的列，则必须用适当的表名限定对列的引用，如下例所示：

SELECT products.prod_id, orders.price
FROM orders INNER JOIN products ON
 orders.prod_id = products.prod_id

当通过关系图窗格和网格窗格使用当前数据库中的表时，查询设计器将自动添加所有者和表限定符。如果您不是正使用的表的所有者，则所有者的名称将出现在表名中。例如，如果使用 pubs 数据库，所有者名称 dbo 将出现在表名的前面。如果使用多个表，查询设计器将表名限定符添加到列名。

使用引号

在 SQL 中，文字字符串的标准分隔符是单引号 (')。默认情况下，SQL Server 将双引号 (") 留作数据库对象的分隔符。

SQL Server ODBC 驱动程序支持会话或连接的被引用标识符设置。若此设置为打开状态，则双引号被解释成标识符的分隔符。但是，若关闭此设置，则双引号被解释为文字字符串的分隔符。

为避免二义性，查询设计器始终将被引用的标识符设置为打开状态，以使双引号始终被解释成数据库对象分隔符。如果先前已将被引用的标识符设置为关闭状态，查询设计器将覆盖该设置。

因此，在查询设计器中，始终使用单引号将字符串文字括起来。仅当需要将双引号用作数据库对象分隔符时才使用双引号。

区分大小写

SQL Server 数据库中的文本信息可以用大写字母、小写字母或二者的组合进行存储。例如，姓氏可以"SMITH"、"Smith"或"smith"等形式出现。

数据库是否区分大小写取决于 SQL Server 的安装方式。如果数据库区分大小写，当搜索文本数据时，必须用正确的大小写字母组合构造搜索条件。例如，如果搜索名字"Smith"，则不能使用搜索条件"=smith"或"=SMITH"。

另外，如果服务器被安装成区分大小写，则必须用正确的大小写字母组合提供数据库、所有者、表和列的名称。如果提供的名称大小写不匹配，则 SQL Server 返回错误，报告"无效的对象名"。

当使用关系图窗格和网格窗格创建查询时，查询设计器始终正确地反映出服务器是否区分大小写。但是，如果在 SQL 窗格中输入查询，则必须注意使名称与服务器解释名称的方式相匹配。

如果服务器是用不区分大小写的选项安装的，则可以用大小写字母的任意组合输入数据库对象标识符和搜索条件。

提示 若要确定服务器是否区分大小写，请执行存储过程 sp_server_info，然后检查第 18 行的内容。如果服务器是用不区分大小写的设置安装的，则 sort_order 选项将设置为"不区分大小写"。可以从查询分析器运行存储过程。

在网格窗格和 SQL 窗格中输入关键字

查询设计器支持在网格窗格或 SQL 窗格中使用某些 SQL Server 常量、变量和保留的列名。一般情况下，可通过键入输入这些值，但在网格窗格的下拉列表中将不显示这些值。支持的名称示例包括：

  • IDENTITYCOL 如果在网格窗格或 SQL 窗格中键入该名称，则 SQL Server 将它识别成对自动递增列的引用。

  • 预定义的全局值 在网格窗格和 SQL 窗格中，可以输入如 @@CONNECTIONS 和 @@CURSOR_ROW 这样的值。

  • 常量（niladic 函数） 可以在两个窗格的任何一个中输入常量值，如 CURRENT_TIMESTAMP 和 CURRENT_USER。

  • NULL 如果在网格窗格或 SQL 窗格中输入 NULL，则被视作字面值，而不是常量。

在网格窗格中输入货币值

在网格窗格中，若要指定将数据解释为货币，请在值的前面加上符号 $ 或 $-（对于负值）。不要用逗号或其它分隔符表示千位。使用这种格式的值可提醒查询设计器，将所输入的值视为 money 或 smallmoney 类型列中的数据或与这些类型列中的数据进行比较。值被四舍五入为最接近的百位。

无论使用何种货币，都可以使用 $ 符号。当查询在结果窗格的货币列中显示值时，不包含 $ 前缀。货币数据是否包含表示千位的逗号或其它分隔符，取决于 Windows"区域设置"对话框中的设置。

使用 GUID 数据类型

可以包含对 GUID 数据类型的引用，该数据类型用于存储全局唯一标识符。在更新查询和插入源查询中可以调用 newid( ) 函数，以生成新的 GUID 存储在数据库内。

创建选择查询时，允许对 GUID 类型列执行的唯一操作是基于等于（= 和 <>）的比较。

输入空格

通过输入两个单引号可在更新或插入到查询中指定零长度的字符串，如下所示：

UPDATE  employee
SET     minit = ''
WHERE   emp_id = 'CFS88322F'

在 SQL Server 6.5 或更早的版本中，两个单引号被视为一个空格。例如，可以在下面的表达式中使用引号：'abc' + '' + 'def'。所得到的值是 'abc def'。

在 SQL 窗格中包括优化程序提示注释

如果在 SQL 窗格中直接输入查询，则可以添加优化程序提示以指定使用特定的索引、锁定方法等。但是，当重新格式化 SQL 窗格中的内容时，查询设计器可能不维护这些注释。优化程序注释不以图形方式表示。

有关更多信息，请参见提示。

从 ANSI 到 OEM 的字符转换

当使用 SQL Server 时，包含扩展字符（即在 ASCII 码范围 32（空格）到 126 (~) 之外的字符，包括如"ä"、" ç"、" é"和" ß"等国际字符）的数据需要特殊处理。

结果集中的扩展字符表示法取决于所用的代码页。代码页是计算机用于正确解释和显示数据的字符集。代码页通常对应于不同的平台和语言，并且用在国际化应用程序中。例如，在一个代码页中，ASCII 码为 174 的值可能显示为符号" ®"，但在另一代码页中显示为臂章字符。

一般情况下，代码页分为 ANSI 代码页和 OEM 代码页。ANSI 代码页用在 Windows 中,其中的高位 ASCII 值代表国际化字符。OEM 代码页是为 MS-DOS® 设计的，其中的高位 ASCII 值代表划线字符和标点符号。

将数据输入到 SQL Server 数据库中时，本地（客户端）计算机上的 SQL Server 设置指定是以 ANSI 格式还是以 OEM 格式存储数据。使用"SQL Server 客户端配置"对话框中的"DB Library 选项"选项卡上的"从 ANSI 到 OEM 的自动转换"选项设置此选项。通过从"开始"菜单的"程序"中，单击"Microsoft SQL Server 客户端网络实用工具"，可以使用此对话框。（有关更多信息，请参见使用 DB-Library 中的 ANSI 到OEM 自动转换选项。）

默认情况下，为 SQL Server 客户端选择此选项，这是使数据从高位 ASCII 字符转换为 OEM 字符的选择。例如，如果设置了 OEM 转换选项且在列中输入名字"G黱ther"，然后保存该行，则在将该行存储到数据库中之前，字符"�"将被转换成另一个字符。

在查询设计器中创建的查询结果将受到特定格式的影响，在该格式中，扩展字符数据与"SQL Server 客户端配置"对话框内的 OEM 转换选项设置一同存储。取决于下列可变因素：

  • 可能不能搜索包含高位 ASCII 字符的数据。

  • 查询结果可能出现在结果窗格中，不正确的字符替代了高位 ASCII 字符。

一般情况下，如果数据是以 OEM 格式存储的，则应设置 OEM 转换选项，以便正确地显示数据并且可以搜索它。如果数据是以 ANSI 格式（即未转换成 OEM 格式）存储的但设置了 OEM 转换选项，则不能正确地显示数据及搜索它。

若要确定数据是否是以 OEM 格式存储的，可以使用查询显示所使用的表的内容。如果扩展字符的显示不正确，则 OEM 转换设置可能不正确。关闭查询和工程，更改"SQL Server 客户端配置"对话框中的设置，然后再打开工程和查询。

查询设计器不支持和部分支持的查询类型

在查询设计器中，一些合法的 SQL Server 查询类型不能以图形方式表示。但仍然可以在 SQL 窗格中输入这类查询，它们会正确地执行。但是当执行查询或更改窗格时，查询设计器会显示查询定义差异对话框并报告错误。

不支持以图形方式显示的几种 SQL Server 查询包括：

  • 使用 INTERSECT 的查询。

  • 使用 UNION [ALL] 的查询。

  • 使用 CASE 的查询。

  • 任何数据定义 (DDL) 查询，包括 CREATE TABLE、ALTER TABLE、CREATE PROCEDURE、ALTER PROCEDURE 等等。不支持以图形方式显示 CREATE VIEW 和 ALTER VIEW 查询，但可以使用视图设计器创建和编辑视图。

  • 包含额外 FROM 子句 (FROM table FROM table) 的更新查询和删除查询，额外的 FROM 子句指定要更新或删除的行的列表。

  • 使用 FOR BROWSE 子句的查询。

  • 以 UPDATE 作为搜索条件的查询。

  • 包含 CURRENT OF 的查询。

使用来自不同数据源的表

可创建分布式异类查询，即来自与其建立了数据连接的服务器的外部表和表结构化对象的查询。SQL Server 可以访问任何支持 OLE DB 的数据源。可以按使用基础服务器上的任何可用表的方法，使用来自外部数据源的表和表结构化对象（如果有访问外部数据源的适当权限）。

Microsoft SQL Server 可以用两种方法访问外部数据源。第一种方法是使用链接服务器，该服务器在 SQL Server 数据库内被定义为指向外部数据源。通过使用与本机 SQL Server 数据对象命名规则相似的命名规则，链接服务器使数据源可以访问。第二种方法是通过 OpenRowset( ) 函数使用对外部源的动态引用，这使您得以连接到查询内任何可访问的数据源，即使没有为该数据源定义链接服务器。

来自外部服务器的表和表结构化对象不在表的列表中出现。若要使用它们，请在查询设计器的 SQL 窗格中，使用语法引用链接服务器或包含 OpenRowset( ) 函数。但是，在 SQL 窗格内引用外部数据源时，查询设计器为表示外部数据源，将在关系图窗格中添加表示表或表结构化对象的矩形。

使用链接服务器引用外部数据源

  • 在 SQL 窗格内，使用下列语法引用表：
    linkserver.catalog.schema.object

    其中：

    • linkserver 表示在本地 Microsoft SQL Server 数据源上，给 OLE DB 内的链接服务器提供的名称。

    • catalog 表示包含对象的数据库名。

    • schema 表示对象的所有者。

    • object 表示数据库内的表或视图。

注意 在查询内使用 SQL Server 数据源（名称的 linkserver 部分）之前，必须定义该名称。

下面是 SQL 语句的示例，该示例将本地数据库表中的数据与名为"hrserver"的服务器上的表联接：

SELECT e.id, e.lname, h.hiredate
FROM employee AS e INNER JOIN hrserver.hr.dbo.hiredata AS H
ON e.emp_id = h.emp_id

动态引用外部数据源

  • 在 SQL 窗格内，使用下列语法用 OpenRowset( ) 函数代替表引用：
    OpenRowset(provider,connectString,object)

    其中：

    • provider 表示 OLE DB 提供程序的好记的名称。

    • connectString 表示包含外部数据源连接信息的字符串。如果已在本地服务器和外部数据源之间建立 ODBC 连接，此参数是可选的。connectString 参数可采用下列形式：

      datasource;user id;password，列出特定的连接属性。

      -或-

      provider string,是单个的命名属性字符串，包含用于创建连接的值，与在 .dsn 文件中使用的字符串相似。

    • object 表示数据库对象名。可以使用外部数据源识别的标准命名规则，引用表、视图或其它数据库对象。

    提示 如果将表别名指派给 OpenRowset( ) 所引用的数据源，则该数据源更易于使用。

下例说明使用 OpenRowset( ) 动态访问外部数据源中的数据时的变化形式。第一个示例显示使用一组连接字符串属性访问 Microsoft® Jet (Access) 数据库。第二个示例显示如何传递连接字符串。

SELECT n.*
FROM OpenRowset('Microsoft.jet.OLEDB.3.51',
    'c:\nwind.mdb';'admin';'pwd', authors)
AS n

SELECT a.*
FROM OpenRowset('MSDASQL', 'Driver=SQL Server;Server=Test;
    UID=user1;PWD=pwd', pubs.dbo.authors)
AS a

请参见

创建生成表查询 | 创建查询 | 设计查询 | 指定参数标记字符 | 支持的查询类型 | 在查询中使用表达式


数据库开发和可视化数据库工具

在设计数据库时需要创建数据库对象，如表、列、键、索引、关系、约束和视图等。为帮助创建这些对象，可视化数据库工具提供了三种机制：数据库设计器、表设计器和视图设计器。

  • 数据库设计器 使您得以创建表、列、键、索引、关系和约束的可视化工具。在数据库设计器内，可通过能以图形方式显示数据库结构的数据库关系图与数据库对象进行交互。利用数据库设计器，可以创建和修改关系图上的可视对象（表、列、关系和键）和一些不可视对象（索引和约束）。

  • 表设计器 使您得以创建单个表的可视化工具。尽管可以使用数据库设计器创建表，但由于表设计器分配给表的屏幕比例更大，并可在设计时显示更详细的表信息，所以使用表设计器完成设计表的任务有时更方便。

  • 视图设计器 帮助创建视图的可视化工具。由于创建视图的 SQL 语法与创建查询的语法几乎相同，视图设计器与查询设计器非常相似。

请参见

数据库设计器 | 表设计器 | 查询设计器和视图设计器的布局


数据库设计器

数据库设计器是一种可视化工具，允许您对所连接的数据库进行设计和可视化处理。在设计数据库时，可以使用数据库设计器创建、编辑或删除表、列、键、索引、关系和约束。为使数据库可视化，可创建一个或更多的关系图，以显示数据库中的部分或全部表、列、键和关系。

对于任何数据库都可以创建任意多个数据库关系图；每个数据库表可出现在任意多个关系图上。因此，可以创建不同的关系图使数据库的不同部分可视化，或强调设计的不同方面。例如，可以创建显示所有表和列的大关系图，也可创建显示所有表但不显示列的小关系图。

创建的每个数据库关系图都存储在关联的数据库中。

数据库关系图中的表和列

在数据库关系图内，每个表的外观都可能有三个明显的特征：标题栏、行选择器和一组属性列。

标题栏 标题栏用于显示表的名称。如果另一个用户拥有表，则该用户的名称将出现在表名最后的括号中。有关表所有者的信息，请参见数据库对象所属关系。

如果修改了一个表但尚未保存，在表名的最后会出现一个星号 (*) 以表示未保存更改。有关保存已修改的表和关系图的信息，请参见使用数据库。

或

行选择器 可以单击行选择器 [image] 以在表中选择数据库列。行选择器显示键符号

（如果该列在表的主键中）。有关主键的信息，请参见定义主键。

属性列 这组属性列仅在表的某些视图中才可以看见。可以在四个不同视图的任何一个中查看表，这有助于对关系图的大小和布局进行管理。

有关表视图的更多信息，请参见在数据库关系图中更改表视图。

数据库关系图中的关系

在数据库关系图内，每个关系的外观可能有三个明显的特征：终结点、线型和相关表。

终结点 线的终结点表示关系是一对一还是一对多。如果关系在一个终结点有一个键，在另一个终结点有一个"8"字形，则是一对多关系。如果关系在每个终结点都有一个键，则是一对一关系。

线型 线本身（不是其终结点）表示在将新数据添加到外键表时数据库管理系统 (DBMS) 是否强制关系的引用完整性。如果为实线，则在外键表中添加行或修改行时 DBMS 将强制关系的引用完整性。如果为虚线，则在外键表中添加行或修改行时 DBMS 不强制关系的引用完整性。

相关表 关系线表示一个表和另一个表之间存在外键关系。对于一对多关系，外键表是线的"8"字形符号这一侧的表。如果线的两个终结点附加在同一表上，则关系为自反关系。有关更多信息，请参见绘制自反关系。

请参见

数据库设计器属性页 | 数据库设计器对话框


表设计器

表设计器是一种可视化工具，允许您对所连接的数据库中的单个表进行设计和可视化处理。

表设计器分两部分。上半部分显示网格，网格的每一行描述一个数据库列。网格显示每个数据库列的基本特征：列名、数据类型、长度和允许空值设置。

表设计器的下半部分为在上半部分中突出显示的任何数据列显示附加特性。

从表设计器中还能访问属性页，通过属性页可以创建和修改表的关系、约束、索引和键。

请参见

表设计器属性页 | 数据库设计器对话框


数据库关系图窗口和表设计窗口间的交互

当连接到数据库并开始设计或修改数据库关系图或表时，可视化数据库工具将在内存中保留工作。也就是说，直到在内存中显式保存工作后，这些工具才将工作传输到数据库。不论打开的数据库关系图或所设计表的数量有多少，可视化数据库工具都保留数据库结构的单个内存中模型。有几个衍生结果：

  • 可以试验不同的对象定义

    因为更改并不立即保存到数据库，所以可以试验提出的修改将如何影响数据库。在完成修改后，可以将更改保存到数据库、保存到脚本文件或丢弃更改。

  • 修改可以在许多关系图或表设计窗口中出现

    在修改数据库对象时，每个包含该对象的打开的关系图都将反映所做的修改。例如，如果将列添加到表中，新列将出现在每个包含该表的打开的关系图上。如果修改某个对象并在稍后将该对象添加到另一个关系图中，则即使还没有将修改保存到数据库中，添加的对象仍反映出修改。

  • 修改只能存在于内存中

    数据库结构的内存中模型一直存在，直到关闭该数据库的所有数据库关系图和表设计窗口为止。因此，对于在任何打开的数据库关系图上都无法看见的修改，内存中模型有可能会保留。即使从唯一打开的关系图中删除已修改的对象，该修改仍保留在内存中。如果之后将删除的同一对象添加到任何关系图中，将会看见修改。

注意 查询设计器窗口和视图设计器窗口使用不同的策略在内存中保留工作。有关更多信息，请参见查询设计器和视图设计器窗口间的交互。


数据库对象

当使用可视化数据库工具设计数据库时，可以创建以下数据库对象。

  • 表

  • 列

  • 键

  • 表关系

  • 索引

  • 约束

  • 触发器

  • 存储过程

请参见

查询和视图


数据库对象名的唯一性

在数据库内的数据库目录中，每个在数据库内创建的对象（约束、默认值、日志、规则、存储过程等）都占一行。因为 DBMS 强制某些规则以确保对象具有唯一的名称，所以在命名对象时必须小心。

当在数据库关系图或表关系图中命名数据库对象时，如果选择的名称已由另一个对象使用，用户将收到警告。命名对象时有三种可能的结果：

  • 选择由可视化数据库工具检测到的重复名称。
    在这种情况下，只要尝试命名对象就收到错误信息。

  • 选择由 DBMS 检测到的重复名称。
    在这种情况下，可视化数据库工具最初接受该名称，但在尝试将对象保存到数据库时 DBMS 将拒绝该名称；您会收到错误信息。

  • 选择唯一的名称。
    这种情况下不会收到错误信息。

请参见

数据库对象所属关系


表

数据库中包含一个或更多的表。表是数据的集合，按行和列排列。例如，用户可能有一个名为 authors 的作者信息表。每列都包含某类信息，如作者的姓。每行都包含有关某个特定作者的所有信息：名、姓、地址等等。

在数据库中，可以拥有许多表，每个表都有一个特定的主题。例如，pubs 数据库可能包含有关作者、标题等的表。对每个主题使用一个单独的表可以消除重复数据，使数据存储更有效并减少数据输入项错误。

表是数据库关系图的基本建立模块。在数据库关系图中，每个表都是按矩阵形式布置的，这样就可以在数据库表中看到为每个列定义的所有属性。

数据库关系图中的表

数据库关系图中的每个表都有三个明显的特征：标题栏、行选择器和一组属性列。

  • 标题栏 标题栏用于显示表的名称。如果另一个用户拥有表，则该用户的名称将出现在表名最后的括号中。

有关表所有者的信息，请参见多用户环境。

如果修改了一个表但尚未保存，在表名的最后会出现一个星号 (*) 以表示未保存更改。有关保存已修改的表和关系图的信息，请参见使用数据库。

或

  • 行选择器 可以单击行选择器 [image] 以在表中选择数据库列。如果该列是表中的主键，则行选择器显示键符号 [image] 。有关主键的信息，请参见定义主键。

  • 属性列 这组属性列仅在表的某些视图中才可以看见。可以在五个不同视图的任何一个中查看表，这有助于对关系图的大小和布局进行管理。

有关表视图的更多信息，请参见更改表视图。

在开始为表定义列之前，应确定该表包含什么类型的数据，以及该表如何与用户数据库中的其它表相关。

设计表

为确定新表的结构，需要确定：

  • 该表将包含什么类型的数据。

  • 在表中需要什么列，以及每一列的数据类型（如果需要的话，还有长度）。

  • 哪些列应该接受空值。有关数据类型、允许空值以及其它列属性的信息，请参见使用列。

  • 是否使用约束，如果要用的话，在何处使用。有关更多信息，请参见约束。

  • 需要何种类型的索引，在何处需要以及哪些列应为主键和外键。有关更多信息，请参见索引。

确定了表的结构以后，就可以创建该表，并在数据库关系图中或者使用表设计器对各列进行定义。也可以在关系图中改变表的外观，以便在需要信息时可以看见这些信息。当保存表或关系图时，表就创建在了数据库中。

如果确切知道想在表中需要什么，那么一开始就定义所需的每件东西（包括表的数据限制和附加属性）通常最有效。不过，在许多情况下，最好先创建一个基表并将其保存，这样就在数据库中创建了该表。然后可以将一些测试数据添加到表中，并在数据库关系图中对该表进行试验以精细调整它的设计。

数据库设计器允许在关系图中对表进行处理以试验不同的设计方案。通过试验，可以确定经常输入和查询的数据类型，然后相应地对表进行重新设计。

当在数据库关系图或表设计器中更改表的设计时，要尽可能保留存储在原表中的任何数据。当对自己的基本设计感到满意时，可以将所需的约束、索引以及任何附加列添加到表中。有关更多信息，请参见开发数据库结构。

若要 | 请参见
将新表、现有表或相关表添加到数据库关系图中 | 添加表
将表从一个数据库关系图复制到另一个关系图中 | 在数据库关系图间复制表
创建一个新表来包含部分与关系图中现有的表相同的列 | 复制表
从数据库关系图和数据库中删除表 | 从数据库关系图和数据库中删除表
更改数据库关系图和数据库中的表的名称 | 重命名表
更改为关系图中的表显示的信息量 | 在数据库关系图中更改表视图
向表中添加列，或者从其中删除列，以及修改列属性设置 | 使用列


列

在表中，数据按列的形式排列。每一列存储一种数据元素，例如名字、一行地址、价格或者类似的任何一种离散的信息单元。

在表中创建列时，给列的命名通常用来标识该列的内容，例如命名为 FirstName 或 Address1。在大多数数据库中，还必须指定一些附加属性，例如列中最长条目的长度，以及列中包含的数据类型，如字符、整数、浮点数、日期或时间等等。此外，列属性还可能包括该列是否是表的主键，用户是否必须在列中输入值，列的默认值是多少等等。

请参见

列属性


列属性

表中的每个列都有一套属性。每个属性都定义列的一个特性，如列的名称、数据类型或长度。一个列的整组属性构成该列在数据库表中的定义。

可以在数据库关系图的数据库表中直接设置列属性。在可将表保存到数据库之前，有三个列属性是必需的：列名、数据类型和长度。可以通过编辑列的任何属性重新定义列。例如可以重命名一个列，改变列的长度，为列指定默认值等等。

当在标准视图中查看表时，列属性以网格形式显示。在这个网格中，可以选择要查看的属性。可以隐藏很少定义的属性和显示经常定义的属性。也可以调整网格中列的大小以便很容易地阅读列的属性。

有关属性列的显示、隐藏和大小调整的更多信息，请参见：

  • 设置列属性

  • 调整属性列的大小

  • 更改所显示的属性

  • 重命名列


键

有两种类型的键。主键是表中的一组列，这些列对表中的每一行都有唯一值。主键可以有效地约束添加到表中的值，因此也称为主键约束：对于主键列与某个其它行的相应值全部相等的表，主键可防止将行添加到这样的表中。

外键是一个表中的一组列和某个其它表中的一组主键列之间的对应。当讨论外键时，有时称这两个参与表为外键表和主表。外键可约束表中的行，因此也称为外键约束。外键确保添加到外键表中的任何行在主表中有相应的行。也就是说，外键要求添加到外键表中的任何行在外键列中都具有值，并且这些值分别对应于主表中某个行的各主键列中的值。

有关主键的更多信息，请参见主键约束。有关外键的更多信息，请参见FOREIGN KEY 约束。有关使用键的详细信息，请参见使用键。


表关系

可以在数据库关系图中的表间创建关系以显示某个表中的列如何链接到另一表中的列。

在关系数据库中，关系能防止冗余的数据。例如，如果正在设计一个数据库来跟踪有关书的信息，而每本书的信息（如书名、出版日期和出版商）都保存在一个名为 titles 的表中。同时还有一些想保存的有关出版商的信息，例如出版商的电话号码、地址和邮政编码。如果将所有这些信息都保存在 titles 表中，则对于某个出版商出版的每本书，出版商的电话号码将是重复的。

一个更好的解决方案是，单独在一个名为 publishers 的表中只保存一次出版商信息。然后在 titles 表中设置指针，以引用 publishers 表中的项。

若要确保数据同步，可以在 titles 表和 publishers 表之间强制引用完整性。引用完整性关系能确保某个表中的信息与另一个表中的信息相匹配。例如，titles 表中的每个书名必须和 publishers 表的特定出版商相关联。不能在数据库中添加数据库中不存在的出版商的书名。

为更好地理解表关系，请参见：

  • 表关系类型

  • 引用完整性概述

表关系类型

关系是通过匹配键列中的数据而工作的，而键列通常是两个表中具有相同名称的列。在大多数情况下，关系将一个表中为每个行提供唯一标识符的主键与另一个表中外键内的项相匹配。例如，通过在 titles 表的 title_id 列（主键）和 sales 表的 title_id 列（外键）之间创建一个关系，可以使销售额与特定的销售书名相关联。

表与表之间存在三种类型的关系。所创建的关系类型取决于相关联的列是如何定义的。

  • 一对多关系

  • 多对多关系

  • 一对一关系

一对多关系

一对多关系是最常见的关系类型。在这种关系类型中，表 A 中的行可以在表 B 中有许多匹配行，但是表 B 中的行只能在表 A 中有一个匹配行。例如，publishers 表和 titles 表是一对多的关系：每一个出版商可出版许多书，但每一本书只能有一个出版商。

如果在相关列中只有一列是主键或具有唯一约束，则创建的是一对多关系。

一对多关系中的主键方由一个键 [image] 符号表示。关系中的外键方由一个无穷大 [image] 符号表示。

多对多关系

在多对多关系中，表 A 中的一行可与表 B 中的多行相匹配，反之亦然。通过定义称为连接表的第三方表创建这样的关系，该连接表的主键包括表 A 和表 B 中的外键。例如，authors 表和 titles 表是多对多关系，该关系通过从这些表中的每个表与 titleauthors 表的一对多关系定义。titleauthors 表的主键由 au_id 列（authors 表的主键）和 title_id 列（titles 表的主键）组成。

一对一关系

在一对一关系中，表 A 中的一行最多只能与表 B 中的一行相匹配，反之亦然。如果两个相关列都是主键或具有唯一约束，则创建的是一对一关系。

这种关系不常见，因为这种方式的大部分相关信息都在一个表中。使用一对一关系可以是为了：

  • 分割一个含有许多列的表。

  • 出于安全考虑而隔离表的某一部分。

  • 存储可以很容易删除的临时数据，只需删除表即可删除这些数据。

  • 存储只应用于主表子集的信息。

一对一关系的主键方由键 [image] 符号表示。外键方也由键 [image] 符号表示。

引用完整性概述

引用完整性是一种规则系统，这些规则可确保相关表中各行间关系的有效性，并确保不会意外删除或更改相关的数据。

在强制引用完整性时必须遵循以下规则：

  • 如果在相关表的主键中不存在某个值，则不能在相关表的外键列中输入该值。但是，可以在外键列中输入空值。例如，在 employee 表中没有包括某职员，则不能指明分配给该职员的工作，但是可在 employee 表的 job_id 列输入空值来指明没有给该职员分配工作。

  • 如果在相关表中存在与某行匹配的行，则不能从主表中删除该行。例如，如果在 employee 表中给多个职员分配了由 jobs 表中某行所代表的工作时，则不能删除该行。

  • 当主表的某行有相关行时，则不能更改主键值。例如，如果将 jobs 表中的一项工作分配给某职员，则不能从 employee 表中删除该职员。

当满足下述所有条件时，可以设置引用完整性：

  • 主表中相匹配的列是主键或具有唯一约束 。

  • 相关列具有相同的数据类型和长度。

  • 两个表属于同一个数据库。

数据库关系图中的已强制关系和未强制关系

在数据库关系图中创建关系线将在相关表上创建外键约束，从而自动强制引用完整性。在数据库关系图中，已强制关系用实线表示。例如：

在关系图中，未强制关系用虚线表示，这种关系的外键约束被禁用。例如：

根据数据库的功能，对于某些情况（例如在 INSERT 和 UPDATE 事务处理过程中）可设置选项以禁用外键约束。

若要 | 请参见
在数据库关系图中创建数据库表间的关系 | 创建表间的关系
确保在外键列中输入的值与相关主键列中的现有值相匹配 | 强制表间的引用完整性
将表中的一列与同一表中的另一列链接起来 | 绘制单个表自反关系
创建多对多关系 | 将多对多关系映射到数据库关系图
更改关系的名称 | 重命名关系
删除两个表间的关系 | 删除关系
禁用外键约束 | 对 INSERT 和 UPDATE 语句禁用外键约束和对复制禁用外键约束


索引

可以利用索引快速访问数据库表中的特定信息。索引是对数据库表中一个或多个列（例如，employee 表的姓氏 (lname) 列）的值进行排序的结构。如果想按特定职员的姓来查找他或她，则与在表中搜索所有的行相比，索引有助于更快地获取信息。

索引提供指针以指向存储在表中指定列的数据值，然后根据指定的排序次序排列这些指针。数据库使用索引的方式与使用书的目录很相似：通过搜索索引找到特定的值，然后跟随指针到达包含该值的行。

在数据库关系图中，可以为选定的表创建、编辑或删除索引/键属性页中的每个索引类型。当保存附加在此索引上的表或包含此表的数据库关系图时，索引同时被保存。有关详细信息，请参见创建索引。

通常情况下，只有当经常查询索引列中的数据时，才需要在表上创建索引。索引将占用磁盘空间，并且降低添加、删除和更新行的速度。不过在多数情况下，索引所带来的数据检索速度的优势大大超过它的不足之处。然而，如果应用程序非常频繁地更新数据，或磁盘空间有限，那么最好限制索引的数量。

在创建索引前，必须确定要使用的列和要创建的索引类型。有关更多信息，请参见：

  • 索引列

  • 索引类型

索引列

可基于数据库表中的单列或多列创建索引。当某些行中的某一列具有相同的值时，多列索引能区分开这些行。

如果经常在同时搜索两列或多列或按两列或多列排序时，索引也很有帮助。例如，如果经常在同一查询中为姓和名两列设置准则，那么在这两列上创建多列索引将很有意义。

确定索引的有效性：

  • 检查查询中的 WHERE 和 JOIN 子句。在任一子句中包括的每一列都是索引可以选择的对象。

  • 试验新的索引，检查它对运行查询性能的影响。

  • 考虑表中已创建的索引数量。最好不要在一个表中创建大量的索引。

  • 检查表中已创建的索引定义。最好避免包含共享列的重叠索引。

  • 检查列中唯一数据值的数量，并与表中的行数进行比较。比较的结果就是该列的可选择性，这有助于确定该列是否适合建立索引，如果适合，确定索引的类型是什么。

索引类型

根据数据库的功能，可在数据库设计器中创建三种类型的索引 — 唯一索引、主键索引和聚集索引。

提示 尽管唯一索引有助于找到信息，但为了获得最佳性能，建议使用主键约束或唯一约束。有关这些约束的更多信息，请参见主键约束和唯一约束。

唯一索引

唯一索引不允许两行具有相同的索引值。

如果现有数据中存在重复的键值，则大多数数据库都不允许将新创建的唯一索引与表一起保存。当新数据将使表中的键值重复时，数据库也拒绝接受此数据。例如，如果在 employee 表中的职员姓氏 (lname) 列上创建了唯一索引，则所有职员不能同姓。

有关唯一索引的更多信息，请参见创建唯一索引。

主键索引

数据库表通常有一列或列组合，其值用来唯一标识表中的每一行。该列称为表的主键。

在数据库关系图中为表定义一个主键将自动创建主键索引，主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的。当在查询中使用主键索引时，它还允许快速访问数据。有关主键的更多信息，请参见定义主键。

聚集索引

在聚集索引中，表中各行的物理顺序与键值的逻辑（索引）顺序相同。表只能包含一个聚集索引。

如果不是聚集索引，表中各行的物理顺序与键值的逻辑顺序不匹配。聚集索引比非聚集索引有更快的数据访问速度。

有关使用聚集索引的更多信息，请参见创建聚集索引。

请参见

约束


约束

约束是数据库服务器强制用户必须遵从的业务逻辑。它们限制用户可能输入指定列的值，从而强制引用完整性。在数据库设计器中创建约束时，约束遵从用于创建和更改表的 ANSI 标准。

数据库设计器接受五种类型的约束：

  • CHECK 约束

  • 默认约束

  • 唯一约束

  • 主键约束

  • FOREIGN KEY 约束


CHECK 约束

CHECK 约束指定可由表中一列或多列接受的数据值或格式。例如，可以要求 authors 表的 zip 列只允许输入五位数的数字项。

可以为一个表定义许多 CHECK 约束。可以使用"表"属性页创建、修改或删除每个 CHECK 约束。

若要 | 请参见
将 CHECK 约束附加到表上以指定在一列或多列中可接受的数据值 | 将新的 CHECK 约束附加到表或列
创建约束表达式以检查数据是否符合条件 | 定义 CHECK 约束表达式
更改约束表达式或选项以启用或禁用对特定条件的约束 | 修改 CHECK 约束
将约束只应用于新数据或也应用于现有数据 | 创建 CHECK 约束时检查现有数据
在将数据添加到表中、在表中更新数据或从表中删除数据时禁用 CHECK 约束 | 对 INSERT 和 UPDATE 语句禁用 CHECK 约束
当在另一个数据库中复制表时禁用 CHECK 约束 | 对复制禁用 CHECK 约束
删除对列中数据值的限制 | 删除 CHECK 约束


默认约束

默认约束使您能够定义一个值，每当用户没有在某一列中输入值时，则将所定义的值提供给这一列。例如，在一个表的 payterms 列中，可以让数据库服务器在用户没有输入时填上"???"或"fill in later"。

在数据库关系图中，可以将默认约束定义为表的一个列属性。通过在标准视图下的表内指定默认值，为列定义这种类型的约束。一定要指定带有正确分隔符的约束。例如，字符串必须用单引号括起来。

有关定义默认约束的更多信息，请参见设置列属性。

请参见

约束


唯一约束

对于一个表中非主键列的指定列，唯一约束确保不会输入重复的值。例如，在 employee 表中 emp_id 列是主键，可以定义一个唯一约束来要求表中社会安全号码 (ssn) 列的项是唯一的。

在数据库关系图中，可以使用"索引/键"属性页创建、修改或删除唯一约束。

若要 | 请参见
确保不在特定的列中输入重复值 | 创建唯一约束
更改附加了约束的列，更改约束名或为约束设置附加属性 | 修改唯一约束
删除对列中输入值的唯一性要求 | 删除唯一约束


主键约束

主键约束确保在特定的列中不会输入重复的值，并且在这些列中也不允许输入 NULL 值。可以使用主键约束强制唯一性和引用完整性。例如，au_id 列唯一地标识 authors 表中存储的每个作者。

可以在数据库关系图中直接创建主键约束。

若要 | 请参见
对在指定列中输入的值强制唯一性 | 定义主键
更改列的顺序、索引名、聚集选项或填充因子 | 修改主键
将列属性从主键列复制到外键列以使两列相关 | 将列属性复制到外键列
删除对列中输入值的唯一性要求 | 删除主键约束


FOREIGN KEY 约束

外键约束与主键约束或唯一约束一起在指定表中强制引用完整性。例如，可以在 publishers 表的 title_id 列中放置一个外键约束，以保证这一列中的输入值与 titles 表 title_id 列中的现有值匹配。

在数据库关系图中，当创建从一个附加了主键约束或唯一约束的表到另一个表之间的关系时，外键约束将自动添加到指定的列上。有关创建关系的更多信息，请参见创建表间的关系。

若要 | 请参见
查看在关系中作为外键方的列 | 查看外键特性
更改与主表中的列相关的列 | 修改外键
创建关系时检查现有数据 | 创建关系时检查现有数据
在 INSERT 和 UPDATE 事务期间禁用外键约束 | 对 INSERT 和 UPDATE 语句禁用外键约束
在复制表期间禁用外键约束 | 对复制禁用外键约束
删除对在主键列和另一表中的相关列之间强制引用完整性的要求 | 删除外键约束


触发器

触发器是一种特殊类型的存储过程，当使用下面的一种或多种数据修改操作在指定表中对数据进行修改时，触发器会生效：UPDATE、INSERT 或 DELETE。触发器可以查询其它表，而且可以包含复杂的 SQL 语句。它们主要用于强制复杂的业务规则或要求。例如，可以控制是否允许基于顾客的当前帐户状态插入定单。

触发器还有助于强制引用完整性，以便在添加、更新或删除表中的行时保留表之间已定义的关系。然而，强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图，则可以在表之间创建关系以自动创建外键约束。有关详细信息，请参见表关系。

使用触发器的优点

触发器的优点如下：

  • 触发器是自动的：它们在对表的数据作了任何修改（比如手工输入或者应用程序采取的操作）之后立即被激活。

  • 触发器可以通过数据库中的相关表进行层叠更改。例如，可以在 titles 表的 title_id 列上写入一个删除触发器，以使其它表中的各匹配行采取删除操作。该触发器用 title_id 列作为唯一键，在 titleauthor、sales 及 roysched 表中对各匹配行进行定位。

  • 触发器可以强制限制，这些限制比用 CHECK 约束所定义的更复杂。与 CHECK 约束不同的是，触发器可以引用其它表中的列。例如，触发器可以回滚试图对价格低于 10 美元的书（存储在 titles 表中）应用折扣（存储在 discounts 表中）的更新。

有关使用触发器的详细信息，请参见下列主题：

若要 | 请参见
创建新的触发器 | 创建触发器
查看现有触发器 | 查看触发器
更改触发器的名称 | 修改和重命名触发器
删除存储的触发器 | 删除触发器


存储过程

存储过程可以使得对数据库的管理、以及显示关于数据库及其用户信息的工作容易得多。存储过程是 SQL 语句和可选控制流语句的预编译集合，以一个名称存储并作为一个单元处理。存储过程存储在数据库内，可由应用程序通过一个调用执行，而且允许用户声明变量、有条件执行以及其它强大的编程功能。

存储过程可包含程序流、逻辑以及对数据库的查询。它们可以接受参数、输出参数、返回单个或多个结果集以及返回值。

可以出于任何使用 SQL 语句的目的来使用存储过程，它具有以下优点：

  • 可以在单个存储过程中执行一系列 SQL 语句。

  • 可以从自己的存储过程内引用其它存储过程，这可以简化一系列复杂语句。

  • 存储过程在创建时即在服务器上进行编译，所以执行起来比单个 SQL 语句快。

存储过程的功能取决于数据库所提供的功能。有关存储过程可完成工作的更多详细信息，请参见存储过程。

有关使用存储过程的详细信息，请参见下面的主题：

若要 | 请参见
创建将从数据库中执行的存储过程 | 创建存储过程
设置执行权限以允许特定用户对存储过程进行访问 | 执行存储过程
在存储过程中使用参数 | 指定参数
查看存储过程 | 查看存储过程
删除存储过程 | 删除存储过程
对数据库运行存储过程 | 执行存储过程
更改存储过程的名称 | 修改和重命名存储过程


用户定义函数

Microsoft SQL Server 2000 允许创建用户定义函数。与任何函数一样，用户定义函数是可返回值的例程。根据所返回值的类型，每个用户定义函数可分成以下三个类别：

  • 返回可更新数据表的函数

    如果用户定义函数包含单个 SELECT 语句且该语句可更新，则该函数返回的表格格式结果也可以更新。

  • 返回不可更新数据表的函数

    如果用户定义函数包含不止一个 SELECT 语句，或包含一个不可更新的 SELECT 语句，则该函数返回的表格格式结果也不可更新。

  • 返回标量值的函数

    用户定义函数可以返回标量值。

如果函数返回表，则可以在查询的 FROM 子句中使用该函数。有关更多信息，请参见使用其它对象代替表。如果函数返回标量值，则可以在查询中能够使用列名的任何地方使用该函数。有关更多信息，请参见查询中的表达式。


大型数据库工程

当使用可视化数据库工具作为大型软件开发的一部分时，可能遇到几个值得注意的情况：

  • 多人设计一个数据库 多个用户可以连接到数据库并使用"可视化数据库工具"更改数据库设计。有关协调多个用户同时执行活动的信息，请参见多用户数据库设计。

  • 已部署数据库的演化开发 部署数据库之后，随着用户不断扩展要对数据执行的任务集，更改设计可能变得很有必要。有关对已部署数据库进行更改的信息，请参见数据库演化问题。

  • 特定数据库的多个版本 大型工程可能包含许多数据库。即使只有一个数据库的工程也可能有几个复本—开发数据库、测试数据库和已部署的生产数据库。在已部署数据库应用程序的生存周期内，首先在开发数据库中进行更改和改进，然后传播到测试数据库，最后传播到生产数据库。有关使用可视化数据库工具将设计更改从一个数据库传播到另一个数据库的信息，请参见开发、测试和生产数据库。


多用户数据库设计

可以在多用户环境中使用数据库关系图；也就是说，在这个环境中多个用户可以同时更改数据库关系图和数据库。当保存关系图时，数据库设计器验证自上次保存关系图后数据库没有被修改。如果其他用户做了更改，将通知您数据库已经修改。可能需要在数据库关系图和数据库自身内协调这些更改。

若要 | 请参见
在共享数据库关系图中同其他用户一起工作 | 多用户环境
解决多个用户对数据库关系图所做的更改 | 使数据库关系图与已修改的数据库相协调


多用户环境

在多用户环境中，您可以连接并修改其他用户正在使用的同一数据库。因此，多个用户可以同时使用相同的数据库对象。这样，多用户环境就使数据库关系图有可能受到其他用户所做更改的影响，反之亦然。此类更改可以包括对关系图复本、与您共享数据库对象的其他用户的关系图，或是基础数据库的更改。

在多用户环境中使用数据库的一个关键问题是访问权限问题。对数据库所拥有的的访问权限决定了对数据库的可操作程度。例如，若要更改数据库中的对象，必须拥有对数据库的适当写入权限。有关数据库权限的更多信息，请参见管理权限。

作为多用户中的一员，在使用数据库设计器时需要解决下列所有问题：

  • 数据库对象所属关系

  • 受其他用户更改影响的关系图

  • 其他用户删除的数据库对象


数据库对象所属关系

每个数据库对象由用户或角色拥有。如果所有者为角色，则对象由属于那个角色的每个用户共同拥有。

每个对象还有与之相关联的特权。特权可以将特定的权限授予个别用户的对象或属于特定角色的所有用户的对象。

根据在数据库中定义的特权，用户可以查看自己并不拥有的对象。例如，可以将其他用户拥有的对象包括在自己的数据库关系图中。当这样的对象出现在关系图上或表设计器中时，将由所有者名称以及对象名进行标记。

如果数据库特权允许查看但不能修改数据库的结构，可以使用更改脚本设计修改，但不将修改传输到数据库。有关更多信息，请参见保存更改脚本。

有关更改表或视图所有者的详细信息，请分别参阅表属性页和属性窗口的查询选项卡（视图设计器）。


受其他用户更改影响的关系图

在多用户环境中，您的数据库关系图可能因其他用户已经保存到下列位置的更改而受到影响：

  • 您的关系图，自从打开该关系图后其他用户做了更改。

  • 关系图之间共享的数据库对象。

  • 数据库。

例如，您的关系图可能包含其他用户已经删除或重命名的表。在这种情况下，您的关系图就不再反映数据库的当前状态。当尝试保存您的数据库关系图或选定的表时，发现数据库更改对话框将通知您自从打开关系图后数据库已更新。

该对话框还显示一个列表，列出保存您的关系图或选定内容时将受到影响的数据库对象。此时，可以采取下列任一操作：

  • 保存数据表或选择项，并用列表中的所有更改更新数据库。该操作也将影响共享相同数据库对象的其它数据图。
    例如，假定正在编辑关系图上 titleauthors 表中的 au_id 列，而另一个用户的关系图中包含通过该 au_id 列与 titleauthors 表相关联的 authors 表。这样一来保存您的关系图将会影响其他用户的关系图。同样，假定另一个用户为 sales 表中的 qty 列定义了 CHECK 约束。如果删除 qty 列并保存 sales 表，则另一个用户的 CHECK 约束将受到影响。

  • 取消保存操作。然后不保存而关闭数据图。当关系图重新打开时，将与数据库同步。

  • 保存更改列表。可以将"发现数据库更改"对话框中显示的数据库更改列表保存为文本文件，以便可调查其他用户的更改原因。
    例如，如果另一个用户编辑了一个标记为删除的表，您也许想调查一下在更新数据库以前是否应删除该表。

请参见

数据库关系图窗口和表设计窗口间的交互


其他用户删除的数据库对象

在多用户环境中，从数据库中删除数据库对象将影响其他用户。如果其他用户删除了您的关系图中出现的数据库对象，该删除对您的关系图的影响取决于对象被删除的位置。

对象被删除的位置 | 数据库关系图受到怎样的影响
在数据库关系图的另一个复本中 | 删除的对象将在下次打开关系图时从中被删除。如果删除时关系图是打开的，那么关系图仍会显示已删除的对象。
在不同的数据库关系图中 | 删除的对象将在下次打开关系图时从中被删除。如果删除时关系图是打开的，那么关系图仍会显示已删除的对象。
在数据库中 | 如果关系图中没有对那个对象的未保存的更改，下次打开关系图时将从关系图中删除该对象。 如果关系图中包含对那个对象的未保存的更改，对象将保留在关系图中。可以通过保存关系图在数据库中重新创建该对象。

注意 重新创建已删除的对象将在数据库中创建该对象的新定义；但不能还原随对象一起删除的数据。

例如，如果 titles 表在数据库中被删除，并且在数据库关系图中有对 titles 表所做的未保存的更改，那么保存关系图将在数据库中创建一个新的 titles 表。在 titles 表被删除前存在于该表中的任何数据都不能还原。

有关在数据库更改时保存关系图的详细信息，请参见使数据库关系图与已修改的数据库相协调。


数据库演化问题

如果更改已部署数据库的结构，必须特别留意更改应与现有的数据和数据库结构兼容。当进行以下修改时，可能需要采取特殊步骤：

  • 添加约束 当添加约束时，数据库中可能已包含不满足该约束的数据。当尝试保存新约束时，保存不完全对话框将通知您数据库服务器不能创建该约束。为强制数据库接受新约束，可以清除"创建中检查现存数据"复选框。有关更多信息，请参见创建 CHECK 约束时检查现有数据。

  • 添加关系 当添加关系时，数据库中可能已包含在主键表中没有对应行的外键表的行。即现有的数据可能不满足引用完整性。当尝试保存新关系时，保存不完全对话框将通知您数据库服务器不能保存已修改的外键表。为强制数据库接受修改，可以清除"创建中检查现存数据"复选框。有关详细信息，请参见创建关系时检查现有数据。

  • 修改分配给索引视图的表 如果修改分配给 SQL Server 索引视图的表，则视图上的索引将丢失。有关重建索引的更多信息，请参见重建索引。

不管如何更改数据库设计，都应该保留更改的历史记录。一种方法是保留对生产数据库所做全部修改的 SQL 脚本。有关脚本的更多信息，请参见使用脚本。


开发、测试和生产数据库

如果两个数据库具有相同的结构，可以在一个数据库中进行更改，然后将那些更改传播到另一个数据库。例如，如果有个人开发数据库和组范围的测试数据库，可以先修改开发数据库，然后将那些更改传播到测试数据库。为实现这一点：

  • 可以在开发数据库的单个会话中执行所有修改，保存该会话的 SQL 脚本文件，然后在测试数据库上运行该脚本。有关更多信息，请参见保存更改脚本。


数据库查询和可视化数据库工具

设计数据库并用数据对其进行填充后，可以编写查询以从数据库中检索信息。为帮助编写查询，可视化数据库工具包含有查询设计器。有关更多信息，请参见下列主题：

  • 查询设计器和视图设计器的布局

  • 查询和视图

  • 查询和视图的比较

  • 索引视图

  • 支持的查询类型

  • 检索查询结构


查询设计器和视图设计器的布局

查询设计器和视图设计器都由四个窗格组成：关系图窗格、网格窗格、SQL 窗格以及结果窗格。

  • "关系图窗格"显示正在查询的表和其它表结构化对象。每个矩形代表一个表或表结构化对象，并显示可用的数据列以及表示每列如何用于查询的图标。在矩形之间连线表示联接。有关更多信息，请参见关系图窗格。

  • "网格窗格"包含一个类似电子表格的网格，用户可以在其中指定选项，比如要显示哪些数据列、要选择什么行、如何对各行进行分组等等。有关更多信息，请参见网格窗格。

  • "SQL 窗格"显示用于查询或视图的 SQL 语句。可以对设计器所创建的 SQL 语句进行编辑，也可以输入自己的 SQL 语句。对于不能用关系图窗格和网格窗格创建的 SQL 语句（如联合查询），输入 SQL 语句尤其有益。有关更多信息，请参见 SQL 窗格。

  • "结果窗格"显示含有由查询或视图检索的数据的网格。在查询设计器中，该窗格显示最近执行的选择查询的结果。可以通过编辑该网格单元中的值对数据库进行修改，而且可以添加或删除行。有关更多信息，请参见结果窗格。在视图设计器中，结果窗格显示视图的内容。

可以在任意窗格内进行操作以创建查询或视图：可以通过在关系图窗格中选择某列，将该列输入到网格窗格中，或者使其成为 SQL 窗格中 SQL 语句的一部分等方法，指定要显示的列。关系图窗格、网格窗格和 SQL 窗格都是同步的——当在某一窗格中进行更改时，其它窗格自动反映所做的更改。

请参见

关系图窗格 | 网格窗格 | 在查询设计器中浏览 | 结果窗格 | SQL 窗格


关系图窗格

关系图窗格以图形显示通过数据连接选择的表或表结构化对象。同时也显示它们之间的联接关系。

在关系图窗格中可以进行如下操作：

  • 添加或删除表和表结构化对象并指定输出的数据列。

  • 指定用于排序查询的列。

  • 指定要在结果集内对各行进行分组。

  • 创建或修改表和表结构化对象之间的联接。

当在关系图窗格中进行更改时，网格窗格和 SQL 窗格会自动更新以反映所做的更改。例如，如果在关系图窗格内的表或表结构化对象窗口中选择某个要输出的列，查询设计器会将该数据列添加到网格窗格中以及 SQL 窗格内的 SQL 语句中。

关于关系图窗格

每个表或表结构化对象在关系图窗格中以单独的窗口出现。每个矩形标题栏中的图标表示该矩形所代表的对象类型，如下表所示。

图标 | 对象类型
 | 表
 | 查询或视图
 | 链接表
 | 用户定义函数
 | 子查询（在 FROM 子句中）
 | 链接视图

每个矩形显示表或表结构化对象的数据列。列名旁边出现的复选框和符号表示如何在查询中使用该列。工具提示显示列的数据类型和大小等信息。

下表列出各表或表结构化对象的矩形内所使用的复选框和符号。

复选框或符号 | 描述
 | 指定某个数据列是否出现在查询结果集内（选择查询），或者是否用于更新、插入源、生成表或插入到等查询中。选择要添加到结果中的列。如果选择"（所有列）"，则所有数据列都将出现在输出中。 用于复选框的图标根据要创建的查询类型而改变。创建删除查询时，不能选择个别的列。
 | 表示数据列用于对查询结果进行排序（是 ORDER BY 子句的一部分）。如果排序次序是升序，则图标按 A-Z 的形式出现；如果排序次序是降序，则图标按 Z-A 的形式出现。
 | 表示数据列用于在聚合查询中创建分组结果集（是 GROUP BY 子句的一部分）。
 | 表示数据列包含在查询的搜索条件中（是 WHERE 或 HAVING 子句的一部分）。
 | 表示数据列的内容正在为输出而汇总（包含在 SUM、AVG 或其它聚合函数中）。

注意 如果对表或表结构化对象没有足够的访问权限，或者如果数据库驱动程序不能返回有关该对象的信息，则查询设计器将不显示该对象的数据列。在这种情况下，查询设计器将只显示表或表结构化对象的标题栏。

关系图窗格上的联接表

如果查询涉及联接，在联接所涉及的数据列之间将出现一条联接线。如果没有显示联接数据列（例如，表或表结构化对象窗口已最小化或者联接包含表达式），则查询设计器将联接线放在表示表或表结构化对象的矩形的标题栏中。查询设计器为每个联接条件显示一条联接线。

联接线中间的图标形状显示表或表结构化对象的联接方式。如果联接子句使用等于 (=) 以外的运算符，该运算符将显示在联接线图标中。下表列出可在联接线中显示的图标。

联接线图标 | 描述
 | 内联接（用等号创建）。
 | 基于"大于"运算符的内联接。（在联接线图标中显示的运算符反映了在联接中使用的运算符。）
 | 外联接，其中含有左边所表示的表中的全部行，即使它们在相关表中没有匹配行。
 | 外联接，其中含有出现在右表中的所有行，即使它们在相关表中没有匹配行。
 | 完整外部联接，其中含有两个表中的全部行，即使它们在相关表中没有匹配行。

在联接线末端的图标表示联接的类型。下表列出联接的类型以及可在联接线末端显示的图标。

联接线末端的图标 | 描述
 | 一对一联接
 | 一对多联接
 | 查询设计器无法确定联接类型

请参见

添加表 | 创建查询 | 设计查询 | 网格窗格 | 对查询结果中的行分组 | 从查询输出中删除列 | 删除表 | 删除联接 | 结果窗格 | SQL 窗格


网格窗格

网格窗格使您得以指定查询选项（如要显示哪些数据列、如何对结果进行排序以及选择哪些行等），这些都是通过将您的选择输入到一个类似电子表格的窗格中实现的。在网格窗格中，可以指定：

  • 要显示的列和列名别名。

  • 列所属的表。

  • 计算列的表达式。

  • 查询的排序次序。

  • 搜索条件。

  • 分组准则，包括用于摘要报表的聚合函数。

  • 更新或者插入到查询的新值。

  • 插入源查询的目标列名。

在网格窗格中所做的更改将自动反映到关系图窗格和 SQL 窗格。同样，网格窗格也自动更新以反映其它窗格中的更改。

关于网格窗格

网格窗格中的各行显示查询中所用的数据列；网格窗格中的列显示查询选项。

出现在网格窗格中的特定信息取决于正在创建的查询类型。如果创建选择查询，网格窗格包含的列与创建更新查询时不同。

下表列出可以出现在网格窗格中的网格列。

列 | 查询类型 | 描述
列 | 全部 | 显示用于查询的数据列名或计算列的表达式。该列将被锁定，因此当水平滚动屏幕时，始终可以看到该列。
别名 | 选择、插入源、更新表、生成表 | 指定列的可选名或可以用作计算列的名称。
表 | 选择、插入源、更新表、生成表 | 指定关联的数据列的表名或表结构化对象名。对于计算列，该列是空白的。
输出 | 选择、插入源、生成表 | 指定某个数据列是否出现在查询输出中。 注意 如果数据库允许，可以将某个数据列用于排序或搜索子句，但不在结果集内显示该数据列。
排序类型 | 选择、插入源 | 指定关联的数据列用于对查询结果进行排序，并指定排序是升序还是降序。
排序次序 | 选择、插入源 | 指定用于对结果集进行排序的数据列排序优先级。当更改某个数据列的排序次序时，所有其它列的排序次序都将随之更新。
分组 | 选择、插入源、生成表 | 指定关联的数据列用于创建聚合查询。只有当从"工具"菜单中选择"分组"命令，或者向 SQL 窗格中添加 GROUP BY 子句时，该网格列才会出现。 默认情况下，该列的值被设置为 Group By，而且该列也成为 GROUP BY 子句的一部分。 当移动到该列的一个单元中，并选择一个聚合函数应用到关联的数据列时，在默认情况下结果表达式将作为结果集的输出列而添加进来。
准则 | 全部 | 指定关联数据列的搜索条件（筛选）。输入运算符（默认为"="）和要搜索的值。用单引号将文本值括起来。 如果关联的数据列是 GROUP BY 子句的一部分，则输入的表达式用于 HAVING 子句。 如果在"准则"网格列的多个单元中输入值，则所得到的搜索条件将自动由逻辑 AND 链接起来。 若要为单个数据库列指定多个搜索条件表达式，例如 (fname > 'A') 和 (fname < 'M')，请将数据列添加到网格窗格中两次，并在准则网格列中为数据列的每个实例输入不同的值。
或� | 全部 | 指定数据列的附加搜索条件表达式，并用逻辑 OR 链接到先前的表达式。可以在最右边的"或�"列中按 TAB 键，以添加更多的"或�"网格列。
追加 | 插入源 | 指定关联的数据列的目标数据列名称。创建插入源查询时，查询设计器尝试将源与适当的目标数据列匹配。如果查询设计器不能选择匹配列，则必须提供列名。
新值 | 更新、插入到 | 指定放入相关列中的值。可输入字面值或表达式。

请参见

创建列别名 | 设计查询 | 关系图窗格 | 输入搜索值 | 对查询结果中的行分组 | 结果窗格 | 指定搜索条件 | SQL 窗格


SQL 窗格

SQL 窗格显示当前查询的 SQL 语句。生成查询时，SQL 窗格将自动更新并重新格式化以便于读取。

在 SQL 窗格中，可以进行下列操作：

  • 输入 SQL 语句以创建新查询。

  • 基于在关系图窗格和网格窗格中的设置，对查询设计器所创建的 SQL 语句进行修改。

  • 输入语句以利用所使用数据库的特有功能。

注意 一定要知道所使用数据库中的数据库对象标识规则。有关 SQL Server 的详细信息，请参见对 SQL Server 数据库使用查询设计器时的注意事项。

SQL 窗格中的语句

可以直接在 SQL 窗格中编辑当前查询。当移动到另一窗格时，查询设计器自动将语句格式化，然后更改关系图窗格和网格窗格以与语句匹配。

注意 可以输入 SQL 语句的优化程序提示，但是查询设计器可能会将这些提示重新格式化。有关 SQL Server 的详细信息，请参见对 SQL Server 数据库使用查询设计器时的注意事项。

如果语句不能在关系图窗格和网格窗格中表示出来，并且如果那些窗格是可见的，查询设计器将显示错误信息，然后提供两种选择：

  • 返回 SQL 窗格并对语句进行编辑。

  • 放弃所做的更改并还原为 SQL 语句的新近版本。

如果返回 SQL 窗格继续编辑语句，查询设计器将使其它窗格变成灰色，以表示它们不再反映 SQL 窗格的内容。

也可以用 SQL 窗格输入不能在查询设计器中用图形表示的 SQL 语句。在这种情况下，查询设计器将采取与其在检测到错误时相同的行为 — 使关系图窗格和网格窗格变成灰色，以表示它们不再表示当前语句。可以继续编辑语句，并像执行任何 SQL 语句一样执行该语句。有关 SQL Server 中不支持的查询类型的详细信息，请参见对 SQL Server 数据库使用查询设计器时的注意事项。

注意 如果输入一个 SQL 语句，但接着通过更改关系图窗格和网格窗格对查询做进一步更改，则查询设计器将重新生成和显示该 SQL 语句。在某些情况下，该操作产生的 SQL 语句在构造上和原先输入的 SQL 语句不同（尽管该语句将总是产生相同的结果）。当使用的搜索条件涉及某些与 AND 和 OR 链接的子句时，极有可能产生这种差异。

请参见

创建查询 | 设计查询 | 关系图窗格 | 执行查询 | 网格窗格 | 结果窗格 | 在查询中使用表达式


结果窗格

结果窗格显示最近执行的选择查询的结果。（其它查询类型的结果显示在消息框中。）

在结果窗格中，可以进行下列操作：

  • 在类似于电子表格的网格中查看最近执行的选择查询的结果集。

  • 对结果集内个别列的值进行编辑、添加新行和删除现有的行。有关详细信息，请参见在结果窗格中编辑行。

如果更改查询定义（例如，将另一输出列添加到查询中），查询设计器将使结果窗格变成灰色，以表示它不再反映当前查询。不过，仍然可以在结果窗格中浏览，对行进行编辑、添加或删除。

结果窗格中的数据

当执行选择查询时，打开视图或表，结果集将出现在结果窗格中。

结果窗格使用下列规范：

  • 不包含任何值的列显示字 <NULL>。

  • 包含二进制数据的列显示字 <Binary>。无法对这些列的内容进行编辑。

  • 包含长 varchar 类型数据的列显示的数据长达 900 个字符。如果数据更长，该单元显示 <Long Text>。

  • 列根据 Microsoft® Windows®"控制面板"的"区域设置"对话框中所设置的选项对数字、货币、时间和日期信息进行格式化。

请参见

在结果窗格中添加新行 | 在结果窗格中删除行 | 确定查询结果的更新时间 | 在结果窗格中编辑行 | 从查询输出中删除列 | 重新排列输出列


查询设计器表示联接的方式

如果联接表，则查询设计器将在关系图窗格中以图形方式或在 SQL 窗格中用 SQL 语法表示联接。

关系图窗格

在关系图窗格中，查询设计器在涉及联接的数据列之间显示一条联接线。查询设计器为每个联接条件显示一条联接线。例如，下图说明两个联接表之间的联接线：

如果用多个联接条件联接表，查询设计器将显示多条联接线，如下例所示：

如果没有显示联接数据列（例如，代表表或表结构化对象的矩形已最小化，或者联接涉及表达式），查询设计器会将联接线放到代表表或表结构化对象的矩形的标题栏上。

联接线中间的图标形状显示表或表结构化对象的联接方式。如果联接子句使用等号 (=) 以外的运算符，该运算符将出现在联接线图标中。下表列出出现在联接线上的图标。

联接线图标 | 描述
 | 内联接（用等号创建）。
 | 基于"大于"运算符的内联接。
 | 外联接，其中含有出现在左表中的所有行，即使它们在相关表中没有匹配行。
 | 外联接，其中含有出现在右表中的所有行，即使它们在相关表中没有匹配行。
 | 完整外部联接，其中含有两个表中的所有行，即使它们在相关表中没有匹配行。

联接线末端的符号表示联接类型。下表列出联接类型和显示在联接线末端的图标。

联接线末端的图标 | 联接类型
 | 一对一联接。
 | 一对多联接。
 | 查询设计器无法确定联接类型。这种情况最常发生于手动创建联接时。

SQL 窗格

在 SQL 语句中，可以用许多方式表示联接。确切的语法取决于所使用的数据库以及定义联接的方式。

联接表的语法选项包括：

  • FROM 子句的 JOIN 限定符。 关键字 INNER 和 OUTER 指定联接类型。该语法是 ANSI 92 SQL 的标准语法。

    例如，如果基于每个表中的 pub_id 列联接 publishers 和 pub_info 表，所得到的 SQL 语句可能象下面这样：

    SELECT *
FROM publishers INNER JOIN pub_info ON
   publishers.pub_id = pub_info.pub_id

    如果创建外联接，则将出现关键字 LEFT OUTER 或 RIGHT OUTER 以代替关键字 INNER。

  • WHERE 子句比较两个表中的列。 如果数据库不支持 JOIN 语法（或是自己输入该语法），将出现 WHERE 子句。如果联接是在 WHERE 子句中创建的，则两个表名都出现在 FROM 子句中。

    例如，下面的语句联接 publishers 表和 pub_info 表。

    SELECT *
FROM publishers, pub_info
WHERE  publishers.pub_id = pub_info.pub_id

    注意 SQL Server 数据库支持 *= and =* 语法。有关详细信息，请参见对 SQL Server 使用查询设计器时的注意事项。

请参见

创建外联接 | 创建自联接 | 自动联接表 | 手工联接表 | 修改联接运算符 | 联接类型


查询和视图

查询是对数据库内的数据进行检索、创建、修改或删除的特定请求。数据库接受用 SQL 这种功能强大且具挑战性的语言编写的查询。为利用 SQL 的强大功能同时避免艰巨的编写任务，可以使用可视化数据库工具。通过使用这些工具，可以不用直接编写 SQL 而创建 SQL 查询。

SQL 也用于创建视图，视图是数据库数据的特定子集。视图和检索查询是用相同的语句（SQL SELECT 语句）定义的，因此必定很相似。但在查询和视图之间也有重大的差别。有关更多信息，请参见查询和视图的比较。

SQL SELECT 语句是视图和检索查询的基础，但是有一些其它类型的查询要基于其它的 SQL 语句。有关查询类型的更多信息，请参见支持的查询类型。

请参见

查询和视图的比较


查询和视图的比较

由于查询和视图有如此多的相似性，所以很容易忽略它们之间的差异。本节对查询和视图做一个简单的比较。

存储 视图存储为数据库设计的一部分，而查询则不是。当设计数据库时，可以出于下列原因将视图包括在设计中：

  • 一些数据子集关系到许多用户。由于每个视图都存储在数据库内，所以视图建立特定的数据子集以供任何数据库用户使用。

  • 视图可以隐藏基表。可以禁止所有用户访问数据库表，而要求用户只能通过视图操作数据。这种方法可以保护用户和应用程序不受某些数据库修改的影响。例如，如果可以创建一个名为"本月销售额"的视图。在每月的第一天，可以相应地修改视图的定义。如果没有这个视图，用户每月都必须重新编写查询以选择相应月份的销售额。

更新结果 对视图和查询的结果集更新限制是不同的。有关更多信息，请参见结果更新规则。

排序结果 可以排序任何查询结果，但是只有当视图包括 TOP 子句时才能排序视图。有关 TOP 子句的更多信息，请参见使用 TOP 和 PERCENT 限制结果集。

生成查询计划 查询计划是内部策略，通过它数据库服务器尝试快速创建结果集。数据库服务器可以在保存视图后立即为视图建立查询计划。但是对于查询，数据库服务器直到查询实际运行时才能建立查询计划——也就是说，直到用户显式请求结果集时。

参数设置 可以为查询创建参数，但不能为视图创建参数。有关参数化查询的更多信息，请参见创建通用查询。

加密 可以加密视图，但不能加密查询。有关更多信息，请参见加密视图。

请参见

查询和视图


索引视图

SQL Server 2000 支持索引视图。索引视图是指结果保留在数据库中并建立了索引以供快速访问的视图。

若要了解如何创建索引视图，请参见创建索引视图。

与任何其它视图一样，索引视图的数据依赖于基表。这种相关性意味着如果更改分配给索引视图的基表，索引视图可能会无效。例如，重命名分配给视图的列将使视图无效。为防止发生这类问题，SQL Server 支持创建带"架构绑定"的视图。架构绑定禁止对表或列进行任何会使视图无效的修改。用视图设计器创建的任何索引视图都自动获得架构绑定，因为 SQL Server 要求索引视图带架构绑定。

架构绑定并不意味着不能修改视图，而是意味着不能用会更改视图结果集的方法修改基础表或视图。

使用表设计器或数据库设计器时，可以尝试修改分配给用架构绑定定义的视图的基表或列。如果尝试的修改可能使视图无效，设计器将发出警告并询问是否继续。如果选择继续，将发生下列情况：

  • 对基表的修改发生。

  • 所有依赖基表视图的视图将更改，"架构绑定"即被删除。因此，在这之后若对基表进行修改，将不会出现任何警告。

  • 如果以前为相关视图建立了索引，将删除该索引。

只有当基表分配给带架构绑定的视图，而且所做的修改满足下列一个或多个条件时，表设计器和数据库设计器才会在修改基表前发出警告：

  • 修改将删除基表。

  • 修改将重命名基表。

  • 修改将重新创建基表。

  • 修改将删除基表中的某列以及包含该列的视图。

  • 修改将重命名基表中的某列以及包含该列的视图。

请参见

创建索引视图


查询设计器和视图设计器窗口间的交互

当设计视图时，视图设计器将工作保留在内存中。也就是说，直到在视图设计器中显式保存视图时，视图设计器才会传输工作。对于每个打开的查询设计器和视图设计器窗口，可视化数据库工具保留一个单独的内存部分保留工作。由于每个窗口都有自己的内存，在一个窗口内所做的修改不适用于任何其它窗口。

记住：可以将视图用作查询的一部分或另一个视图的一部分。修改视图后，直到将修改的视图保存到数据库时，修改才会影响查询或其它的视图。

注意 数据库关系图窗口和表设计器窗口使用不同的策略将工作保留在内存中。有关更多信息，请参见数据库关系图窗口和表设计窗口间的交互。

请参见

数据库关系图窗口和表设计窗口间的交互


结果窗格和数据库间的交互

当运行查询或视图时，数据库准备结果集并返回结果。如果结果集包含很多行，则以批处理的方式返回结果。下面是应了解的几个细节：

  • 数据库将查询作为一个整体运行 在数据库服务器上，对查询的处理不是以批处理的方式运行。只有在将查询结果从服务器返回到您的计算机时，才以批处理的方式运行。

  • 除非另有要求，否则将只返回第一批结果 当返回第一批行后，可以继续在其它查询窗格或视图窗格中工作。如果要查看结果集内的更多行，可以在结果窗格中滚动，以促使数据库服务器将更多的行传输到您的计算机。

结果窗格中的某些操作要求整个结果集 如果试图浏览到结果集的最后一行，或者在结果集内编辑值，则应有效地促使数据库服务器返回整个结果集。对于特别大的结果集，这可能要花很长时间。


支持的查询类型

可以在查询设计器的关系图窗格和网格窗格（图形窗格）中创建下面的查询类型：

  • 选择查询 从一个或多个表或视图中检索数据。这种类型的查询创建 SQL SELECT 语句。

  • 插入到查询 创建新行并将值插入到指定的列。这种类型的查询创建 SQL INSERT INTO...VALUES 语句。

  • 插入源查询 通过将现有的行从一个表复制到另一表中，或作为新行复制到同一个表中来创建新行。这种类型的查询创建 SQL INSERT...SELECT 语句。

  • 更新查询 更改表中一个或多个现有行中个别列的值。这种类型的查询创建 SQL UPDATE 语句。

  • 删除查询 从表中删除一行或多行。这种类型的查询创建 SQL DELETE 语句。

    注意 删除查询会从表中删除整行。若要从个别数据列中删除值，请使用更新查询。

  • 生成表查询 创建一个新表，并将查询结果复制到该表中以在表中创建各行。这种类型的查询创建 SQL SELECT...INTO 语句。

除了可以用图形窗格创建的查询外，还可以将任何 SQL 语句输入到 SQL 窗格中，例如联合查询。

如果在创建查询时使用的 SQL 语句无法在图形窗格中表示出来，则查询设计器将使那些窗格变成灰色，以表示它们不再反映正在创建的查询。不过，变成灰色的窗格仍然是活动的，而且在许多情况下，仍可以在那些窗格中对查询进行修改。如果所做的修改产生的查询可以在图形窗格中表示出来，那些窗格就不再是灰色的。

有关 SQL Server 中不支持的查询类型的详细信息，请参见对 SQL Server 数据库使用查询设计器时的注意事项。

请参见

创建删除查询 | 创建 INSERT FROM 查询 | 创建更新查询 | 创建 INSERT INTO 查询 | 创建生成表查询


检索查询结构

检索查询从数据库中请求数据。最简单的情况是，检索查询只从单个表中提取所有的数据。但在创建更复杂（和更典型）的索引查询时，可以使用下列方法正确组合数据：

  • 包括或排除行

  • 包括或排除列

  • 组合表

  • 折叠行组

  • 在一个查询中使用一个表两次

  • 使用其它对象代替表

  • 对行排序


包括或排除行

若要限制选择查询应返回的行数，请创建搜索条件或筛选准则。在 SQL 中，搜索条件出现在语句的 WHERE 子句中，如果创建聚合查询，则搜索条件出现在 HAVING 子句中。

注意 也可使用搜索条件表示受更新、插入到、插入源、删除或生成表查询影响的行。

当运行查询时，数据库引擎检查搜索条件并将其应用到正在搜索的表中的每一行。如果该行符合搜索条件，则包括在查询中。例如，一个查找特定区域内所有员工的搜索条件可以是：

region = 'UK'

若要建立在结果中包括行的准则，可以使用多个搜索条件。例如，下列搜索准则由两个搜索条件组成。只有在某行满足这两个条件，查询在结果集内才包括该行。

region = 'UK' AND product_line = 'Housewares'

可以用 AND 或 OR 组合这些条件。上面的示例使用了 AND。相反，下面的准则使用的是 OR。该查询结果将包括只满足其中一个条件或两个条件都满足的任何行：

region = 'UK' OR product_line = 'Housewares'

甚至可以组合单个列上的搜索条件。例如，下面的准则组合了区域列上的两个搜索条件：

region = 'UK' OR region = 'US'

有关组合搜索条件的详细信息，请参见下列主题：

  • 组合搜索条件

  • 为一列指定多个搜索条件

  • 为多列指定多个搜索条件

  • 在 AND 优先时组合条件

  • 在 OR 优先时组合条件
搜索条件中的谓词

搜索条件包括一个或多个谓词，每个谓词指定一个条件。如果搜索条件包括多个谓词，则用逻辑 AND（缩小搜索范围）或 OR（扩大搜索范围）将谓词链接起来。下例显示当搜索 employee 表以查找指定姓名的员工时，如何使用多个条件：

WHERE lname = 'Smith' AND fname = 'Jean'

单个谓词的条件采用下面的格式：

search_expression operator search_value

在多数情况下，search_expression 是要搜索的列名。同样，search_value 最常见的形式是要搜索的字面值，既可以是字符串也可以是数字。

下面的两个示例显示两个字面值。第一个字面值搜索在英国的所有员工，第二个字面值搜索指定职位等级的所有员工：

WHERE region = 'UK'

WHERE job_lvl = 100

search_expression 和 search_value 都可以包括下面的任何一项（或各项的任意组合）：

  • 字面值 单个文本值、数值、日期值或逻辑值。下例使用一个字面值在所有行中查找在英国的员工：
    WHERE region = 'UK'
  • 列引用 正在其中一个表中搜索的列名。下例在 products 表中搜索所有生产成本值低于运输成本的行：
    WHERE prod_cost < ship_cost
  • 函数 对函数的引用，数据库的后端可以解析该函数以计算搜索值。该函数可以是由数据库服务器定义的函数或者是返回标量值的用户定义函数。下例搜索今天发出的订单（GETDATE( ) 函数返回当前日期）：
    WHERE order_date = GETDATE()
  • NULL 下例在 authors 表中搜索所有名字已存档的作者：
    WHERE au_fname IS NOT NULL
  • 计算结果 可涉及文字、列引用或其它表达式的计算结果。下例搜索 products 表，查找零售价格高于生产成本两倍的所有行：
    WHERE sales_price > (prod_cost * 2)
  • 子查询 由其它查询生成的结果集。下例搜索 products 表，查找来自瑞典供货商的所有产品。子查询首先搜索 suppliers 表，生成那个国家的供货商列表。然后搜索 products 表，将产品供货商 ID 与子查询创建的列表进行匹配。
    WHERE supplier_id IN
  (SELECT supplier.supplier_id
  FROM supplier
  WHERE (supplier.country = 'Sweden'))

有关创建搜索条件的更多详细信息，请参见下列主题。

有关信息 | 请参见
在查询设计器中指定搜索条件 | 指定搜索条件
创建可在搜索条件中使用的表达式 | 在查询中使用表达式
在搜索条件中使用运算符 | 比较运算符、逻辑运算符和通配符
输入文本、数值、日期值或逻辑值 | 输入搜索值
查找与某个值不匹配的行 | 选择与值不匹配的行
从选择查询中删除重复行 | 排除重复行
对同一数据列应用多个搜索条件 | 为一列指定多个搜索条件
将多个数据列包含为查询搜索条件的一部分 | 为多列指定多个搜索条件
用 AND 和 OR 运算符链接搜索条件 | 组合搜索条件
使用子查询 | 创建子查询


包括或排除列

可以选择出现在查询结果中的列。当选择要包括的列时，需要记住几件事：

  • 可以包括一个表中的所有列 例如，可以包括每个员工的所有信息。所得到的 SQL 象下面这样：
    SELECT *
FROM employee
  • 可以只包括想要的列 例如，可以列出所有员工的姓名。所得到的 SQL 象下面这样：
    SELECT fname, minit, lname
FROM employee

    包括的列的列表中甚至可能不是从查询所涉及的每个表中都选取一列包含在内。这并不意味表没有分配给查询。有关使用表但不包括表中任何列的查询的示例，请参见在一个查询中使用一个表两次。

  • 可以包括所有表中的所有列 例如，当组合 sales 表和 stores 表中的数据时，可以在结果中包括这两个表中任何一个的所有列。所得到的 SQL 可能象下面这样：
    SELECT     *
FROM         sales INNER JOIN
stores ON sales.stor_id = stores.stor_id
  • 可以包括派生出的列 也就是说，可以包括不属于查询的任何数据库表的列。例如，可以创建这样的结果集：包含每个职位的职位描述和平均职位等级。所得到的 SQL 可能象下面这样：
    SELECT    job_desc, (max_lvl + min_lvl) / 2
FROM         jobs

    可以使用 SQL 语法定义派生出的列（如上面的示例查询所示），或使用用户定义函数返回标量值。

有关在查询结果中包括列的更多信息，请参见添加列。有关用户定义函数的更多信息，请参见用户定义函数。

请参见

检索查询结构


组合表

查询结果可以包括多个表的数据。若要组合各表的数据，请使用 SQL 的 JOIN 操作。JOIN 操作基于行中的值将一个表中的行与另一个表中的行进行匹配。例如，可以联接 titles 表和 publishers 表。结果集内的每一行描述一个书名，包括有关该书名的出版商信息，如下图所示：

当使用 JOIN 时，需做几个决策。下列主题描述联接类型以及如何使用它们：

  • 联接类型

  • JOIN 列

  • JOIN 比较运算符

  • JOIN 表


联接类型

当联接表时，创建的联接类型影响出现在结果集内的行。可以创建下列联接类型：

  • 内联接 仅显示两个联接表中的匹配行的联接。（这是查询设计器中的默认联接类型。）例如，可以联接 titles 表和 publishers 表以创建显示每个书名的出版商名称的结果集。在内联接中，结果集内不包含没有出版商信息的书名，也不包含没有书名的出版商。这类联接所得到的 SQL 可能象下面这样：
    SELECT     title, pub_name
FROM         titles INNER JOIN
publishers ON titles.pub_id = publishers.pub_id

    注意 当创建内联接时，包含 NULL 的列不与任何值匹配，因此不包括在结果集内。空值不与其它的空值匹配。

    有关创建内联接的更多信息，请参见自动联接表。

  • 外联接 甚至包括在联接表中没有相关行的行的联接。可以创建外联接的三个变化形式来指定所包括的不匹配行：
    • 左向外联接 包括第一个命名表（"左"表，出现在 JOIN 子句的最左边）中的所有行。不包括右表中的不匹配行。例如，下面的 SQL 语句说明 titles 表和 publishers 表之间的左向外联接包括所有的书名，甚至包括那些没有出版商信息的书名：
      SELECT titles.title_id,
       titles.title,
       publishers.pub_name
FROM titles LEFT OUTER JOIN publishers
            ON titles.pub_id
             = publishers.pub_id
    • 右向外联接 包括第二个命名表（"右"表，出现在 JOIN 子句的最右边）中的所有行。不包括左表中的不匹配行。例如，在 titles 和 publishers 表之间的右向外联接将包括所有的出版商，甚至包括那些在 titles 表中没有书名的出版商。所得到的 SQL 可能象下面这样：
      SELECT titles.title_id,
       titles.title,
       publishers.pub_name
FROM titles RIGHT OUTER JOIN publishers
            ON titles.pub_id
             = publishers.pub_id
    • 完整外部联接 包括所有联接表中的所有行，不论它们是否匹配。例如，titles 表和 publishers 表之间的完整外部联接显示所有书名和所有出版商，甚至包括那些在另一个表中没有匹配值的书名和出版商。
      SELECT titles.title_id,
       titles.title,
       publishers.pub_name
FROM titles FULL OUTER JOIN publishers
            ON titles.pub_id
             = publishers.pub_id

    有关创建外联接的更多信息，请参见创建外联接。

  • 交叉联接 在这类联接的结果集内，两个表中每两个可能成对的行占一行。例如，在通过作者 CROSS JOIN 出版商输出的结果集内，每个可能的作者/出版商组合占一行。所得到的 SQL 可能象下面这样：
    SELECT *
FROM authors CROSS JOIN publishers

    有关创建完全联接的更多信息，请参见删除联接。

请参见


联接列

JOIN 运算符通过将一个表中的值与另一个表中的值进行比较来匹配行。由您决定每个表中的哪些行应匹配。有几个选择：

  • 相关列 一般情况下，通过匹配存在外键关系的列中的值来联接表。例如，通过匹配各自表中的 stor_id 值，可以将折扣联接到商店。所得到的 SQL 可能象下面这样：
    SELECT *
FROM discounts INNER JOIN stores
     ON stores.stor_id = discounts.stor_id

    有关在相关列上联接表的更多信息，请参见自动联接表。

  • 不相关的列 也可通过匹配不存在外键关系的列中的值来联接表。例如，通过匹配各自表中的州值，可以将出版商联接到作者。在通过这类联接输出的结果集内，每对位于同一个州的作者/出版商占一行。
    SELECT au_lname,
       au_fname,
       pub_name,
       authors.state
FROM   authors INNER JOIN publishers
               ON authors.state
                = publishers.state

    有关在不相关的列上联接表的信息，请参见手工联接表。

也请注意使用多列匹配联接表中的行。例如，若要查找由位于同一城市的作者和出版商组成的作者/出版商对，请使用联接操作匹配两个表中各自的 state 列和 city 列。需要既匹配城市又匹配州，因为在不同的州可能有同名的城市（例如：伊利诺斯州的 Springfield 和麻萨诸塞州的 Springfield）。

有关在多列上联接表的更多信息，请参见在多列上联接表。

请参见

检索查询结构


联接比较运算符

JOIN 运算符通过将一个表中的值与另一个表中的值进行比较来匹配行。您可以决定匹配的确切方式。您的选择分两大类：

  • 等价匹配 一般情况下，当各自的列值相等时对行进行匹配。例如，若要在创建的结果集内使每个出版商的完整描述都占一行（也就是说，含有 publishers 表和 pub_info 表中的列），请使用各自表中的 pub_id 值相等的联接匹配行。所得到的 SQL 可能象下面这样：
    SELECT *
    FROM publishers INNER JOIN pub_info
      ON publishers.pub_id
      =  pub_info.pub_id
  • 其它 可以使用等价匹配以外的一些测试对行进行匹配。例如，若要查找员工以及他们不胜任的职位，可以联接员工和职位，匹配那些职位的最低要求等级超过员工职位等级的行。所得到的 SQL 可能象下面这样：

    SELECT
    fname, minit, lname,
    job_desc, job_lvl, min_lvl
    FROM employee INNER JOIN jobs
    ON employee.job_lvl
    < jobs.min_lvl

有关比较运算符的更多信息，请参见比较运算符。

请参见

检索查询结构


联接表

当组合多个表的数据时，必须决定使用什么表。有几个值得注意的事项：

  • 组合三个或更多的表 每个 JOIN 操作组合两个表。但是，可以在一个查询内使用多个 JOIN 操作组合多个表中的数据。由于每个 JOIN 操作的结果实际上是一个表，所以可以将该结果作为操作数用在后面的联接操作中。例如，若要在创建的结果集内，使每个书名、作者以及作者拿到的那本书的版税百分比都占一行，必须组合三个表中的数据：authors、titles 和 titleauthor。所得到的 SQL 可能象下面这样：
    SELECT
    title,
    au_fname,
    au_lname,
    royaltyper
FROM
    authors
        INNER JOIN
        titleauthor
        ON authors.au_id
        =  titleauthor.au_id
   INNER JOIN
   titles
         ON titleauthor.title_id
         =  titles.title_id
  • 专门使用一个表联接其它表 可以在联接中包括一个表，即使不想在结果集内包含该表中的任何列。例如，若要在建立的结果集内，使每对书名/出售此书的商店都占一行，请包括这两个表中的列：titles 和 stores。但是必须使用第三个表，即 sales 表，来决定哪些商店销售哪些书。所得到的 SQL 可能象下面这样：
    SELECT title, stor_name
FROM titles
         INNER JOIN
         sales
         ON titles.title_id = sales.title_id
             INNER JOIN
             stores
             ON
             sales.stor_id = stores.stor_id

    注意 sales 表不在结果集内输出列。

  • 在一个查询中使用一个表两次 可以在单个查询中使用同一个表两次（或更多次）。有关更多信息，请参见在一个查询中使用一个表两次。

  • 使用其它对象代替表 可以使用查询、视图或返回表的用户定义函数代替表。有关更多信息，请参见使用其它对象代替表。

有关将表添加到查询的更多信息，请参见添加表。

请参见

检索查询结构


折叠行组

可以创建这样的查询结果：每个结果行与原始数据中的整个行组相对应。拆叠行时需要记住几件事：

  • 可以消除重复行 有些查询创建的结果集内可能包含多个相同的行。例如，在创建的结果集内，每行可以包含作者所在的城市名和州名；但如果一个城市包含几个作者，则将会生成几个相同的行。所得到的 SQL 可能象下面这样：
    SELECT city, state
FROM authors

    由上述查询生成的结果集不是很有用。如果一个城市包含四个作者，结果集将包括四个相同的行。由于结果集不包括城市和州以外的任何其它列，因此无法互相区别这些相同的行。避免这类重复行的一种方法是包含能使行不同的附加列。例如，如果包含作者名，则每行将不同（只要任一城市内不存在两个同名的作者）。所得到的 SQL 可能象下面这样：

    SELECT city, state, fname, minit, lname
FROM authors

    当然，上述查询消除了表象，但并未真正解决问题。也就是说，结果集不含重复行，但已不再是关于城市的结果集。若要消除原始结果集内的重复行，使每行仍描述一个城市，可以创建只返回唯一行的查询。所得到的 SQL 可能象下面这样：

    SELECT DISTINCT city, state
FROM authors

    有关消除重复行的详细信息，请参见排除重复行。

  • 可以在行组上进行计算 也就是说，可以汇总行组内的信息。例如，可以创建这样的结果集：每行包含作者所在的城市名和该城市所属的州名，以及该城市包含的作者数。所得到的 SQL 可能象下面这样：
    SELECT city, state, COUNT(*)
FROM authors
GROUP BY city, state

    有关在行组上计算的详细信息，请参见聚合函数和在行组上查询。

  • 可以使用选择准则包括行组 例如，可以创建这样的结果集：每行包含几个作者所在的城市名和该城市所属的州名，以及该城市包含的作者数。所得到的 SQL 可能象下面这样：
    SELECT city, state, COUNT(*)
FROM authors
GROUP BY city, state
HAVING COUNT(*) > 1

    有关在行组上应用选择准则的详细信息，请参见为组指定条件和在同一查询中使用 HAVING 子句和 WHERE 子句。

请参见

检索查询结构


在一个查询中使用一个表两次

可以在单个查询中使用同一个表两次（或更多次）。在如下几种情况下可这样做。

  • 使用自反关系创建自联接 可以使用自反关系（在该关系中，引用外键列和被引用主键列位于同一个表内）将表与其自身联接。例如，假设员工表包含一个附加列：employee.manager_emp_id，且存在从 manager_emp_id 到 employee.emp_id 的外键。在员工表的每一行内，manager_emp_id 列显示员工的老板。更确切地说，显示员工的老板的 emp_id。

通过使用自反关系将表与其自身联接，可以建立这样的结果集：每行都包含老板的姓名以及该老板的一个员工的姓名。所得到的 SQL 可能象下面这样：

SELECT
    boss.lname,
    boss.fname,
    employee.lname,
    employee.fname
FROM
    employee
        INNER JOIN
        employee boss
        ON employee.manager_emp_id
        =  boss.emp_id

有关使用自反关系创建联接的更多信息，请参见自动创建自联接。

  • 在不使用自反关系的情况下创建自联接 可以在不使用自反关系的情况下将表与其自身联接。例如，可以建立这样的结果集：每行描述一个员工以及该员工的潜在领导。（潜在领导是指具有更高职位等级的员工。）所得到的 SQL 可能象下面这样：
    SELECT
    employee.fname,
    employee.lname,
    mentor.fname,
    mentor.lname
FROM
    employee
        INNER JOIN
        employee mentor
        ON employee.job_lvl
        <  mentor.job_lvl

    注意该联接使用了等价以外的条件。有关使用等价以外的条件联接表的更多信息，请参见联接比较运算符。

    有关使用不相关的列创建自联接的更多信息，请参见手动创建自联接。

  • 在没有自联接的情况下使用一个表两次 即使没有自联接，也可以在同一查询内使用同一个表两次（或更多次）。例如，可以建立这样的结果集：包含作者的其它作品或您喜欢的书的作者。这种情况下，将使用 titleauthors 表两次——一次用于查找喜欢的书 (Is Anger the Enemy?) 的作者，另一次用于查找这些作者的其它作品。所得到的 SQL 可能象下面这样：
    SELECT
    other_title.title
FROM
    titles favorite_title
        INNER JOIN
        titleauthor favorite_titleauthor
        ON favorite_title.title_id
        =  favorite_titleauthor.title_id
            INNER JOIN
            authors
            ON favorite_titleauthor.au_id
            =  authors.au_id
                INNER JOIN
                titleauthor other_titleauthor
                ON authors.au_id
                =  other_titleauthor.au_id
                    INNER JOIN
                    titles other_title
                    ON other_titleauthor.title_id
                    =  other_title.title_id
WHERE
    favorite_title.title
    = 'Is Anger the Enemy?'
  AND
    favorite_title.title
    <> other_title.title

注意 为区别任一表的多次使用，上述查询使用了下列别名：favorite_title、favorite_titleauthor、other_titleauthor 和 other_title。有关别名的更多信息，请参见创建表别名。

请参见

检索查询结构 | 绘制自反关系


使用其它对象代替表

每次编写检索查询时，必须明确说明想要的列、想要的行以及查询处理器应在哪里查找原始数据。一般情况下，原始数据由一个表或几个联接在一起的表组成。但是原始数据也可以来自表以外的源。事实上，它可以来自视图、查询或返回表的用户定义函数。

更确切地说，原始数据可以来自表、视图、查询和返回表的用户定义函数的任意联接组合。

使用视图代替表

可以从视图选择行。例如，假设数据库包含一个名为"ExpensiveBooks"的视图，在该视图中，每行描述一个价格超过 $19.99 的书名。视图定义可能象下面这样：

SELECT *
FROM titles
WHERE price > 19.99

通过从 ExpensiveBooks 视图中选择心理学书籍，可以只选择较贵的心理学书籍。所得到的 SQL 可能象下面这样：

SELECT *
FROM ExpensiveBooks
WHERE type = 'psychology'

同样，视图可以参与 JOIN 操作。例如，通过将 sales 表联接到 ExpensiveBooks 视图，可以只查找较贵的书的销售额。所得到的 SQL 可能象下面这样：

SELECT *
FROM sales
         INNER JOIN
         ExpensiveBooks
         ON sales.title_id
         =  ExpensiveBooks.title_id

有关将视图添加到查询的更多信息，请参见添加表。

用查询代替表

可以从查询选择行。例如，假设编写了一个查询，检索合著书（有一个以上作者的书）的书名和标识符。所得到的 SQL 可能象下面这样：

SELECT
     titles.title_id, title, type
FROM
     titleauthor
         INNER JOIN
         titles
         ON titleauthor.title_id
         =  titles.title_id
GROUP BY
     titles.title_id, title, type
HAVING COUNT(*) > 1

然后可以编写另一个建立在该结果上的查询。例如，可以编写一个查询检索合著的心理学书籍。若要编写这个新查询，可以将现有查询用作这个新查询的数据源。所得到的 SQL 可能象下面这样：

SELECT
    title
FROM
    (
    SELECT
        titles.title_id,
        title,
        type
    FROM
        titleauthor
            INNER JOIN
            titles
            ON titleauthor.title_id
            =  titles.title_id
    GROUP BY
        titles.title_id,
        title,
        type
    HAVING COUNT(*) > 1
    )
    co_authored_books
WHERE     type = 'psychology'

加粗的文本表示用作新查询的数据源的现有查询。注意新查询使用了现有查询的别名（"co_authored_books"）。有关别名的更多信息，请参见创建表别名和创建列别名。

同样，查询可以参与 JOIN 操作。例如，通过将 ExpensiveBooks 视图联接到检索合著书籍的查询，可以只查找较贵的合著书籍的销售额。所得到的 SQL 可能象下面这样：

SELECT
    ExpensiveBooks.title
FROM
    ExpensiveBooks
        INNER JOIN
        (
        SELECT
            titles.title_id,
            title,
            type
        FROM
            titleauthor
                INNER JOIN
                titles
                ON titleauthor.title_id
                =  titles.title_id
        GROUP BY
            titles.title_id,
            title,
            type
        HAVING COUNT(*) > 1
        )

有关将查询添加到查询的更多信息，请参见添加表。

使用用户定义函数代替表

在 SQL Server 2000 或更高版本中，可以创建返回表的用户定义函数。这类函数对执行复杂逻辑或过程逻辑很有用。

例如，假设员工表包含一个附加列：employee.manager_emp_id，且存在从 manager_emp_id 到 employee.emp_id 的外键。在员工表的每一行内，manager_emp_id 列显示员工的老板。更确切地说，显示该员工的老板的 emp_id。可以创建用户定义函数以返回这样的表：在具体某个高级管理层内工作的每个员工在表中各占一行。可以调用函数 fn_GetWholeTeam，并设计它获得一个输入变量 — 待检索部门的管理者的 emp_id。

可以编写将 fn_GetWholeTeam 函数用作数据源的查询。所得到的 SQL 可能象下面这样：

SELECT *
FROM
     fn_GetWholeTeam ('VPA30890F')

（"VPA30890F"是待检索部门的管理者 emp_id。）有关将用户定义函数添加到查询的更多信息，请参见添加表。

请参见

用户定义函数 | 查询和视图


对行排序

可以对查询结果内的行进行排序。也就是说，可以命名具体某列或一组列，这（些）列的值决定结果集内行的顺序。下面是可以使用排序的几种方法：

  • 可以按升序或降序排列行 默认情况下，SQL 按升序使用排序列排列行。例如，若要按递增的价格排序书名，只需按价格列对行排序即可。所得到的 SQL 可能象下面这样：
    SELECT *
FROM titles
ORDER BY price

    另一方面，若要排列书名以使较贵的书排在前面，可以显式地指定最贵的排在第一位的顺序。也就是说，指出应按递减的价格列值对结果行排序。所得到的 SQL 可能象下面这样：

    SELECT *
FROM titles
ORDER BY price DESC
  • 可以按多列排序 例如，可以创建每个作者占一行、先按州再按城市排序的结果集。所得到的 SQL 可能象下面这样：
    SELECT *
FROM authors
ORDER BY state, city
  • 可以按未出现在结果集内的列排序 例如，可以创建这样的结果集：最贵的书其书名排在第一位，即使该书的价格没有出现在结果集内也如此。所得到的 SQL 可能象下面这样：
    SELECT title_id, title
FROM titles
ORDER BY price DESC
  • 可以按派生列排序 例如，可以创建每个书名各占一行的结果集，并将单本版税最高的书排在第一位。所得到的 SQL 可能象下面这样：
    SELECT title, price * royalty / 100 as royalty_per_unit
FROM titles
ORDER BY royalty_per_unit DESC

    （用于计算每本书单本所赚版税的公式用粗体表示。）

    若要计算派生列，可以如上例所示使用 SQL 语法，或者可以使用返回标量值的用户定义函数。有关用户定义函数的更多信息，请参见用户定义函数。

  • 可以对成组行排序 例如，可以创建这样的结果集：每行描述一个城市以及该城市内的作者数，并使包含许多作者的城市排在前面。所得到的 SQL 可能象下面这样：
    SELECT city, state, COUNT(*)
FROM authors
GROUP BY city, state
ORDER BY COUNT(*) DESC, state

    （注意该查询将州用作辅助排序列。因此，如果两个州的作者数相同，则这两个州将按字母顺序出现。）

  • 可以使用国际化数据排序 也就是说，可以使用不同于该列的默认规则的排序规则对列进行排序。例如，可以编写一个查询，检索冰岛的小说家 Halldor Laxness 写的所有书。若要按字母顺序显示书名，请使用书名列的 Icelandic 排序序列。所得到的 SQL 可能象下面这样：
    SELECT title
FROM
    authors
    INNER JOIN
        titleauthor
        ON authors.au_id
        =  titleauthor.au_id
        INNER JOIN
            titles
            ON titleauthor.title_id
            =  titles.title_id
WHERE
     au_fname = 'Halldor' AND
     au_lname = 'Laxness'
ORDER BY
     title COLLATE SQL_Icelandic_Pref_CP1_CI_AS

有关对结果行排序的更多信息，请参见对查询结果排序。


查询中的表达式

在查询中任何可使用列名的地方都可以使用表达式。表达式可以计算要显示的值、作为搜索条件的一部分或合并数据列的内容。表达式可以由数学计算或字符串组成，也可以包含列名、字面、运算符及函数的任意组合。

在查询中使用表达式的示例包括：

  • 在 products 表中，显示零售价格降低 10% 后的打折价格。

  • 只显示电话号码的前三位数字——区号。

  • 以 last_name、first_name 的格式显示员工姓名。

  • 联接 orders 表和 products 表，然后对总价格（订单量乘以产品价格）查询进行排序。

  • 在 orders 表中，复制并删除一年以前发货的所有订单。

有关创建和使用表达式的更多信息，请参见下表中列出的主题。

有关信息 | 请参见
创建表达式 | 创建表达式
将表达式输入查询 | 在查询中使用表达式
创建数据汇总 | 汇总和分组
在表达式中使用运算符 | 表达式运算符
在表达式中使用函数 | 表达式函数
在表达式中使用预定义变量 | 表达式预定义变量


参数查询

某些情况下，需要创建可以使用多次但每次使用不同值的查询。例如，可能经常对 titles 表查询以查找某位作者撰写的所有书籍。可以对每次请求运行相同的查询，只是每次使用的作者 ID 或名称不同。

若要创建每次使用不同值的查询，可以在查询中使用参数。参数是在运行查询时提供值的占位符。带参数的 SQL 语句可能如下所示，其中"?"表示作者所在州的参数：

SELECT au_lname, au_fname
FROM state
WHERE state = ?

可使用参数的位置

可以将参数用作字面值（文本值或数值）的占位符。最常见的是，参数经常在搜索条件中作为个别行或组（即 SQL 语句中的 WHERE 或 HAVING 子句）的占位符。

某些数据库允许在表达式中将参数用作占位符。例如，可能想在每次运行查询时，通过提供不同的打折值计算打折价格。为此，可以指定下列表达式：

(price * ?)

有关在何地使用参数的详细信息，请参见参数。

指定未命名参数和命名参数

可以指定两种类型的参数：未命名参数和命名参数。未命名参数是可放在查询中任何位置的问号 (?)，用于提示输入值或以字面值替代。例如，如果在 titles 表中使用未命名参数搜索一个作者的 ID，则 SQL 窗格中所得到的语句可能象下面这样：

SELECT au_lname, au_fname
FROM state
WHERE state = ?

当在查询设计器中运行查询时，定义查询参数对话框将"?"显示为参数名，如下图所示。

或者，也可为参数指定一个名称。命名参数在查询中存在多个参数时很有用。例如，如果在 authors 表中使用命名参数搜索一个作者的姓和名，则 SQL 窗格中所得到的语句可能象下面这样：

SELECT au_id
FROM authors
WHERE au_fname = %first name% AND
  au_lname = %last name%

当在查询设计器中运行查询时，定义查询参数对话框将显示命名参数列表，如下图所示。

请参见

使用命名参数创建查询 | 使用未命名参数创建查询 | 创建通用查询 | 指定参数标记字符 | 支持的查询类型


查询设计器中的汇总和分组行为

当创建聚合查询时，需要应用某些逻辑原则。例如，在汇总查询中不能显示个别行的内容。查询设计器帮助您以关系图和网格窗格的行为方式遵从这些原则。

通过理解聚合查询的原则和查询设计器的行为，可以创建逻辑上正确的聚合查询。将忽略聚合查询只产生汇总信息这一原则。因此，下列多数原则仍描述可以在聚合查询中引用个别数据列的方法。

  • 引用用于输出和排序的列

  • 在搜索条件中引用列

  • 在聚合查询中使用列

引用用于输出和排序的列

下列原则描述如何在聚合查询中引用用于输出和排序的列：

  • 如果在查询的任何地方包括聚合函数，则认为该查询是聚合查询。（该原则不一定适用于子查询，子查询可包括非聚合信息。）

  • 不能在聚合查询中显示个别行的内容；只能显示汇总数据。因此，所有标记为输出的列也必须赋值到聚合函数或 GROUP BY 子句。

  • 在聚合函数中使用的列不能出现在 GROUP BY 子句中。

在搜索条件中引用列

下列原则描述如何在聚合查询的搜索条件中引用列。一般情况下，可使用搜索条件中的某列筛选汇总的行（WHERE 子句）或决定出现在最终输出中的成组结果（HAVING 子句）。

  • 个别数据列可以出现在 WHERE 子句或 HAVING 子句中，具体取决于在查询中的其它地方如何使用它们。

  • WHERE 子句用于选择汇总和分组行的子集，因此要在分组前应用 WHERE 子句。所以，即使数据列不是 GROUP BY 子句的一部分或者不包含在聚合函数中，也可以在 WHERE 子句中使用它。例如，下面的语句选择所有超过 10.00 美元的书并求其平均价格：
    SELECT AVG(price)
FROM titles
WHERE price > 10
  • 如果创建一个搜索条件，而该条件涉及也用于 GROUP BY 子句或聚合函数中的一列，则该搜索条件可以作为 WHERE 子句或 HAVING 子句出现，可以在创建该条件时决定以哪一种形式出现。例如，下面的语句创建每个出版商的书的平均价格，然后为平均价格超过 $10.00 的出版商显示平均值：
    SELECT pub_id, AVG(price)
FROM titles
GROUP BY pub_id
HAVING (AVG(price) > 10)
  • 如果在搜索条件中使用聚合函数，条件将涉及汇总，并且必须是 HAVING 子句的一部分。

在聚合查询中使用列

当使用关系图和网格窗格创建聚合查询时，查询设计器将做某些假定，以使查询坚持前面列出的原则。例如，如果创建聚合查询并将某个数据列标记为输出，则查询设计器自动将该列作为 GROUP BY 子句的一部分，因此在汇总中不能显示个别行的内容。

虽然查询设计器努力防止出现逻辑错误，但也可能创建出不能执行的聚合查询。因此，为避免创建查询时发生错误，一定要理解前面列出的原则。

查询设计器在使用列时遵循下列原则：

  • 当选择"分组"选项或将聚合函数添加到查询中时，所有标记为输出或用于排序的列将自动添加到 GROUP BY 子句中。如果列已经是聚合函数的一部分，则不会自动添加到 GROUP BY 子句中。

    如果不想使某列成为 GROUP BY 子句的一部分，必须在网格窗格的"分组"列中选择不同的选项以手工更改该设置。（然而，查询设计器将不能防止选择会导致查询无法运行的选项。）

  • 如果在网格窗格或 SQL 窗格中手工将查询输出列添加到聚合函数，则查询设计器不能自动从查询中删除其它输出列。因此，必须从查询输出中删除剩余的列，或使它们成为 GROUP BY 子句或聚合函数的一部分。

当向网格窗格的"准则"列中输入搜索条件时，查询设计器遵循下列原则：

  • 如果没有显示网格的"分组"列（因为尚未指定聚合查询），则搜索条件将被放入 WHERE 子句中。

  • 如果已在聚合查询中，并在"分组"列中选定了 Where 选项，则搜索条件将被放入 WHERE 子句中。

  • 如果"分组"列包含 Where 以外的任何值，搜索条件将被放入 HAVING 子句中。

请参见

对表中的行计数 | 对查询结果中的行分组 | 在行组上查询 | 为组指定条件 | 汇总和分组 | 汇总表中所有行的值 | 使用自定义表达式汇总值 | 在同一查询中使用 HAVING 子句和 WHERE 子句


在查询设计器中使用国际化数据

在查询设计器中，可以使用任何语言的数据，也可以使用任何 Windows® 操作系统版本的数据。下面的原则概述可能会注意到的不同之处，并提供有关管理国际化应用程序数据的信息。

注意 有关在 SQL Server 内从 ANSI 到 OEM 字符转换的其它信息，请参见查询设计器注意事项。

网格窗格和 SQL 窗格内的本地化信息

如果使用网格窗格创建查询，可以用符合本机中的 Windows"区域设置"所规定的格式输入信息。例如，如果要搜索数据，可以采用熟悉的格式在"准则"列中输入数据，但下面的情况除外：

  • 不支持长数据格式。

  • 不应在网格窗格中输入货币符号。不过，正确的符号将出现在结果窗格中。

    注意 可以输入 $ 货币符号，但是结果窗格将返回符合本机中的 Windows"区域设置"所规定的货币符号。

  • 一元负号始终出现在左侧（例如 -1），与"区域设置"中的选项无关。

相反，SQL 窗格中的数据和关键字必须始终是 ANSI（美国）格式。例如，查询设计器在生成查询时，会插入 ANSI 格式的所有 SQL 关键字，如 SELECT 和 FROM。如果将元素添加到 SQL 窗格内的语句中，则一定要使用这些元素的 ANSI 标准格式。

当使用网格窗格中特有的格式输入数据时，查询设计器自动将其转换为 SQL 窗格中的 ANSI 格式。例如，如果"区域设置"被设置为"德语（标准）"，则可以在网格窗格中以"31.12.96"的格式输入数据。不过，该日期将以 ANSI datetime 格式（如 { ts '1996-12-31 00:00:00' }）出现在 SQL 窗格中。如果直接在 SQL 窗格中输入数据，则必须以 ANSI 格式输入。

排序次序

查询中数据的排序次序由数据库决定。Windows"区域设置"对话框中设置的选项不影响查询的排序次序。但是，在任何特定的查询中，可以请求以特定的顺序返回行。有关更多信息，请参见对行排序。

使用双字节字符

可以输入用于文字和数据库对象名称（如表和视图名称或别名）的 DBCS 字符。也可以在参数名和参数标记字符中使用 DBCS 字符。但是，不能在 SQL 语言元素（如函数名或 SQL 关键字）中使用 DBCS 字符。


开发数据库结构

数据库设计器提供帮助创建和维护数据库结构的工具。表设计器则将整个窗口都用于个别表的设计。有关数据库和表结构的更多信息，请参见数据库开发和可视化数据库工具。

有关数据库结构开发中的特定步骤的详细信息，请参见下列主题：

  • 使用数据库

  • 使用表

  • 使用列

  • 使用键

  • 使用关系

  • 使用索引

  • 使用约束

  • 使用脚本


使用数据库

数据库设计器提供帮助更改数据库的工具。可以对在数据库关系图中对数据库所做更改的保存时间和保存方式进行控制。通过在数据库关系图中标记已更改和未更改的对象，或通过只保存对选定表的更改，以及放弃不需要的更改等方法，对这些更改进行控制。还可以使用 SQL 更改脚本跟踪、放弃、推迟和应用未保存的更改。

若要 | 请参见
保存在数据库关系图上所做的更改 | 保存整个数据库关系图
保存在关系图中的选定表上所做的更改 | 保存关系图中的选定表
保存表设计器中的工作 | 保存表设计器中的工作
不保存更改即返回到数据库关系图的前一个版本 | 放弃修改
确保数据库对象有唯一名称 | 唯一命名数据库对象


保存关系图中选定的表

如果不想保存在数据库关系图中所做的全部更改，可以保存特定的表或一组表。

保存选定的表

  1. 在数据库关系图中，选择要保存的表。

  2. 右击其中一个选定的表，然后选择"保存选择"命令。

  3. 当保存所做的选择时，"保存"对话框显示在数据库中将被更新的表的列表。
    在继续之前，如果要在工程目录下以文本文件形式保存表的列表，选择"保存文本文件"命令。当一个消息框显示出已保存的文本文件名时，选择"确定"按钮。

  4. 在"保存"对话框中，确认表的列表并选择"是"按钮保存这些表。

注意 表的列表中可能包括选定表以外的表。例如，如果更改列的数据类型，而该列与另一个表有关系，则两个表都将包括在该列表中。

请参见

保存更改脚本


保存整个数据库关系图

通过保存数据库关系图，可以保存对它所做的全部更改，包括对表、列和其它数据库对象所做的任何更改。

保存数据库关系图

  1. 在数据库关系图内右击，然后单击"保存"命令。

  2. 如果关系图是以前从未保存过的新关系图，将出现"另存为"对话框。键入关系图名称。
    如果对现有关系图中的表做了更改，则在保存关系图时，将出现"保存"对话框并显示将在数据库中保存的更改列表。

  3. 单击"是"按钮更新数据库使之与关系图相匹配。

请参见

保存更改脚本


保存表设计器中的工作

可以保存在表设计器中对表所做的全部更改。

保存表

  1. 单击工具栏上的"保存"按钮。

    如果对表做了更改，则在保存关系图时，将出现"保存"对话框并显示将在数据库中保存的更改列表。

    注意 表的列表可能包含已修改表以外的表。例如，如果更改列的数据类型，而该列与另一个表有关系，则两个表都将包括在该列表中。

  2. 单击"是"按钮更新数据库。

请参见

保存更改脚本


放弃在数据库设计器或表设计器中所做的更改

如果不想在数据库中保存更改，可以放弃在数据库关系图中所做的更改。

放弃未完成的修改

  1. 关闭数据库关系图或表设计窗口。

  2. 出现一个消息框，提示保存更改。选择"否"按钮。

注意 如果有其它连接到同一数据库的打开的数据库关系图或表设计窗口，以此种方式放弃的修改将仍保留在本地内存中。若要从内存中删除这些未完成的修改，必须关闭所有连接到同一数据库的数据库关系图和表设计窗口。有关更多信息，请参见数据库关系图窗口和表设计窗口间的交互。


使数据库关系图与已修改的数据库相协调

当准备更新数据库使之与关系图相匹配时，保存数据库关系图。但如果其他用户自您打开关系图后更新了数据库，他们的更改可能会影响您的关系图，反之亦然。在此种情况下，保存关系图时将自动进行下列操作：

  • 重新创建在关系图中引用的但被另一用户删除的数据库对象。

  • 保留添加到表中的触发器；不保留从表中删除的触发器。

  • 删除已从关系图中删除的对象，即使该对象由其他用户编辑过。

保存关系图时，将覆盖其他用户的更改以使数据库与关系图相匹配，从而使数据库与关系图相协调。

使关系图与已修改的数据库相协调

  1. 保存数据库关系图。
    如果以前没有保存过关系图，在"保存新数据库关系图"对话框中键入关系图名称并选择"确定"按钮。

  2. "保存"对话框中列出保存关系图时将受到影响的表。选择"是"按钮继续。

  3. 发现数据库更改对话框列出已修改的对象和将被更改以与关系图相匹配的对象。选择"是"按钮保存关系图并接受更改列表。

注意 如果关系图包含已从数据库中删除的表和列，则保存关系图时，在数据库中只重新创建这些表和列的定义。此过程不恢复在删除前存在于这些对象内的任何数据。

请参见

多用户环境


使用表

可视化数据库工具帮助更改数据库。可以对在数据库关系图中对数据库所做更改的保存时间和保存方式进行控制。通过在数据库关系图中标记已更改和未更改的对象，或通过只保存对选定表的更改，以及放弃不需要的更改等方法，对这些更改进行控制。也可以使用 SQL 更改脚本跟踪、废弃和应用未保存的更改。

若要 | 请参见
添加表 | 添加表
从关系图中删除表 | 从数据库关系图中删除表
从数据库中删除表 | 从数据库关系图和数据库中删除表
重命名表 | 重命名表
复制表 | 复制表
将表复制到另一个关系图 | 在数据库关系图间复制表
更改表出现在关系图中的方式 | 在数据库关系图中更改表视图
更改出现在关系图中的每列属性 | 更改所显示的属性
将列移动到另一个表 | 将列从一个表移动到另一个表
调整每列属性列的大小 | 调整属性列的大小


添加表

可以将表添加到数据库关系图，对其结构进行编辑或使其与关系图中的其它表相关。既可以将现有数据库表添加到关系图，也可以插入尚未在数据库中定义过的新表。或者，可以使用表设计器创建表或修改现有表。

  • 使用表设计器创建新表

  • 将新表插入到关系图

  • 将现有表添加到关系图

  • 将相关表添加到关系图

使用表设计器创建新表

通过使用表设计器，可以在不打开数据库关系图的情况下在数据库内创建新表。

使用表设计器创建新表

  1. 确保已连接到要在其中创建表的数据库。右击目标数据库的表节点并选择"新建表"命令。

  2. 添加列以及表的其它详细信息。

注意 对于所添加的每一列，都有新行出现在表设计器的上半部分。在该行内，可以编辑列的基本属性。可以在表设计器的下半部分编辑列的其它属性。只需单击表设计器上半部分内的某行，然后添加或编辑出现在下半部分内的属性值。

插入新表

将新表添加到数据库关系图意味着正在定义数据库中尚不存在的新表。若要创建新表，必须定义构成表的个别列。当保存表或关系图时，表即创建在数据库中。

将新表插入到关系图

  1. 确保已连接到要在其中创建表的数据库。

若要在当前关系图中创建表，请单击工具栏上的"新建表"按钮 [image] 。

–或–

在关系图中右击，并选择"新建表"命令。

  2. 在选择名称对话框中修改或接受系统分配的表名，然后选择"确定"按钮。
    新表出现在"标准"视图的关系图中。

  3. 在新表的第一个单元中，键入列名。然后按 TAB 键以移到下一个单元。

  4. 在"数据类型"下，为列选择数据类型。每列都必须有名称和数据类型。
    通过使用"列"属性页，可以设置列的其它属性，如小数位数。有关详细信息，请参见设置列属性。

  5. 对要添加到表的每一列重复步骤 3 和 4。

当保存数据库关系图时，新表即添加到数据库中。

注意 如果创建了一个新表，然后将其从关系图中删除并保存到数据库中，则该表名将在内存中一直保留到关闭数据库关系图时。同样，如果从数据库中删除某个现有表，则该表名仍保留在内存中。若要再次使用该表名，请关闭并重新启动数据库设计器。

添加现有表

添加现有表意味着想使其出现在关系图中的表已存在于数据库中。如果将一组表添加到关系图，则表之间存在的任何关系也将添加到关系图。

将现有表添加到关系图

  1. 打开数据库关系图。

  2. 在关系图内右击，然后选择"添加表..."命令。

  3. 在"添加表"对话框中，单击表，然后单击"添加"按钮。或者，可以双击要添加的任何表，然后关闭该对话框。

  4. 单击"关闭"按钮关闭"添加表"对话框。

在关系图中，如果选定表和其它表之间存在关系，则将自动绘制出关系线。

当将表添加到关系图时，表的定义（而非存储在表中的数据）将从数据库加载到内存中。这时可以编辑表的定义。例如，可以添加新列或修改表的索引、键、关系或约束。

添加相关表

对于带现有外键约束的表，可以很容易地将相关表添加到数据库关系图。

将相关表添加到关系图

  1. 在数据库关系图中，选择一个或多个带外键约束的表。

  2. 右击任何选定表，并选择"添加相关表"命令。

由选定表的外键约束引用的表以及引用带外键约束的选定表的那些表均被添加到关系图。

请参见

在数据库关系图间复制表 | 从数据库关系图和数据库中删除表 | 从数据库关系图中删除表 | 重命名表 | 表


从数据库关系图中删除表

可以从数据库关系图中删除表。删除表并不改变数据库。表及其与其它表的关系仍继续存在于数据库中。

如果删除已由您或其他用户修改过的表，则会出现一条信息，提示在删除表之前先保存更改：

  • 如果在删除表之前保存了更改，则数据库将由所做的更改更新。

  • 如果删除表之前放弃对表的更改，则该表即使不再出现在关系图中，仍按修改过的状态保留在内存中，直到保存该表或关闭最后打开的数据库关系图为止。有关更多信息，请参见数据库关系图窗口和表设计窗口间的交互。

从数据库关系图中删除表

  1. 在数据库关系图中，选择要删除的表。

  2. 右击该表，并从快捷菜单中选择"从关系图中删除表"命令。

    如果该表包含对数据库关系图进行编辑所产生的未保存更改，将出现一条信息，提示在删除该表之前先保存更改。

该表从关系图中被删除，但仍继续存在于数据库中。

请参见

数据库设计器 | 从数据库关系图和数据库中删除表 | 表


从数据库关系图和数据库中删除表

当要进行下列操作时，从数据库关系图中删除表：

  • 从关系图中删除表。

  • 删除所有其它关系图中出现的表。

  • 标记出要从数据库中删除的表。

当保存关系图时，将从数据库中永久删除被标记为要删除的表。对表的引用继续存在于内存中，直到保存关系图为止。如果不保存关系图而将其关闭，则表将继续存在于数据库中，并出现在当前的关系图中，以及该表在被标记为要删除之前所在的每个其它关系图中。

从数据库中删除表

  1. 在数据库关系图中，选择要删除的表。

  2. 右击该表，并从快捷菜单中选择"从数据库中删除表"命令。

  3. 出现一个消息框，提示确认删除。选择"是"按钮。

注意 自动删除表将删除与表的任何关系。

请参见

将表添加到数据库关系图 | 数据库设计器 | 从数据库关系图中删除表 | 表


重命名表

当重命名表时，表名在包含该表的各数据库关系图中自动更新。当保存表或关系图时，表名在数据库中被更新。

注意 在重命名表之前需慎重考虑。如果现有查询、视图、用户定义函数、存储过程或程序引用该表，则更改表名将使这些对象无效。

重命名表

  1. 在数据库关系图中，选择要重命名的表。

  2. 右击该表，并从快捷菜单中选择"属性页"命令。

  3. 选择"表"选项卡。

  4. 在"表名"框中，键入一个新名称。确保选择的名称与"选定表"列表中的名称不重复。
    若要取消该操作，请在退出该字段前按 ESC 键。

  5. 单击"关闭"按钮。

一退出"表名"框，该表即在关系图中被重命名。

请参见

表


复制表

一个表只能在一个数据库关系图中出现一次。但是，如果要创建一个新表，该表包含部分或全部与关系图中的现有表相同的列，则在创建新表时，可以首先复制现有表。之后，可以在新表中删除不想要的列、添加新列和分配唯一表名。

注意 该操作只复制表的结构，不复制表中的任何行。

使用与在数据库关系图间复制表时相同的技术。

复制表

在要复制表的数据库关系图中右击关系图，并从快捷菜单中选择"新建表"命令。
-或-
在数据库关系图工具栏上单击"新建表"按钮 [image] 。

  • 在选择名称对话框中，接受或更改系统分配的新表名并单击"确定"按钮。
    一个空白表即添加到关系图。

  • 在要复制的表中，选择所有列。该表可以在同一关系图中，也可在同一数据库中的不同关系图中，或在不同数据库中的关系图中。

  • 将各列复制到空白表。有关复制列的详细信息，请参见将列从一个表复制到另一个表。

请参见

表


在数据库关系图间复制表

可以将一个表从一个数据库关系图复制到同一数据库中的另一关系图。

将一个表从一个数据库关系图复制到另一关系图时，只是在第二个关系图中添加对该表的引用，并不是在数据库中复制该表。例如，如果将 authors 表从一个数据库关系图复制到另一关系图，每个关系图在数据库中引用同一个 authors 表。

从另一个数据库关系图复制表

  1. 确保已连接到要对其中的表进行复制的数据库。

  2. 打开源数据库关系图和目标数据库关系图，在源关系图内选择要复制到目标关系图的表。

  3. 单击工具栏上的"复制"按钮。该操作将选定的表定义放到剪贴板上。

  4. 切换到目标关系图。该关系图必须与源关系图在同一数据库内。

  5. 单击工具栏上的"粘贴"按钮。剪贴板上的内容出现在新位置上并保持突出显示，直到单击其它位置为止。如果选定的表和目标关系图中的其它表之间存在关系，则自动绘制出关系线。

当在两个关系图的任意一个中编辑表时，所做的更改将反映在这两个关系图中。同样，一旦在两个关系图的任意一个中保存表，该表在这两个关系图中均不再被认为是"已修改"。有关更多信息，请参见表关系图和表设计器窗口间的交互。

请参见

将表添加到数据库关系图 | 数据库设计器 | 复制表 | 表


在数据库关系图中更改表视图

当只使用数据库关系图中的几个表时，尽可能多地查看列信息通常很有用。这样的视图不仅提供更多信息，而且也使您能够编辑列定义。

但是，当使用很多表时，只查看列名或只查看表名通常更可取，这使您能够同时在关系图中看到更多的表。

在数据库关系图中，可以根据需要展开要编辑的表，然后将它们重新折叠起来以节省关系图上的空间。

数据库关系图中的每个表都可以显示在下列五个视图的任何一个中。

标准 [image] 显示表的每一个数据库列，但只显示每个数据库列的列名和其它基本属性。可以通过直接在单元中键入，或者用"剪切"、"复制"和"粘贴"命令来编辑列属性。也可以移动和删除整个数据库列定义。
新表被插入到关系图时即显示在该视图中，使您可以开始定义各列。

列名称 [image] 只显示每个数据库列的名称。可以在该视图中重命名数据库列。现有表被添加到关系图时即显示在该视图中。

键 [image] 只显示表的某些列名。显示有名称的列是那些参与主键、外键或唯一约束的列。可以在该视图中重命名某些数据库列。

只显示名称 [image] 只显示表名。

自定义 [image] 显示表的所有数据库列，但只显示选择的属性。这为只显示所需要的信息提供了很大的灵活性。该视图对打印数据库关系图也很有用，因为可以在一页上显示更多的表，而且通常情况下看不到这些表上的水平滚动条。

自定义视图的默认属性集包括列名、简洁数据类型和可为空值。

属性 | 设置
Column Name | 表中的字段名。
Condensed Datatype | 字段的数据类型信息，与 SQL Create Table 语句的格式一样。例如，一个包含可变长度字符串（最大长度为 20 个字符）的字段将表示为 varchar(20)。
Nullable | 空（字段可包含空值）或非空（字段必须包含非空值）。

更改表视图

  1. 在数据库关系图中，选择要在另一个视图中查看的表。若要更改所有表的视图，请在关系图中右击并选择"全选"命令。

  2. 右击表，并从快捷菜单中选择想要的视图。

完成对表的编辑后，可以将表更改为不同的视图，或调整表的大小以在关系图上留出更多空间。

修改自定义视图

  1. 在数据库关系图中，右击要在自定义视图中查看的表。

  2. 从快捷菜单中选择"表视图..."，然后选择"修改自定义视图"。列选择对话框出现。

  3. 用箭头将想要的列从"可用列"框移到"选定列"框。

    注意 若要添加列，请在"可用列"框突出显示该列并单击">"按钮。该列即在"选定列"框中列出。若要显示所有的列，请单击">>"按钮。若要从"选定列"框中删除列，请突出显示该列并单击"<"按钮。

  4. 列将按在"选定列"框中显示的顺序出现在表中。使用"排序"箭头将"选定列"框中的列重新排列为想要的顺序。

  5. 若要使该设置成为默认的自定义视图，请选择"按默认值另存"框。

    注意 如果没有选择"按默认值另存"框，则对于当前关系图上的自定义视图中出现的所有数据库表，将显示"选定列"框中列出的列。但不保存该设置，也不在选择"自定义视图"命令时对其它关系图应用该设置。

  6. 单击"确定"按钮。

选定表被重新绘制以显示在对话框中选择的列。

请参见

表


更改所显示的属性

当在标准视图中显示数据库表时，表的某些但不是全部属性列是可视的。可以通过选择是否隐藏或显示数据库表中的各属性列，对标准视图进行自定义。

注意 当更改所显示的属性时，只是更改在特定关系图上所显示的特定表属性。

隐藏属性列

  1. 在数据库关系图中，选择要隐藏属性列的表。

将指针定位在要隐藏列的列标右边框上。光标由箭头变为拆分器指针 [image] 。

  2. 向左拖动列边框直到与列的左边框重合。

  3. 松开鼠标按钮。

显示隐藏的属性列

  1. 在数据库关系图中，选择要显示属性列的表。

  2. 将指针定位在刚才那列的列标右边框上。光标由箭头变为拆分器指针。

  3. 双击拆分器指针。调整隐藏的列以适合最宽的输入项。

注意 也可以通过使用自定义视图，设置要在数据库关系图中显示的数据库表的列属性。有关该视图的信息，请参见更改表视图。

请参见

列属性 | 调整属性列的大小


将列从一个表移动到另一个表

可以将列从一个表移动到同一数据库关系图中或不同关系图中的另一个表。在数据库关系图中移动列只是移动列定义。数据本身并不作为该过程的一部分自动传输到另一个表。

提示 若要将列定义与列数据一起移动，可以与数据库设计器一起使用查询设计器。有关查询设计器的信息，请参见设计查询。

将不含数据的列从一个表移动到另一个表

  1. 在数据库关系图中，选择要移动的列。

  2. 单击工具栏上的"剪切"按钮。该操作从表中删除选定内容，并将该列及其当前属性集一起放在剪贴板上。

  3. 在新表中将光标定位到要插入列的位置。

  4. 单击工具栏上的"粘贴"按钮。列被插入到新位置并保持突出显示，直到单击其它位置为止。

将含有数据的列从一个表移动到另一个表

  1. 在数据库关系图中，选择要移动的列。

  2. 单击工具栏上的"复制"按钮。该操作将选定的列及其当前属性集一起放在剪贴板上。

  3. 在新表中将光标定位到要插入列的位置。

  4. 单击工具栏上的"粘贴"按钮。列被插入到新位置并保持突出显示，直到单击其它位置为止。

  5. 运行更新查询，将数据添加到已复制了列的表中。有关详细信息，请参见创建更新查询。

  6. 返回到数据库关系图并删除原始表中的列。有关详细信息，请参见从表中删除列。

请参见

表


调整属性列的大小

通过在标准视图中调整数据库表的属性列大小，可以手工更改属性列的宽度。例如，如果 Datatype 列包含的用户定义数据类型名称太长，以至看不到整个名称时，可以增加 Datatype 列的宽度。也可以自动调整属性列的大小以适合最宽的输入项。

手动更改属性列的宽度

  1. 在数据库关系图或表设计器中，选择要调整属性列大小的表。

将指针定位到要调整大小的列的列标右边框上。光标由箭头变为拆分器指针 [image] 。

  2. 向左拖动列边框以缩小列宽，或向右拖动列边框以增加列宽。

  3. 松开鼠标按钮。

调整属性列的大小以适合最宽的输入项

  1. 在数据库关系图中，选择要调整列大小的表。

  2. 将指针定位到要调整大小的列的列标右边框上。光标由箭头变为拆分器指针。

  3. 双击拆分器指针。

注意 对于选择要在自定义视图中显示的任何列，也可以在自定义视图中调整其属性列的大小。

请参见

更改所显示的属性 | 列属性


使用列

可以在数据库关系图或表设计器中直接编辑表的列属性。

若要 | 请参见
将新的列定义添加到表的尾部 | 将列插入到表
将列定义从一个表复制到同一关系图中的另一个表，或复制到不同关系图中的另一个表 | 将列从一个表复制到另一个表
将列定义从一个表移动到同一个关系图中的另一个表，或移动到不同关系图中的另一个表 | 将列从一个表移动到另一个表
从表和数据库中删除列 | 从表中删除列
设置或编辑数据库表的列定义（属性） | 列属性


将列插入到表

可以将新的列定义添加到表，以捕获没有存储在现有列中的附加数据。在显示表及其所有当前定义列的标准视图中，提供有空白的网格行，因此可以很容易地将新的列定义添加到数据库表。

将列从数据库关系图插入到表

  1. 在数据库关系图中，选择要添加新列的表。

  2. 如果该表尚未在标准视图中，右击该表并从快捷菜单中选择"标准"命令。

  3. 在表中的行上右击，并从快捷菜单中选择"插入列"命令。一个空白列行即插入到选定行的上方。
    -或-
    将光标放在"列名"列的第一个空白单元中。

  4. 在"列名"列的该单元中键入列名。列名是必需值。

  5. 按 TAB 键以转到 Datatype 单元。这是必需值。

创建新列时将添加数据库的默认值。根据需要定义列的其它属性。可以随时根据数据库的规则更改这些值和设置附加属性。

将列从表设计器插入到表

  1. 为要添加列的表打开表设计器。

  2. 在表中的行上右击，并从快捷菜单中选择"插入列"命令。将插入一个空白列行。
    -或-
    将光标放在"列名"列的第一个空白单元中。

  3. 在"列名"列的该单元中键入列名。列名是必需值。

  4. 按 TAB 键以转到 Datatype 单元。这是必需值。

创建新列时将添加数据库的默认值。根据需要定义列的其它属性。若要定义任何基本属性，请在网格中输入属性值。若要定义任何其它属性，请突出显示描述特定数据库列的网格行，然后在网格下出现的选项卡上的适当控件中输入属性值。

请参见

设置列属性 | 表


将列从一个表复制到另一个表

可以将列从一个表复制到同一关系图中或不同关系图中的另一个表。复制列仅涉及列定义。数据本身并不作为该过程的一部分自动传输到另一个表。

提示 可以使用数据库查询将列的数据从原始列复制到新列。使用查询设计器运行更新查询，将数据添加到已复制了列的表中。有关详细信息，请参见创建更新查询。有关查询设计器的信息，请参见设计查询。

将列从一个表复制到另一个表

  1. 在数据库关系图中，选择要复制的列。

  2. 单击工具栏上的"复制"按钮。该操作将复制表中的选定内容并将列及其当前属性集一起放到剪贴板上。

  3. 将光标定位在表中要插入列的位置。

  4. 单击工具栏上的"粘贴"按钮。该列及其属性即插入到新位置。

当将含有用户定义数据类型的数据库列从一个数据库复制到另一个数据库时，在目的数据库中可能不能使用用户定义数据类型。在这种情况下，将为该列分配与数据库中的可用基础数据类型最匹配的数据类型。

请参见

复制表 | 表


从表中删除列

从表中删除不再用于存储数据的列。当从数据库关系图的表中删除列时，将从数据库中删除该列及其包含的全部数据。

注意 一旦保存数据库关系图或表，就不能撤消该操作。恢复删除列的唯一方法是不保存更改即关闭表或数据库关系图。

从表中删除列

  1. 在表或数据库关系图中，选择要删除的列。

  2. 右击该列，并从快捷菜单中选择"删除列"命令。

  3. 如果该列参与了关系，将出现一条消息提示确认删除选定列及其关系。选择"确定"按钮。

如果该列没有参与 CHECK 约束，则该列及附加到该列的所有约束、该列所参与的所有关系及其包含的所有数据都将被从数据库和关系图中删除。它们将在保存表或数据库关系图时从数据库中被删除。如果列确实参与了 CHECK 约束，当保存工作时，数据库服务器将拒绝所做的修改。也就是说，提交操作将失败。若要删除参与 CHECK 约束的列，必须在删除该列之前修改或删除 CHECK 约束。

请参见

从数据库关系图和数据库中删除表 | 将列插入到表 | 表


设置列属性

可以设置或修改列属性。

在数据库关系图中设置列属性

  1. 在数据库关系图中，选择要定义列属性的表。

  2. 右击该表，并从快捷菜单中选择"属性"命令。

  3. 选择"列"选项卡。

  4. 修改要更改的每个属性的值或设置。

  5. 单击"关闭"按钮以关闭属性页。

一旦按下 TAB 键或在"属性"对话框的单元格外单击，数据库关系图中的新设置立即生效。当保存表或关系图时，新设置即保存在数据库中。

注意 如果列属性在数据库关系图中是可视的，则可以直接编辑属性值，而不必打开属性页。有关控制关系图中的可视列属性的信息，请参见在数据库关系图中更改表视图。

在表设计器中设置列属性

  1. 为包含要修改列属性的表打开表设计器。

  2. 若要设置基本属性，请单击要修改的数据库列属性的网格单元，然后输入值。
    -或-
    若要设置其它属性，请选择描述要修改的数据库列的网格行，然后在该网格下的选项卡中修改属性。

一旦按下 TAB 键或在编辑的网格单元或控件外单击时，数据库关系图中的新设置立即生效。当保存表或关系图时，新设置即保存在数据库中。

请参见

列属性


重命名列

在数据库关系图上，表中所显示的列名与列存储在数据库中时的名称一样。可以在数据库关系图的表中直接重命名列，当保存表或关系图时将用新名称对数据库进行更新。

列名按其在关系图中出现时的大小写格式存储。

注意 重命名列可能会影响触发器、存储过程和约束在创建这些其它对象时，要考虑重命名列。有关这些数据库对象的更多信息，请参见数据库对象。

重命名列

  1. 在数据库关系图中，选择要重命名列的表。

  2. 如果数据库关系图中只显示表名，则右击该表，并从快捷菜单中选择"标准"、"列名"或"键"命令。

  3. 在显示要更改的列名的单元中，键入新列名。

一旦退出显示列名的单元，表或数据库关系图中的列立即被重命名。当保存该关系图或表时，列即在数据库中被重命名。

请参见

列属性 | 数据库对象名的唯一性


使用关系

关系是表行之间的一种关联。有关关系的概述，请参见表关系。

有关使用关系的详细信息，请参见下列主题：

若要 | 请参见
在数据库关系图中创建数据库表间的关系 | 创建表间的关系
确保在外键列中输入的值与相关主键列中的现有值相匹配 | 强制表间的引用完整性
将表中的一列与同一表中的另一列链接起来 | 绘制单个表自反关系
创建多对多关系 | 将多对多关系映射到数据库关系图
更改关系的名称 | 重命名关系
删除两个表间的关系 | 删除关系
禁用外键约束 | 对 INSERT 和 UPDATE 语句禁用外键约束和对复制禁用外键约束


创建表间的关系

要使一个表中的行与另一个表中的行关联时，可创建两个表间的关系。有关关系的更多背景信息，请参见表关系。

在数据库关系图中创建关系

在数据库关系图中，单击要与另一个表的列相关的数据库列或列组合的行选择器 [image] 。

  1. 当指针定位到行选择器上时，单击并拖动到相关表。

  2. 松开鼠标按钮。创建关系对话框出现，该对话框尝试将选定列与相关表中具有相同名称和数据类型的列进行匹配。

  3. 在"创建关系"对话框中，确认将要创建关系的列显示在"主表"和"外键表"列表中。

  4. 选择"确定"按钮创建关系。

在关系图上，关系的主键方由一个钥匙 [image] 符号表示。在一对一关系中，发起关系的表决定主键方。例如，如果所创建的关系是从 publishers 表的 pub_id 列到 pub_info 表的 pub_id 列，则 publishers 表为关系的主键方。

在表设计器中创建关系

  1. 为将作为关系外键方的表打开表设计器。

  2. 在表设计器中右击并选择"关系"命令。

  3. 单击"新建"按钮。

  4. 从"主表"的下拉列表中，选择将作为关系主键方的表。在下面的网格中输入分配给该表主键的列。在每列左边相邻的网格单元中输入外键表的相应外键列。
    表设计器会建议一个关系名。若要更改这个名称，请编辑"关系名"文本框的内容。

  5. 选择"关闭"按钮以创建关系。

  6. 有关更多详细信息，请参见关系属性页。

请参见

定义主键 | 删除关系 | 将多对多关系映射到数据库关系图| 重命名关系 |表关系


强制表间的引用完整性

在数据库关系图中创建关系时，默认情况下强制表间的引用完整性。强制关系确保在外键列中输入的每个值与相关主键列中的现有值相匹配。

通过编辑关系属性，可更改强制引用完整性的条件。

更改新关系的引用完整性选项

  1. 在数据库关系图中创建关系。有关详细信息，请参见创建表间的关系。

  2. 在"创建关系"对话框中，清除或选择一个或多个选项。

    有关 SQL Server 数据库可用选项的信息，请参见对 SQL Server 数据库使用数据库设计器时的注意事项。

更改现有关系的引用完整性选项

  1. 在数据库关系图中选择关系线。

  2. 右击关系线并选择"属性"命令。

  3. 选择"关系"选项卡。

  4. 从"选定的关系"列表中选择关系。

  5. 清除或者选择一个或多个选项。

    有关 SQL Server 数据库可用选项的信息，请参见对 SQL Server 数据库使用数据库设计器时的注意事项。

当保存关系图或两个相关表中的任何一个时，关系即在数据库内被更新。

请参见

FOREIGN KEY 约束 | 主键约束 | 表关系 | 唯一约束


绘制自反关系

可创建自反关系将表中的列与同一表中的其它列链接起来。例如，假设 employee 表中有 emp_id 列和 mgr_id 列。每个经理同时也是员工，因此可通过绘制从该表到自身的关系线使这两列相关。这种关系确保添加到该表中的每个经理 ID 与现有的员工 ID 相匹配。

创建关系前，必须先为表定义主键或唯一约束。然后使主键列与匹配的列相关。一旦创建了关系，匹配的列便成为表的外键。

绘制自反关系

  1. 在数据库关系图中，单击要与其它列相关的数据库列的行选择器。

  2. 当指针定位到行选择器上时，将指针拖动到表外直到出现联接线。

  3. 将联接线拖回到选定的表。

  4. 松开鼠标按钮。创建关系对话框出现，该对话框尝试将主键列与将联接线拖动到其上的非键列进行匹配。

  5. 确认要相关的列显示在"主表"和"外键表"列表中。

  6. 选择"确定"按钮以创建关系。

当对表运行查询时，可使用自反关系创建自联接。有关用联接查询表的信息，请参见组合表。

请参见

表关系


删除关系

当不想再使两个相关表中的列相关时，可删除它们之间的关系。在重新设计表时，通常必须先删除关系，然后在完成新设计后再重新创建关系。例如，如果决定对数据库进行规范化并将所有的地址数据存储在一个表中，则首先要删除现有表之间与 address 列的所有关系，创建包含 address 列的新表，然后在新的 address 表和每个需要地址数据的表之间创建关系。

删除关系

  1. 在数据库关系图中，选择表示要从关系图中删除的关系的联接线。

  2. 右击关系线，并从快捷菜单中选择"从数据库中删除关系"命令。

  3. 出现一个消息框，提示确认删除。选择"是"按钮。

    -或-

  4. 在数据库关系图中的任一表上右击或在表设计器内右击，然后从快捷菜单中选择"关系"命令。

  5. 从"选定的关系"下拉列表中选择关系。

  6. 单击"删除"按钮。

注意 当删除关系时，将删除所有关系图中出现的关系线。当保存关系图或保存两个相关表中的任何一个时，关系将从数据库中被删除。

请参见

创建表间的关系 | 表关系


重命名关系

可重命名关系。当重命名关系时，关系名将在当前关系图和包含该关系名的任何其它关系图中自动更新。

重命名关系

  1. 在数据库关系图中，选择表示要重命名的关系的联接线。

  2. 右击关系线并选择"属性"命令。

  3. 选择"关系"选项卡。

  4. 在"关系名"框中键入新名。

退出"关系名"框后，关系即在关系图和关系所出现的任何其它关系图中重命名；当保存两个相关表中的任何一个或保存关系图时，关系将在数据库中重命名。

请参见

表关系


创建 CHECK 约束时检查现有数据

当创建关系时，如果需要对现有数据以及新数据应用外键约束，则选择该选项以检查现有数据。

创建 CHECK 约束时检查现有数据

  1. 在数据库关系图中选择附加了外键约束的表。

  2. 右击表并选择"属性"命令。

  3. 选择"关系"选项卡。

  4. 从"选定的关系"列表中选择关系。

  5. 选择"创建中检查现存数据"复选框。

保存表或关系图时将应用外键约束。如果在保存过程中遇到任何违反约束的行为，则不能保存表。

请参见

CHECK 约束 | 约束 | 创建关系


将多对多关系映射到数据库关系图

多对多关系可将一个表中的每一行与另一表中的许多行相关，反之亦然。例如，可在 authors 表和 titles 表间创建多对多关系，使每个作者与其写的每本书进行匹配，并使每本书与其所有作者进行匹配。从两个表中的任何一个创建一对多关系均将错误地表示每本书只能有一个作者，或者每个作者只能写一本书。

在数据库中，容纳表间的多对多关系是依靠连接表实现的。连接表包含要相关的两个表的主键列。然后，从两个相关表的主键列分别创建与连接表中的匹配列的关系。在 pubs 数据库中 titleauthor 表是连接表。

在表间创建多对多关系

  1. 在数据库关系图中添加要创建多对多关系的表。

  2. 右击关系图，并从快捷菜单中选择"新建表"命令以创建第三个表。该表将成为连接表。有关详细信息，请参见将表添加到数据库关系图。

  3. 在选择名称对话框中更改系统分配的表名。例如，titles 表和 authors 表之间的连接表现在被命名为 titleauthors。有关详细信息，请参见重命名表。

  4. 将主键列从其它两个相关表分别复制到连接表。与任何其它表一样，在连接表中也可以添加其它列。有关详细信息，请参见将列从一个表复制到另一个表。

  5. 在连接表中，设置主键以包括其它两个表中的主键列。有关详细信息，请参见定义主键。

  6. 分别在两个主表和连接表间定义一对多关系。连接表应是所创建关系的"多"方。有关详细信息，请参见创建表间的关系。

注意 在数据库关系图中创建连接表时，不会从相关表中将数据插入连接表。有关将数据插入表的更多信息，请参见创建 INSERT FROM 查询。

请参见

表关系


使用索引

索引是提供快速访问表行或强制某些约束的机制。有关索引的概述，请参见索引。

有关使用索引的详细信息，请参见下列主题：

若要 | 请参见
创建索引 | 创建索引
创建索引视图 | 创建索引视图
创建唯一索引 | 创建唯一索引
创建聚集索引 | 创建聚集索引
重命名索引 | 重命名索引
删除索引 | 删除索引
保存、显示和更新索引定义 | 保存、显示和更新索引定义
为索引指定填充因子 | 为索引指定填充因子


创建索引

在数据库表中，可以使用索引加快访问数据的速度。通过在要执行搜索的表中选择一列或多列来创建索引。一旦保存表后，即可使用索引。

创建索引

  1. 在数据库关系图中选择要创建索引的表，右击该表，然后从快捷菜单中选择"索引/键"命令。

    -或-

    为要创建索引的表打开表设计器，在表设计器中右击，然后从快捷菜单中选择"索引/键"命令。

  2. 选择"新建"命令。"选定的索引"框显示系统分配给新索引的名称。

  3. 在"列名"下选择要创建索引的列。可以选择多达 16 列。为获得最佳性能，最好只选择一列或两列。对所选的每一列，可指出索引是按升序还是降序组织列值。

  4. 为索引指定任何其它需要的设置，然后单击"确定"按钮。

当保存表或关系图时，索引即创建在数据库中。

请参见

创建聚集索引 | 创建唯一索引 | 删除索引 | 索引 | 重命名索引 | 保存、显示和更新索引定义 | 为索引指定填充因子


创建唯一索引

在 SQL Server 中，当唯一性是数据本身的特点时，可创建唯一索引，但索引列的组合不同于表的主键。例如，如果要频繁查询 employee 表（该表主键为 emp_id）的社会保障号 (ssn) 列，而且要保证保障号是唯一的，则在 ssn 上创建唯一索引。如果用户为多个员工输入了相同的社会保障号，则数据库显示错误，并且不能保存该表。

当创建或修改唯一索引时，可以设置选项以忽略重复的键。如果已设置该选项，并且试图通过添加或更新将影响多行的数据来创建重复键（使用 INSERT 或 UPDATE 语句），则不能添加导致重复的行，或在更新时放弃这样的行。

例如，在已含有"Jones"的表中试图用"Jones"更新"Smith"，则在结果表中只有一个"Jones"，而没有"Smith"。原有的"Smith"行丢失，因为 UPDATE 语句实际上是 DELETE 语句后跟一个 INSERT 语句。"Smith"已删除，而试图插入另一个"Jones"的操作失败。整个事务不能回滚，因为该选项的目的是允许事务，而无管是否存在重复项。

创建唯一索引

  1. 在数据库关系图中选择要创建索引的表，右击该表，然后从快捷菜单中选择"索引/键"命令。

    -或-

    为要创建索引的表打开表设计器，在表设计器中右击，然后从快捷菜单中选择"索引/键"命令。

  2. 选择"新建"命令。"选定的索引"列表显示系统分配给新索引的名称。

  3. 在"列名"下选择要创建索引的列。可以选择多达 16 列。为获得最佳性能，只为每个索引选择一列或两列。对所选的每个索引，指出索引是按升序还是降序组织列值。

  4. 选择"创建 UNIQUE"复选框。

  5. 选择"索引"选项。

  6. 如果要忽略将在索引中创建重复键的新数据或更新数据（使用 INSERT 或 UPDATE 语句），则选择"忽略重复键"选项。

当保存表或关系图时，索引即创建在数据库中。

注意 如果某列有多行包含 NULL 值，则不能在该列上创建唯一索引。同样，如果列的组合中有多行包含 NULL 值，则不能在多个列上创建唯一索引。在创建索引时，这些被视为重复的值。

请参见

创建唯一约束 | 定义主键| 索引 | 保存、显示和更新索引定义 | 唯一约束


创建聚集索引

在 Microsoft® SQL Server™ 数据库中可以创建聚集索引。在聚集索引中，表中各行的物理顺序与索引键值的逻辑（索引）顺序相同。表只能包含一个聚集索引。聚集索引通常可加快 UPDATE 和 DELETE 操作的速度，因为这两个操作需要读取大量的数据。创建或修改聚集索引可能要花很长时间，因为执行这两个操作时要在磁盘上对表的行进行重组。

可考虑将聚集索引用于：

  • 包含数量有限的唯一值的列，如 state 列只包含 50 个唯一的州代码。

  • 使用下列运算符返回一个范围值的查询：BETWEEN、>、>=、< 和 <=。

  • 返回大结果集的查询。

创建聚集索引

  1. 在数据库关系图中选择要创建索引的表，右击该表，然后从快捷菜单中选择"索引/键"命令。

    -或-

    为要创建索引的表打开表设计器，在表设计器中右击，然后从快捷菜单中选择"索引/键"命令。

  2. 创建新索引。有关详细信息，请参见创建索引。
    若要修改现有索引，请从"选定的索引"列表中选择该索引。

  3. 选择"创建为 CLUSTERED"复选框。

当保存表或关系图时，索引即创建在数据库中。

请参见

索引 | 保存、显示和更新索引定义


重命名索引

基于数据库表名自动给新索引分配系统定义的名称。如果在表上创建多个索引，将在索引名上追加"_1"、"_2"等等。只要索引名在表中是唯一的，就可对索引重命名。

注意 当为表创建主键或唯一约束时，将为该表自动创建与约束同名的索引。在表中索引名必须唯一，因此不能在表中创建或重命名与主键或唯一约束同名的索引。

重命名索引

  1. 在数据库关系图中选择要重命名索引的表，右击该表，然后从快捷菜单中选择"属性"命令。

    -或-

    为要重命名索引的表打开表设计器，在表设计器中右击，然后从快捷菜单中选择"属性"命令。

  2. 选择"索引/键"选项卡。

  3. 从"选定的索引"列表中选择索引。

  4. 在"索引名"框中键入新名称。确定新名不与"选定的索引"列表中的索引重名。

当退出"索引名"框时，索引即在关系图中被重命名。当保存表或关系图时，索引即在数据库中被重命名。

请参见

删除索引 | 索引 | 保存、显示和更新索引定义


删除索引

索引会减慢 INSERT、UPDATE 和 DELETE 语句的执行速度。如果发现索引阻碍整体性能或不再需要索引，则可将其删除。

删除索引

  1. 在数据库关系图中选择要删除索引的表，右击该表，然后从快捷菜单中选择"属性"命令。

    -或-

    为要删除索引的表打开表设计器，在表设计器中右击，然后从快捷菜单中选择"属性"命令。

  2. 选择"索引/键"选项卡。

  3. 从"选定的索引"列表中选择要删除的索引。

  4. 选择"删除"按钮。

    注意 选择"删除"按钮将导致一个无法撤消的操作，而且不保存对数据库关系图所做的所有其它更改。若要撤消该操作，请不保存更改即关闭当前的数据库关系图和所有其它打开的数据库关系图以及表设计器窗口。

当保存表或关系图时，索引即从数据库中被删除。

请参见

创建索引 | 索引 | 保存、显示和更新索引定义


保存、显示和更新表的索引定义

保存表或数据库关系图时，索引将自动保存在数据库中。只要一创建索引，即可对其进行修改。

显示和更新索引定义

  1. 在数据库关系图中右击表，并从快捷菜单中选择"属性"命令。

    -或-

    为要修改索引的表打开表设计器，在表设计器中右击，然后从快捷菜单中选择"属性"命令。

  2. 选择"索引/键"选项卡。

  3. 若要更新定义，请选择要更新的字段并更改该字段的值或设置。

当保存表或关系图时，所做的更改即保存到数据库中。

注意还可管理几个视图上的索引。有关更多信息，请参见索引视图。

请参见

索引


为索引指定填充因子

可标识填充因子来指定每个索引页的填满程度。索引页上的空余空间量很重要，因为当索引页填满时，系统必须花时间拆分它以便为新行腾出空间。

创建索引时很少需要指定填充因子。提供该选项是用于微调性能。在包含现有数据的表上创建新索引时，尤其是当能精确预测那些数据以后的改变时，该选项很有用。

为表上的索引指定填充因子

  1. 在数据库关系图中，右击包含要为其指定填充因子的索引的表，然后从快捷菜单中选择"属性"命令。

    -或-

    为包含要为其指定填充因子的索引的表打开表设计器，在表设计器中右击，然后从快捷菜单中选择"属性"命令。

  2. 选择"索引/键"选项卡。

  3. 从"选定的索引"列表中选择索引。

  4. 在"填充因子"框中键入一个介于 0 到 100 之间的百分比。

为视图上的索引指定填充因子

  1. 为包含要为其指定填充因子的索引的视图打开视图设计器，在视图设计器中右击，然后从快捷菜单中选择"管理索引"命令。

  2. 从"选定的索引"列表中选择索引。

  3. 在"填充因子"框中键入一个介于 0 到 100 之间的百分比。

有关填充因子及其用法的更多信息，请参见 SQL Server 联机丛书。

请参见

索引


使用键

主键是确保每个表不含重复行的约束。外键是强制引用完整性的约束。有关键的更多信息，请参见键。

有关使用键的详细信息，请参见下列主题：

若要 | 请参见
定义主键 | 定义主键
修改主键 | 修改主键
删除主键 | 删除主键约束
定义外键 | 创建表间的关系
修改外键 | 修改外键
删除外键 | 删除外键约束
将外键列复制到外键表 | 将列属性复制到外键列
确保在外键列中输入的值与相关主键列中的现有值相匹配 | 强制表间的引用完整性
禁用外键约束 | 对 INSERT 和 UPDATE 语句禁用外键约束和对复制禁用外键约束


定义主键

定义主键来强制不允许空值的指定列中输入值的唯一性。如果在数据库中为表定义了主键，则可将该表与其它表相关，从而减少冗余数据。表只能有一个主键。

定义主键

  1. 在数据库关系图或表设计器中，单击要定义为主键的数据库列的行选择器。若要选择多个列，请按住 CTRL 键同时单击其它列的行选择器。

  2. 右击列的行选择器，然后选择"设置主键"命令。将自动创建一个名为"PK_"且后跟表名的主键索引；可在属性页的"索引/键"选项卡上找到该索引。

警告 如果要重新定义主键，则必须先删除任何与现有主键相关的关系才能创建新主键。将出现一条信息，警告您作为该过程的一部分，将自动删除现有关系。

行选择器上的主键符号 [image] 用于标识一个主键列。

如果主键包含不止一列，则在一列中允许有重复值，但主键中所有列值的每个组合必须唯一。

如果定义复合键，主键中的列顺序将与关系图中的表所显示的列顺序相匹配。不过，可以在创建主键后更改列的顺序。有关更多信息，请参见修改主键。

请参见

约束 | 删除主键约束 | 强制表间的引用完整性 | 修改主键 | 主键约束 | 表关系


修改主键

当要更改列顺序、索引名称、聚集选项或填充因子时，修改主键。

修改主键

  1. 在数据库关系图中右击要修改主键的表，然后从快捷菜单中选择"属性"命令。

    -或-

    为要修改主键的表打开表设计器，在表设计器中右击，然后从快捷菜单中选择"属性"命令。

  2. 选择"索引/键"选项卡。

  3. 从"选定的索引"列表中选择主键索引。

  4. 完成下表中的操作：
    若要 | 遵循下列步骤
    更改列顺序 | 在"列名"窗格内，删除主键中的列。然后将列按需要的顺序添加回窗格。若要从键中删除列，只需从"列名"列表中删除列名即可。
    重命名主键 | 在"索引名"框中键入新名称。确保新名称不与"选定的索引"列表中的名称重复。
    设置聚集选项 | 选择"创建为 CLUSTERED"复选框。每个表只能有一个聚集索引。如果该选项对索引不可用，则必须首先在现有的聚集索引上清除该设置。
    定义填充因子 | 在"填充因子"框中键入一个介于 0 到 100 之间的整数。

当保存表或关系图时，主键即在数据库内被更新。

请参见

约束 | 删除主键约束 | 强制表间的引用完整性 | 主键约束


删除主键约束

当要删除对列或列组合中的输入值的唯一性要求时，删除主键约束。

删除主键约束

在数据库关系图或表设计器中，选择要删除主键约束的表的主键列。行选择器上的主键符号 [image] 用于标识一个主键列。

  1. 右击列的行选择器，然后选择"设置主键"命令。

    –-或-–

  2. 在数据库关系图中选择要删除主键约束的表。

  3. 右击表并选择"索引/键"命令。

  4. 从"选定的索引"列表中选择主键索引。

  5. 选择"删除"按钮。

注意 选择"删除"按钮将导致一个无法撤消的操作，而且不保存对数据库关系图所做的所有其它更改。若要撤消该操作，请不保存更改即关闭当前的数据库关系图和所有其它打开的数据库关系图。

当保存表或关系图时，约束即从数据库中被删除。

请参见

约束 | 定义主键 | 主键约束


修改外键

当要更改与主键表中的列相关的列时，修改关系的外键方。

修改外键

  1. 在数据库关系图中右击与要修改的外键对应的关系，然后从快捷菜单中选择"属性"命令。

    -或-

    为包含要修改的外键的表打开表设计器，在表设计器中右击，然后从快捷式菜单中选择"属性"命令。

  2. 选择"关系"选项卡。

  3. 从"选定的关系"列表中选择关系。

  4. 在"外键表"列中，展开第一行中的列表。

  5. 从列表中选择不同的表列。外键列必须与主键列的数据类型及大小相匹配，下面几种情况除外：
    • char 列或 sysname 列可以与 varchar 列相关。

    • binary 列可以与 varbinary 列相关。

    • 用户定义数据类型可以与其基本类型相关。

只要一移出属性页的网格，对关系属性所做的任何更改即生效。当保存表或关系图时，约束即在数据库内被更新。

注意 在数据库关系图中修改关系时，相关的两个表均被标记为已修改。因此，每个表在任何其它包含该表的关系图中也被标记为已修改。

请参见

约束 | 删除外键约束 | 外键约束 | 修改主键


查看外键特性

当要查看在关系中作为外键方的列时，查看关系的外键特性。如果外键列与主键相关，那么数据库图关系图中的主键列由行选择器中的主键符号 [image] 标识。

查看关系的外键特性

  1. 在数据库关系图中，右击对应于外键的关系线，然后从快捷菜单中选择"属性"命令。

    -或-

    为包含要修改的外键的表打开表设计器，在表设计器中右击，然后从快捷式菜单中选择"属性"命令。

  2. 选择"关系"选项卡。

  3. 确保在"选定的关系"列表中选定关系。

  4. "外键表"列显示在关系中作为外键方的每一列的名称。

请参见

约束 | 外键约束 | 修改外键


对复制禁用外键约束

SQL Server 支持复制。如果约束针对源数据库，并且可能会不必要地阻止新数据输入到目的数据库中，则选择该选项以在复制期间禁用外键约束。

对复制禁用外键约束

  1. 在数据库关系图中，右击包含外键的表，然后从快捷菜单中选择"属性"命令。

    -或-

    为包含要修改的外键的表打开表设计器，在表设计器中右击，然后从快捷式菜单中选择"属性"命令。

  2. 选择"关系"选项卡。

  3. 从"选定的关系"列表中选择关系。

  4. 清除"对复制启用关系"复选框。

请参见

约束 | 外键约束


对 INSERT 和 UPDATE 语句禁用外键约束

如果知道新数据将违反约束或约束仅应用于数据库中的现有数据，则选择该选项以在 INSERT 和 UPDATE 事务期间禁用外键约束。

对 INSERT 和 UPDATE 语句禁用外键约束

  1. 在数据库关系图中，右击包含外键的表，然后从快捷菜单中选择"属性"命令。

    -或-

    为包含要修改的外键的表打开表设计器，在表设计器中右击，然后从快捷式菜单中选择"属性"命令。

  2. 选择"关系"选项卡。

  3. 从"选定的关系"列表中选择关系。

  4. 清除"对 INSERT 和 UPDATE 强制关系"复选框。

添加或修改数据后，若要确保约束能应用到后续的数据修改中，应该选择该选项。

注意 如果打算使用触发器执行数据库操作，则必须禁用外键约束才能使触发器运行。

请参见

约束 | 外键约束


删除外键约束

当要删除强制引用完整性要求时，删除外键。

删除外键约束

  • 在数据库关系图中，删除代表要删除的外键约束的关系线。有关详细信息，请参见删除关系。

注意 从数据库关系图中删除关系时，相关表在所有包含它的关系图中将被标记为已修改。

请参见

约束 | 外键约束


将列属性复制到外键列

当将某列从一个表复制到另一个表时，在原始表中为该列定义的列名以及许多其它属性均复制到新位置。如果要使主键列与外键列相关，可以将主键列的列属性复制到外键列。相关列必须有相同的数据类型（或可相关的数据类型）和长度属性设置。

将主键列属性复制到外键列

在数据库关系图中选择要复制的主键列。在行选择器中，主键列由一个键符号 [image] 表示。

  • 将列复制到外键表。有关详细信息，请参见将列从一个表复制到另一个表。

  • 从主表中的列拖出一条关系线到外键表的相同列。有关详细信息，请参见创建表间的关系。

请参见

将列从一个表复制到另一个表


使用约束

约束是数据库服务器强制执行的规则。有关更多信息，请参见约束。

有关使用约束的详细信息，请参见下列主题：

若要 | 请参见
将 CHECK 约束附加到表上以指定在一列或多列中可接受的数据值 | 将新的 CHECK 约束附加到表或列
创建约束表达式以检查数据是否符合条件 | 定义 CHECK 约束表达式
更改约束表达式或选项以启用或禁用对特定条件的约束 | 修改 CHECK 约束
将约束只应用于新数据或也应用于现有数据 | 创建 CHECK 约束时检查现有数据
在将数据添加到表中、在表中更新数据或从表中删除数据时禁用 CHECK 约束 | 对 INSERT 和 UPDATE 语句禁用 CHECK 约束
当在另一个数据库中复制表时禁用 CHECK 约束 | 对复制禁用 CHECK 约束
删除对列中数据值的限制 | 删除 CHECK 约束
确保不在特定的列中输入重复值 | 创建唯一约束
更改附加了约束的列，更改约束名或为约束设置附加属性 | 修改唯一约束
删除对列中输入值的唯一性要求 | 删除唯一约束
对在指定列中输入的值强制唯一性 | 定义主键
更改列的顺序、索引名、聚集选项或填充因子 | 修改主键
将列属性从主键列复制到外键列以使两列相关 | 将列属性复制到外键列
删除对列中输入值的唯一性要求 | 删除主键约束
查看在关系中作为外键方的列 | 查看外键特性
更改与主表中的列相关的列 | 修改外键
创建关系时检查现有数据 | 创建关系时检查现有数据
在 INSERT 和 UPDATE 事务期间禁用外键约束 | 对 INSERT 和 UPDATE 语句禁用外键约束
在复制表期间禁用外键约束 | 对复制禁用外键约束
删除对在主键列和另一表中的相关列之间强制引用完整性的要求 | 删除外键约束


将新的 CHECK 约束附加到表或列

将 CHECK 约束附加到表以指定一列或多列中可接受的数据值。

附加新的 CHECK 约束

  1. 在数据库关系图中，右击包含约束的表，然后从快捷菜单中选择"约束"命令。

    -或-

    为将包含约束的表打开表设计器，在表设计器中右击，然后从快捷菜单中选择"约束"命令。

  2. 选择"新建"命令。"选定的约束"框显示由系统分配的新约束名。系统分配的名称以"CK_"开始，后跟表名。

  3. 在"约束表达式"框中，为 CHECK 约束键入 SQL 表达式。例如，若要将 authors 表中 state 列的输入项限制为 New York，请键入：
    state = 'NY'

    或者，若要要求 zip 列中的输入项为 5 位数字，请键入：

    zip LIKE '[0-9][0-9][0-9][0-9][0-9]'

    注意 确保将任何非数字约束值用单引号 (') 括起来。有关更多信息，请参见定义 CHECK 约束表达式。

  4. 若要给约束提供一个不同的名称，请在"约束名"框中键入名称。

  5. 用复选框控制何时强制约束：
    • 若要在创建约束前对现有数据测试约束，请选中"创建中检查现存数据"复选框。

    • 若要在该表中发生复制操作时强制约束，请选中"对复制强制约束"复选框。

    • 若要在该表中插入或更新行时强制约束，请选中"对 INSERT 和 UPDATE 强制约束"复选框。

请参见

CHECK 约束 | 约束 | 删除 CHECK 约束 | 对复制禁用 CHECK 约束


定义 CHECK 约束表达式

当将 CHECK 约束附加到表或列时，必须包括 SQL 表达式。有关该操作的详细信息，请参见将新的 CHECK 约束附加到表或列。

可以创建简单的约束表达式在简单条件下检查数据；或使用布尔运算符创建复杂的约束表达式以在多种条件下检查数据。例如，假设 authors 表中有一个 zip 列，该列要求 5 位数字的字符串。下面的示例约束表达式确保只允许 5 位数字：

zip LIKE '[0-9][0-9][0-9][0-9][0-9]'

或者假设 sales 表中有一个名为 qty 的列，该列要求大于 0 的值。下面的示例约束确保只允许正值：

qty > 0

或者假设 orders 表限制所有信用卡订单可接受的信用卡类型。下面的示例约束确保如果用信用卡发出订单，则只接受 Visa、MasterCard 或 American Express：

NOT (payment_method = 'credit card') OR
   (card_type IN ('VISA', 'MASTERCARD', 'AMERICAN EXPRESS'))

定义约束表达式

  1. 创建新的 CHECK 约束。有关如何执行该操作的详细信息，请参见将新的 CHECK 约束附加到表或列。

  2. 在属性页的"CHECK 约束"选项卡中，使用下列语法在"约束表达式"框中键入表达式：
    {constant | column_name | function | (subquery)}
    [{operator | AND | OR | NOT}
    {constant | column_name | function | (subquery)}...]

    SQL 语法由下列参数组成：

    参数 | 描述
    constant | 字面值，如数字或字符数据。字符数据必须用单引号 (') 括起来。
    column_name | 指定列。
    function | 内置函数。
    operator | 算术运算符、位运算符、比较运算符或字符串运算符。
    AND 在布尔表达式中用于连接两个表达式。当两个表达式均为真时才返回结果。

    当一个语句中同时使用 AND 和 OR 时，先处理 AND。可以使用括号更改执行顺序。
    OR 在布尔表达式中用于连接两个或更多条件。只要条件中有一个为真就返回结果。

    当一个语句中同时使用 AND 和 OR 时，在 AND 之后再计算 OR。可以使用括号更改执行顺序。
    NOT 用于求反任何布尔表达式（可以包含关键字，如 LIKE、NULL、BETWEEN、IN 和 EXISTS）。

    当在一个语句中使用多个逻辑运算符时，先处理 NOT。可以使用括号更改执行顺序。

请参见

CHECK 约束 | 约束


创建 CHECK 约束时检查现有数据

当创建 CHECK 约束时，可以设置选项将约束只应用于新数据或同时也应用于现有数据。当知道现有数据已满足新 CHECK 约束时，或者当业务规则要求仅从这点开始强制约束时，这种使约束仅应用于新数据的选项很有用。

例如，过去可能要求邮政编码必须是五位数字，但现在却需要新数据允许有九位邮政编码。包含五位邮政编码的旧数据将与包含九位邮政编码的新数据共存。

创建 CHECK 约束时检查现有数据

  1. 在数据库关系图中右击包含约束的表，然后从快捷菜单中选择"属性"命令。

    -或-

    为包含约束的表打开表设计器，在表设计器中右击，然后从快捷菜单中选择"属性"命令。

  2. 选择"CHECK 约束"选项卡。

  3. 从"选定的约束"列表中选择约束。

  4. 选择"创建中检查现存数据"复选框。默认情况下选择该选项。

当保存表或数据库关系图时，将应用 CHECK 约束。如果在保存过程中遇到任何违反约束的行为，则不能保存表。

请参见

将新的 CHECK 约束附加到表或列 | CHECK 约束 | 约束


对复制禁用 CHECK 约束

当在另一个数据库中复制表时，可以禁用 CHECK 约束。复制表时，表定义和数据从源数据库复制到目的数据库。这两个数据库通常（但不一定）位于不同的服务器上。如果 CHECK 约束仅针对源数据库，则可能会不必要地阻止新数据输入到目的数据库。当在远程站点上复制数据库时，不应重新应用 CHECK 约束，因为：

  • 数据在被输入原始数据库时将进行完整性检查。

  • 如果数据违反 CHECK 约束，复制将失败。

对复制禁用 CHECK 约束

  1. 在数据库关系图中右击包含约束的表，然后从快捷菜单中选择"属性"命令。

    -或-

    为包含约束的表打开表设计器，在表设计器中右击，然后从快捷菜单中选择"属性"命令。

  2. 选择"CHECK 约束"选项卡。

  3. 从"选定的约束"列表中选择约束。

  4. 清除"对复制强制约束"复选框。

请参见

将新的 CHECK 约束附加到表或列 | CHECK 约束 | 约束


对 INSERT 和 UPDATE 语句禁用 CHECK 约束

当在表中添加、更新或删除数据时，可以禁用 CHECK 约束。禁用约束使您能够执行下列事务：

  • 如果表中的现有行过去必须遵从的特定业务规则已不再适用，则可以向该表添加新的数据行（使用 INSERT 语句）。例如，过去可能要求邮政编码必须是五位数字，但现在却需要新数据允许有九位邮政编码。包含五位邮政编码的旧数据将与包含九位邮政编码的新数据共存。

  • 如果表中的现有行过去必须遵从的特定业务规则已不再适用，则可以修改现有行（使用 UPDATE 语句）。例如，可能需要将所有现有的五位邮政编码更新为九位邮政编码。

如果知道新数据将违反约束，或者约束仅适用于数据库中的已有数据，则选择该选项以在 INSERT 和 UPDATE 事务处理期间禁用 CHECK 约束。

对 INSERT 和 UPDATE 语句禁用 CHECK 约束

  1. 在数据库关系图中右击包含约束的表，然后从快捷菜单中选择"属性"命令。

    -或-

    为包含约束的表打开表设计器，在表设计器中右击，然后从快捷菜单中选择"属性"命令。

  2. 选择"CHECK 约束"选项卡。

  3. 从"选定的约束"列表中选择约束。

  4. 清除"对 INSERT 和 UPDATE 强制约束"复选框。

    可以在添加或修改数据后选择该选项，以确保约束能应用到后续的数据修改中。

请参见

将新的 CHECK 约束附加到表或列 | CHECK 约束 | 约束


修改 CHECK 约束

当要更改约束表达式，或更改对特定条件启用或禁用约束的选项时，修改 CHECK 约束。

修改 CHECK 约束

  1. 在数据库关系图中右击包含约束的表，然后从快捷菜单中选择"属性"命令。

    -或-

    为包含约束的表打开表设计器，在表设计器中右击，然后从快捷菜单中选择"属性"命令。

  2. 选择"CHECK 约束"选项卡。

  3. 从"选定的约束"列表中，选择要更改的约束。

  4. 完成下表中的操作：
    若要 | 遵循下列步骤
    编辑约束表达式 | 在"约束表达式"框中，键入新的表达式。有关详细信息，请参见定义 CHECK 约束表达式。
    重命名约束 | 在"约束名"框中，键入新的名称。
    将约束应用到现有数据 | 选择"创建中检查现存数据"选项。有关详细信息，请参见创建 CHECK 约束时检查现有数据。
    当将新数据添加到表中或更新表中的现有数据时禁用约束 | 清除"对 INSERT 和 UPDATE 强制约束"选项。有关详细信息，请参见对 INSERT 和 UPDATE 语句禁用 CHECK 约束。
    当在另一个数据库中复制表时禁用约束 | 清除"对复制强制约束"选项。有关详细信息，请参见对复制禁用 CHECK 约束。

当保存表或关系图时，约束即在数据库内被更新。

请参见

CHECK 约束 | 约束


删除 CHECK 约束

当要删除对约束表达式包含的列所接受数据值的限制时，删除 CHECK 约束。

删除 CHECK 约束

  1. 在数据库关系图中右击包含约束的表，然后从快捷菜单中选择"属性"命令。

    -或-

    为包含约束的表打开表设计器，在表设计器中右击，然后从快捷菜单中选择"属性"命令。

  2. 选择"CHECK 约束"选项卡。

  3. 从"选定的约束"列表中选择约束。

  4. 选择"删除"按钮。

注意 选择"删除"按钮将导致一个无法撤消的操作，而且不保存对数据库关系图所做的所有其它更改。若要撤消该操作，请不保存更改即关闭当前的数据库关系图和所有其它打开的数据库关系图。

当保存表或关系图时，约束即从数据库中被删除。

请参见

将新的 CHECK 约束附加到表或列 | CHECK 约束 | 约束


创建唯一约束

创建唯一约束来确保不参与主键的特定列的值不重复。尽管唯一约束和主键都强制唯一性，但在下列情况下，应该为表附加唯一约束以取代主键约束：

  • 如果要对列或列的组合强制唯一性。可以为表附加多个唯一约束，而只能为表附加一个主键约束。

  • 如果要对允许空值的列强制唯一性。可以为允许空值的列附加唯一约束，而只能将主键约束附加到不允许空值的列。当将唯一约束附加到允许空值的列时，确保在约束列中最多有一行含有空值。

创建唯一约束

  1. 在数据库关系图中右击将包含约束的表，然后从快捷菜单中选择"属性"命令。

    -或-

    为将包含约束的表打开表设计器，在表设计器中右击，然后从快捷菜单中选择"属性"命令。

  2. 选择"索引/键"选项卡。

  3. 选择"新建"命令。系统分配的名称出现在"索引名"框中。

  4. 在"列名"下展开列的列表，选择要将约束附加到的列。若要将约束附加到多个列，在后续行中选择其它的列。

  5. 选择"创建 UNIQUE"复选框。

  6. 选择"约束"选项。

当保存表或关系图时，唯一约束即创建在数据库中。

如果使用的是 SQL Server，可以控制键值的排序次序以及当存在重复键时所采取的操作。为此，应创建唯一索引取代唯一约束。有关更多信息，请参见创建唯一索引。

请参见

约束 | 创建唯一索引 | 删除唯一约束 | 唯一约束


修改唯一约束

当要更改约束附加到的列、更改约束名称或设置附加属性时，修改唯一约束。

修改唯一约束

  1. 在数据库关系图中右击包含约束的表，然后从快捷菜单中选择"属性"命令。

    -或-

    为包含约束的表打开表设计器，在表设计器中右击，然后从快捷菜单中选择"属性"命令。

  2. 选择"索引/键"选项卡。

  3. 从"选定的索引"列表中选择要更改的约束。

  4. 完成下表中的操作：
    若要 | 遵循下列步骤
    更改约束所附加到的列 | 在"列名"网格中展开列表，选择要将约束附加到的列。
    重命名约束 | 在"索引名"框中键入新名称。确保新名称不与"选定的索引"列表中的名称重复。
    设置聚集选项 | 选择"创建为 CLUSTERED"复选框。每个表只能有一个聚集索引。如果已存在一个聚集索引，必须首先在索引上清除该设置。
    定义填充因子 | 在"填充因子"框中键入一个介于 0 到 100 之间的整数。

当保存表或关系图时，约束即在数据库内被更新。

请参见

约束 | 唯一约束


删除唯一约束

当要删除对包含在约束表达式中的列或列组合中输入值的唯一性要求时，删除唯一约束。

删除唯一约束

  1. 在数据库关系图中，右击包含约束列的表，然后从快捷菜单中选择"索引/键"命令。

    -或-

    为包含约束的表打开表设计器，在表设计器中右击，然后从快捷菜单中选择"索引/键"命令。

  2. 从"选定的索引"列表中选择唯一约束。

  3. 选择"删除"按钮。

注意 选择"删除"按钮将导致一个无法撤消的操作，而且不保存对数据库关系图所做的所有其它更改。若要撤消该操作，不保存更改即关闭当前的数据库关系图或表设计器窗口以及所有其它打开的数据库关系图和表设计器窗口。

当保存表或关系图时，约束即从数据库中被删除。

请参见

约束 | 创建唯一约束 | 唯一约束


使用用户定义函数

可以在应用程序中的多个位置使用用户定义函数。

有关使用用户定义函数的详细信息，请参见下列主题：

若要 | 请参见
在查询中包含用户定义函数中的数据 | 在查询中包含用户定义函数


使用脚本

可以在 SQL 脚本中保存工作。这样做既可以保留已进行的工作，又不会影响基础数据库。您或其他用户可以在以后运行这些脚本，对数据库施加影响。

若要 | 请参见
创建一个脚本以捕获自打开数据库关系图或上次将工作保存到数据库后所做的全部更改 | 保存更改脚本


保存更改脚本

如果没有更改数据库的安全权限，或者还没有准备好更新数据库（例如，您对数据库关系图所做的更改与其他用户所做的更改有冲突），则可以保存一个 SQL 更改脚本。SQL 更改脚本记录所做的更改，这些更改可以在以后通过数据库工具（如 Microsoft® SQL Server™ 的命令提示实用工具 osql）应用于数据库。

保存更改脚本

  1. 在数据库关系图内右击，然后单击"保存更改脚本"选项。无论何时只要未保存数据库关系图更改，都可以使用该命令。

  2. 在"保存更改脚本"对话框中选择"是"。

    注意 如果选定的是自动生成更改脚本的选项，则每当保存数据库关系图或关系图中任何已更改的数据库对象时，都生成一个更改脚本。如果需要跟踪对数据库所做的更改时，这将非常有用。

  3. 一个消息框显示出已保存更改脚本的文件名。选择"确定"按钮。

每次保存更改脚本时，都将创建一个文件名为 DbDgmN.sql（对于第一次生成的更改脚本，N = 1，下一个更改脚本为 N+1，依此类推）的新文本文件，并保存在当前工作目录下。

更改脚本文件列出所有已更改的表，并指明这些表是如何被更改的（使用 DROP TABLE、ALTER TABLE 或 CREATE TABLE SQL 语句）。更改脚本文件还包含在清除临时表或回滚属于不成功的更改（不能保存的更改）一部分的事务时所需的任何错误处理代码。此外，更改脚本文件还包含使脚本能在数据库上成功运行的代码，以及描述脚本在运行时所做工作的代码（Print 语句）。

在保存更改时出现的任何错误信息都将存储在一个日志文件中，该日志文件与脚本文件的名称相同，但扩展名为 .log。还可以查看保存在日志浏览器中的消息，以了解哪些表已成功保存和未成功保存。

请参见

发现数据库更改对话框 | 保存选定的表


设计数据检索和操作

Microsoft® 可视化数据库工具查询设计器和视图设计器可以帮助创建和维护应用程序的数据检索及数据操作部分。

有关设计应用程序的数据检索和操作部分的更多信息，请参见数据库查询和可视化数据库工具。

有关设计数据检索和操作解决方案的特定步骤的详细信息，请参见下面的主题：

  • 设计查询

  • 使用视图

  • 操作数据


设计查询

查询设计是数据库应用程序开发的重要组成部分，因为在设计数据库并用数据进行填充后，需要通过查询来使用数据。若要了解有关特定的查询设计步骤的更多信息，请参见下面的主题：

  • 执行基本的查询操作

  • 指定搜索准则

  • 在行组上查询

  • 使用多个表进行查询

  • 创建通用查询

  • 在查询中使用表达式

  • 在查询中包含用户定义函数


执行基本的查询操作

下面的基本操作适用于大多数或全部查询。

若要 | 请参见
创建新查询 | 创建查询
将表、视图或任何其它列源添加到查询中 | 添加表
从查询中删除列源 | 删除表
将列添加到查询中 | 添加列
从查询输出中删除列 | 从查询输出中删除列
从查询中删除列 | 从查询中删除列
更改查询输出中的列顺序 | 重新排列输出列
创建查询中的列别名 | 创建列别名
创建查询中的表别名 | 创建表别名
验证查询 | 验证查询
向查询添加注释 | 注释查询
执行查询 | 执行查询
停止查询 | 停止查询
清除查询结果 | 清除查询结果
打印查询结果 | 打印查询结果
对查询结果行排序 | 对查询结果排序


创建查询

创建新查询

  1. 在 SQL Server 企业管理器中，右击要包含在查询中的任何表或视图。

  2. 在快捷菜单上，指向"打开表"并选择"查询"，或指向"打开视图"并选择"查询"。

    出现查询设计器，其中的关系图窗格上已显示出表或视图。

请参见

执行基本的查询操作


添加表

当创建查询时，从表或其它表结构化对象（视图和某些用户定义函数）中检索数据。若要在查询中使用任何这些对象，请将其添加到关系图窗格中。

注意 有关在使用 SQL Server 时从不同的数据源添加表或表结构化对象的信息，请参见对 SQL Server 数据库使用查询设计器时的注意事项。

将表、视图或用户定义函数添加到查询中

  1. 在查询设计器或视图设计器的关系图窗格中右击背景，然后从快捷菜单中选择"添加表"命令。

  2. 在"添加表"对话框中，选择要添加到查询中的对象类型的选项卡。

  3. 在项目列表中，双击要添加的每一项。

  4. 完成添加项目后，单击"关闭"按钮。

查询设计器将相应地更新关系图窗格、网格窗格和 SQL 窗格。

或者，可将对象拖到关系图窗格上。可以从 SQL Server 企业管理器中拖动表、视图或用户定义函数。

也可以从数据库设计器中拖动列或表，或从剪贴板粘贴列或表。

当在 SQL 窗格的语句中引用表或视图时，这些表或视图自动添加到查询中。

如果对表或表结构化对象没有足够的访问权限，或者如果 ODBC 驱动程序无法返回有关表或表结构化对象的信息，则查询设计器将不显示表或表结构化对象的数据列。在这种情况下，只显示表或表结构化对象的标题栏和"*（所有列）"复选框。

将现有查询添加到新查询中

  1. 确保 SQL 窗格显示在要创建的新查询中。

  2. 在 SQL 窗格中，在 FROM 关键字后键入左右圆括号 ()。

  3. 为现有查询打开查询设计器。（现在已打开两个查询设计器）。

  4. 显示内部查询 –（包括在新的外部查询中的现有查询）的 SQL 窗格。

  5. 选择 SQL 窗格内的所有文本，然后将其复制到剪贴板。

  6. 在新查询的 SQL 窗格中单击，使光标位于所添加的圆括号之间，然后粘贴剪贴板中的内容。

  7. 仍位于 SQL 窗格中，在右括号后添加别名。

请参见

删除表


删除表

可以从查询中删除表（或任何表结构化对象）。

注意 删除表或表结构化对象不会从数据库中删除任何东西；它们只是从当前查询中被删除。有关从数据库中删除表的详细信息，请参见从数据库关系图和数据库中删除表。

删除表或表结构化对象

  • 在关系图窗格中选择表、视图、用户定义函数或查询，然后按 DELETE 键，或右击对象然后选择"删除"命令。可以同时选择并删除多个对象。

–或–

  • 从 SQL 窗格中删除对对象的所有引用。

当删除表或表结构化对象后，查询设计器自动删除包含该表或表结构化对象的联接，并从 SQL 和网格窗格中删除对该对象列的引用。但是，如果查询包含涉及对象的复杂表达式，则在删除对该对象的所有引用后才自动删除该对象。

请参见

添加表


添加列

若要在查询中使用某列，必须将该列添加到查询中。可以为这些目的添加某列：在查询输出中显示该列、用该列进行排序、搜索该列的内容或汇总其内容。

如果创建选择查询并在关系图或网格窗格中添加列，则添加的列将成为查询输出的一部分。可以从输出中删除列，但仍将其用于排序、搜索等操作。例如，若要查找会计部的所有员工，可搜索部门列但不在输出中显示该列。

提示 在查询中只要是可以使用列的地方，就可以使用由列、文字、运算符和函数的任意组合组成的表达式。有关详细信息，请参见在查询中使用表达式。

可以添加个别的列或成组添加列。有以下选择：

  • 添加一个表或表结构化对象中的个别列，以用于排序、搜索或汇总。

  • 添加一个表或表结构化对象中的所有列。该选项对表而言相当于在 SQL 语句中指定"表名.*"。

  • 在查询内添加所有表结构化对象中的所有列，该选项在使用联接时很有用。当查询中使用多个表或表结构化对象时，该选项相当于在 SQL 语句中单独指定"*"。
    当添加所有列时，查询设计器不将所有个别的列添加到查询中，而是使用星号（"*"）。如果需要使用特定的列，则必须单独添加该列。

注意 如果选择"*"，将包括正在使用的表中所有当前定义的列。如果表的定义更改，由"*"返回的列的列表也发生更改。如果可行的话，建议指定要使用的列而不要使用"*"。

添加个别的列

  • 在关系图窗格中，选择要包括的数据列旁边的复选框。

-或-

  • 在网格窗格中移动到要添加列的第一个空白网格行，单击 Column 列中的字段，然后从列表中选择列名。

    注意 若要在网格窗格中的特定位置添加数据行，请选择要添加新列的网格行并按 INS 键。在该行上面将添加一个新列。

添加一个表或表结构化对象中的所有列

在关系图窗格中，选择"（所有列）"旁边的的复选框 [image] 。

–或–

  • 在 SQL 窗格的 SQL 语句中指定对象名.*，并用表或表结构化对象的名称代替对象名。

添加所有表和表结构化对象中的所有列

  1. 确保没有选定关系图窗格中的联接线。

  2. 在查询窗口中右击，并从快捷菜单中选择"属性"命令。然后选择查询选项卡。

  3. 选择"输出所有列"。
    –或–
    在 SQL 窗格的 SQL 语句输出列表中指定 *。

请参见

创建列别名 | 从查询输出中删除列 | 从查询中删除列 | 重新排列输出列


从查询输出中删除列

如果在选择查询中使用某列，但不希望该列出现在结果集中（即不希望该列出现在查询的选择列表中），则可以从输出中将其删除。从查询的输出中删除该列后，仍可以在搜索条件中使用该列或将其用作排序字段。

注意 如果想从查询中彻底删除列，请参见从查询中删除列。

从查询输出中删除列

  • 在关系图窗格中，清除要删除的列名旁边的复选框。

-或-

  • 在网格窗格中，在"输出"列中清除要删除的数据列的复选框。（如果想将列添加回查询输出中，可再次选中"输出"列）。

-或-

  • 从 SQL 窗格的输出列表中删除列。

请参见

添加列 | 在查询中使用表达式


从查询中删除列

如果不想在查询中再使用某列，可将该列删除。如果这样做，查询设计器将从选择列表、排序规范、搜索准则、SQL 窗格以及任何分组规范中删除对该列的引用。

注意 如果只想从选择查询的输出中删除某列，可这样做而不必从查询中彻底删除该列。有关详细信息，请参见从查询输出中删除列。

从查询中删除列

  • 在网格窗格中选择包含要删除的列的网格行，然后按 DELETE 键。

-或-

  • 从 SQL 窗格中删除对该列的所有引用。

请参见

添加列


重新排列输出列

将数据列添加到选择查询中的顺序决定数据列在结果中出现的顺序。添加到查询中的第一列将出现在结果的最左边，然后是第二列，依此类推。

如果创建更新或插入查询，则添加列的顺序将影响处理数据的顺序。

若要控制数据列在结果集中出现的位置，或控制使用数据列的顺序，可以对数据列重新排序。

重新排列输出列

在网格窗格中，单击行左边的行选择器按钮 [image] 以选择包含列的行。

  • 指向行选择器按钮，然后将行拖到新的位置。

-或-

  • 在 SQL 窗格中编辑列名的顺序。

提示 通过将空白行插入到网格窗格，然后指定要插入的数据列，可以在网格窗格中的特定位置添加数据行。有关详细信息，请参见添加列。

请参见

添加列


创建列别名

可为列名创建别名以使列名、计算和汇总值使用起来更容易。例如，可为以下目的创建列的别名：

  • 为表达式如 (quantity * unit price) 或为聚合函数创建列名，如"Total Amount"。

  • 创建列名的简短形式，如将"discounts.stor_id"创建为"d_id"。

定义了列别名后，可在选择查询中使用该别名指定查询输出。

创建列别名

  1. 在网格窗格中，找到包含要创建别名的数据列的行上，如有必要，将其标记为输出。如果数据列不在网格中，则将其添加到网格中。

  2. 在该行的"别名"列中，输入别名。别名必须遵从所有 SQL 命名规则。如果输入的别名中包含空格，查询设计器将自动在其周围加上分隔符。

请参见

添加列


创建表别名

别名可使表名使用起来更容易。在下列情况下使用别名很有用：

  • 想使 SQL 窗格中的语句更简洁易读。

  • 在查询中经常引用表名（如在限定列名时），并且想确保查询保持在特定的字符长度限制内。（有些数据库对查询强制最大长度。）

  • 使用同一个表的多个实例（如在自联接中）并需要一种方法引用一个实例或另一实例。

例如，可为表名 employee information 创建别名"e"，然后在查询的其余部分使用"e"引用该表。

创建表或表结构化对象的别名

  1. 将表或表结构化对象添加到查询中。

  2. 在关系图窗格中右击要为其创建别名的对象，然后从快捷菜单中选择"属性"命令。

  3. 在"属性"对话框中的"别名"框内输入别名。

创建表别名后，查询设计器将用该别名替代网格窗格的表列中相应的表名。

注意 SQL 标准指定当为表名创建别名后，SQL 语句的其余部分必须使用该别名引用表（即不能再使用原始表名）。


验证查询

为避免出现问题，可检查已生成的查询以确保其语法是正确的。当在 SQL 窗格中输入语句时，该选项尤其有用。

注意 即使语句不能在关系图和网格窗格中表示，它也可以是有效语句，并因此可成功地被验证。

注意 SQL 验证可检测出一些 SQL 错误，但不能检测出所有的 SQL 错误。如果查询包含在 SQL 验证时没有检测到的错误，数据库将在运行查询时检测出该错误。

验证 SQL 语句

在 SQL 窗格中右击，从快捷菜单中选择 [image] "验证 SQL 语法"命令。

请参见

执行查询


注释查询

通过在查询或视图中添加注释，可以记录查询或视图。可使用属性页输入注释或在 SQL 窗格中输入注释。

应避免在注释中输入两个字符的字符串"/*"和"*/"。

如果更改查询的类型（例如，将 SELECT 查询更改为 UPDATE 查询），则该查询的注释将被删除。

如果向视图中添加注释，则添加的文本将由 sp_Help 存储过程返回。

使用属性页在查询中添加注释

  1. 在查询设计器或视图设计器中右击，然后从快捷菜单中选择"属性页"命令。

  2. 如果使用查询，请选择"查询"选项卡。如果使用视图，请选择"视图"选项卡。

  3. 在"SQL 注释"字段中输入注释。

在 SQL 窗格中添加查询的注释

  1. 使文本光标位于 SQL 窗格的开始处或结尾处。输入注释，其前面有"/*"，后面有"*/"。
    必须使光标位于 SQL 窗格的开始处或结尾处，因为不能输入嵌入式注释。

  2. 在关系图窗格或网格窗格中单击。
    注释自动从 SQL 窗格中被删除，并追加到查询或视图属性页的"SQL 注释"字段中的现有注释文本中。


执行查询

当完成查询设计后，可以运行查询。

注意 如果想测试所创建的查询语法是否正确，可验证查询。有关详细信息，请参见验证查询。

执行查询

  • 在查询窗口中的任意位置右击，然后从快捷菜单中选择"运行"命令。

如果创建选择查询，则查询结果出现在结果窗格中。

查询设计器以批处理方式（递增地）将结果返回到计算机，以便可以尽快地开始查看结果，并且可在查询进行中执行其它任务。有关更多信息，请参见结果窗格和数据库间的交互。

如果创建更新、从中插入、插入到、删除或生成表查询，则查询设计器将显示一条消息指出查询所影响的行数。

有关在结果窗格中查看结果和浏览的信息，请参见结果窗格。

请参见

清除查询结果 | 在结果窗格中编辑行 | 验证查询


停止查询

如果查询的运行时间太长或没有返回预期的结果，可以在查询没有完成时停止查询。

停止查询

  • 在结果窗格中的任意位置右击，然后选择"清除结果"命令。

如果执行新的查询，查询设计器也会停止当前的查询。

请参见

清除查询结果 | 执行查询


清除查询结果

如果更改当前查询的定义，查询设计器将使结果窗格变暗，以表示该窗格中的内容不再反映正在编辑的查询。也可清除结果窗格中的内容。

清除查询结果

  • 在结果窗格中右击，然后选择"清除结果"命令。

如果清除结果窗格的同时正在执行查询，查询设计器将停止该查询。

请参见

执行查询 | 停止查询


打印查询结果

若要打印查询的结果，可以将结果窗格中的内容复制到另一个 Windows 程序中（如字处理程序），然后在该程序中格式化并打印结果。

查询设计器将查询结果放到剪贴板上，使用制表符作为列之间的分隔符，用回车符和换行符作为行之间的分隔符。

打印查询结果

  1. 选择要打印的列或行。

  2. 使用"复制"命令将这些行或列移动到剪贴板上。

  3. 切换到用来打印结果的 Windows 程序中。

  4. 使用"粘贴"命令将剪贴板上的查询结果移到该 Windows 程序。

  5. 格式化并打印结果。

请参见

页面设置对话框


对查询结果排序

可以按数据列的内容或按表达式对查询进行排序。查询设计器允许指定升序或降序的排序类型。

也可以按多个列或表达式对查询结果进行排序，并指定每一列或表达式的排序次序。例如，如果要查询员工表，可以按部门（排序次序 = 1）和在每个部门内按姓（排序次序 = 2）对查询结果排序。

注意 不能按备注或二进制 (BLOB) 列的内容排序。

对查询结果排序

  1. 如果还没有对查询结果排序，将排序所基于的列或表达式添加到网格窗格中。
    如果不希望列或表达式成为结果集的一部分，请将它们作为输出列删除。

  2. 在网格窗格中，找到包含排序所基于的第一个数据列或表达式的行，然后在"排序类型"网格列中选择"升序"或"降序"。

  3. 如果按多个列或表达式排序，请在网格的"排序次序"列中指定排序次序。

–或–

  • 在关系图窗格中右击排序所基于的列，然后从快捷菜单中选择"升序排序"或"降序排序"命令。可以在右击多列之前先选择它们。如果使用此方法，则这些列将按被选择的顺序排序。

请参见

折叠行组


创建查询

查询设计器为查询提供了易于使用的界面。本节中的主题介绍使用任何查询的基本操作，包括如何选择要使用的表或表结构化对象，如何将数据列添加到查询中或从查询中删除，以及如何执行查询。

若要 | 请参见
将表或表结构化对象添加到查询中或从查询中删除 | 添加表 删除表
将列添加到查询或查询输出中，或者从查询或查输出中删除列 | 添加列 从查询输出中删除列 从查询中删除列
更改查询结果的显示方式 | 重新排列输出列 对查询结果排序
清除或打印查询结果 | 清除查询结果 打印查询结果
创建表或列的别名 | 创建表别名 创建列别名
检查查询的语法 | 验证查询
运行或停止查询 | 执行查询 停止查询


指定搜索准则

可以使用搜索准则限制查询返回的行数。有关选择包括在结果集内的行的更多信息，请参见包括行或排除行。

有关创建搜索准则的具体步骤的详细信息，请参见下表中列出的主题。

有关信息 | 请参见
在查询设计器中指定搜索条件 | 指定搜索条件
创建在搜索条件中使用的表达式 | 在查询中使用表达式
在搜索条件中使用运算符 | 比较运算符、逻辑运算符和通配符
输入文本、数值、日期值或逻辑值 | 输入搜索值
查找与某个值不匹配的行 | 选择与值不匹配的行
从选择查询中删除重复行 | 排除重复行
对同一数据列应用多个搜索条件 | 为一列指定多个搜索条件
将多个数据列包含为查询搜索条件的一部分 | 为多列指定多个搜索条件
用 AND 和 OR 运算符链接搜索条件 | 组合搜索条件
使用子查询 | 创建子查询


指定搜索条件

可以通过指定搜索条件指定出现在查询中的数据行。例如，如果要查询 employee 表，可以指定只查找在某一特定区域工作的员工。

用一个表达式来指定搜索条件。表达式通常由运算符和搜索值组成。例如，若要查找特定销售区域内的员工，可以为 region 列指定下列搜索条件：

='UK'

注意 如果正使用多个表，查询设计器将检查每个搜索条件以确定正在做的比较是否产生联接。如果产生联接，则查询设计器自动将搜索条件转换成联接。有关更多信息，请参见自动联接表。

指定搜索条件

  1. 如果尚未指定搜索条件，则将想在搜索条件内使用的列或表达式添加到网格窗格。
    如果要创建选择查询且不想搜索列或表达式出现在查询输出中，则清除每个搜索列或表达式的"输出"列并将其作为输出列删除。

  2. 定位包含要搜索的数据列或表达式的行，然后在"准则"网格列中输入搜索条件。

    注意 如果没有输入运算符，查询设计器将自动插入等于运算符"="。

查询设计器通过添加或修改 WHERE 子句，更新 SQL 窗格中的 SQL 语句。

请参见

通配符 | 包含或排除行


选择与值不匹配的行

若要查找与值不匹配的行，请使用 NOT 运算符。例如，要在 products 表内查找产品代码列中的值不是以字符"A"开始的所有行，可以输入下列搜索条件：

NOT LIKE 'A%'

请参见

输入搜索值 | 指定搜索条件 | 指定搜索准则 | 包括或排除行


为一列指定多个搜索条件

在某些情况下，可能想将若干搜索条件应用于同一个数据列。例如，可能想进行下列查询：

  • 在 employee 表中搜索几个名字不同或在不同薪金范围内的员工。此类搜索需要 OR 条件。

  • 搜索以单词"The"打头并包含单词"Cook"的书名。此类搜索需要 AND 条件。

注意 本主题中的信息对查询的 WHERE 子句和 HAVING 子句中的搜索条件都适用。这些示例集中讨论了创建 WHERE 子句，但其原理对两种类型的搜索条件都适用。有关创建 HAVING 子句的详细信息，请参见为组指定条件。

若要在同一数据列中搜索可选值，请指定 OR 条件。若要搜索同时满足几个条件的值，请指定 AND 条件。

指定 OR 条件

使用 OR 条件，可以在列内指定几个要搜索的可选值。此选项扩大了搜索的作用域，而且比搜索单一值返回更多的行。

提示 可以经常用 IN 运算符在同一数据列中搜索多个值。有关详细信息，请参见比较运算符。

指定 OR 条件

  1. 在网格窗格中添加要搜索的列。

  2. 在刚添加的数据列的"准则"列内指定第一个条件。

  3. 在同一数据列的"或 ..."列中，指定第二个条件。

查询设计器创建下列包含 OR 条件的 WHERE 子句：

SELECT fname, lname
FROM employees
WHERE (salary < 30000) OR (salary > 100000)
指定 AND 条件

使用 AND 条件，使您得以指定列中的值必须同时满足该行的两个（或多个）条件才能包括在结果集中。此选项缩小了搜索的作用域，通常返回比搜索单一值更少的行。

提示 如果要搜索值的范围，可以使用 BETWEEN 运算符代替用 AND 链接两个条件。有关详细信息，请参见比较运算符。

指定 AND 条件

  1. 在网格窗格中添加要搜索的列。

  2. 在刚添加的数据列的"准则"列内指定第一个条件。

  3. 将同一数据列再次添加到网格窗格中，将其放在网格的空行中。

  4. 在数据列的第二个实例的"准则"列中，指定第二个条件。

查询设计器创建下列包含 AND 条件的 WHERE 子句：

SELECT title_id, title
FROM titles
WHERE (title LIKE '%Cook%') AND
  (title LIKE '%Recipe%')

请参见

组合搜索条件 | 为多列指定多个搜索条件


为多列指定多个搜索条件

通过将几个数据列做为搜索条件的一部分，可以扩大或缩小查询的作用域。例如，可能想进行下列查询：

  • 搜索在公司工作五年以上并拥有某种职位的员工。

  • 搜索由特定出版商出版的有关烹饪的书。

若要创建在两个（或多个）列的任意一个列中搜索值的查询，请指定 OR 条件。若要创建必须满足两个（或多个）列中所有条件的查询，请指定 AND 条件。

注意 如果要创建包括 AND 和 OR 子句组合的查询，必须知道查询在执行时是如何被解释的。有关详细信息，请参见组合搜索条件。

指定 OR 条件

若要创建用 OR 链接的多个条件，将每个单独的条件放在网格窗格中不同的列内。

为两个不同的列指定 OR 条件

  1. 在网格窗格中添加要搜索的列。有关详细信息，请参见添加列。

  2. 在第一个要搜索的列的"准则"列中，指定第一个条件。有关详细信息，请参见指定搜索条件。

  3. 在要搜索的第二个数据列的"或 ..."列中，指定第二个条件，并使"准则"列为空。

查询设计器创建下列包含 OR 条件的 WHERE 子句：

SELECT job_lvl, hire_date
FROM employee
WHERE (job_lvl >= 200) OR
  (hire_date < '01/01/90')
  4. 对于要添加的每个附加条件，请重复步骤 3 和步骤 4。每个新条件要使用不同的"或 ..."列。
指定 AND 条件

若要使用由 AND 链接的条件搜索不同的数据列，请将所有的条件都放在网格的"准则"列中。

为两个不同的列指定 AND 条件

  1. 在网格窗格中添加要搜索的列。

  2. 在要搜索的第一个数据列的"准则"列中，指定第一个条件。

  3. 在第二个数据列的"准则"列中，指定第二个条件。

查询设计器创建下列包含 AND 条件的 WHERE 子句：

SELECT pub_id, title
FROM titles
WHERE (pub_id = '0877') AND (title LIKE '%Cook%')
  4. 对每个要添加的附加条件重复步骤 2 和步骤 3。

请参见

在 AND 优先时组合条件 | 在 OR 优先时组合条件 | 组合搜索条件 | 比较运算符 | 指定搜索准则


在 AND 优先时组合条件

若要用 AND 组合条件，请将条件放在网格窗格的同一列中。若要用 OR 组合条件，请将第一个条件放在"准则"列中，将其它条件放在"或 ..."列中。

例如，假设要搜索在公司工作五年以上的低级职位的员工，或不考虑其雇佣日期的中级职位的员工。该查询需要三个条件，其中的两个用 AND 链接：

  • 雇佣日期是在五年前且职位等级为 100 的员工

    -或-

  • 职位等级为 200 的员工

下面的过程说明如何在网格窗格中创建此类查询：

在 AND 优先时组合条件

  1. 在网格窗格中，添加要搜索的数据列。如果要使用由 AND 链接的两个或多个条件搜索同一列，则对每个要搜索的值都必须将数据列名添加到网格一次。

  2. 在"准则"列中，输入要用 AND 链接的所有条件。例如，若要用 AND 链接搜索 hire_date 和 job_lvl 列的条件，请按如下所示输入值：

这些网格输入项在 SQL 窗格的语句中生成下列 WHERE 子句：

WHERE (hire_date < '01/01/91') AND
  (job_lvl = 100)
  3. 在"或 ..."网格列中输入要用 OR 链接的条件。例如，若要添加在 job_lvl 列中搜索另一个值的条件，请按如下所示输入另一个值：

在"或 ..."列中添加一个值即是在 SQL 窗格中向语句中的 WHERE 子句添加一个条件。

WHERE (hire_date < '01/01/91' ) AND
  (job_lvl = 100) OR
  (job_lvl = 200)

请参见

在 OR 优先时组合条件 | 组合搜索条件 | 创建表达式 | 输入搜索值 | 指定搜索准则


在 OR 优先时组合条件

若要用 OR 链接条件并使这些条件优先于用 AND 链接的条件，则必须对每个 OR 条件重复 AND 条件。

例如，假设想搜索在公司工作五年以上的低级职位员工或已退休的员工。该查询需要三个条件，一个条件用 AND 链接到其它两个条件：

  • 雇佣日期在五年以前的员工

  • 职位等级为 100 的员工或状态是"R"（表示已退休）的员工

下面的过程说明如何在网格窗格中创建此类查询：

在 OR 优先时组合条件

  1. 在网格窗格中，添加要搜索的数据列。如果要使用由 AND 链接的两个或多个条件搜索同一列，则对每个要搜索的值都必须将数据列名添加到网格一次。

  2. 通过将第一个条件输入到"准则"网格列，将第二个（和以后的）条件输入到各个"或 ..."列中，创建用 OR 链接的条件。例如，若要用 OR 链接搜索 job_lvl 和 status 列的条件，请按如下所示输入值：

输入上面网格中显示的值后，将在 SQL 窗格的语句中生成下列 WHERE 子句：

WHERE (job_lvl = 100) OR (status = 'R')
  3. 通过对每个 OR 条件都输入一次 AND 条件来创建 AND 条件。将每个输入项放在其对应的 OR 条件所在的同一个网格列中。例如，若要添加一个搜索 hire_date 列且适用于两个 OR 条件的 AND 条件，请按如下所示输入值：

输入上面网格中显示的值后，将在 SQL 窗格的语句中生成下列 WHERE 子句：

WHERE (job_lvl = 100) AND
  (hire_date < '01/01/90' ) OR
  (status = 'R') AND
  (hire_date < '01/01/91' )

提示 可以通过添加一次 AND 条件，然后使用"编辑"菜单中的"剪切"和"粘贴"命令对其它 OR 条件重复此操作来重复 AND 条件。

查询设计器创建的 WHERE 子句与下面的 WHERE 子句等效，该 WHERE 子句使用圆括号指定 OR 的优先权高于 AND 的优先权：

WHERE (job_lvl = 100 OR status = 'R') AND
   (hire_date < '01/01/91')

注意 如果按上面显示的格式在 SQL 窗格中输入搜索条件，然后在关系图或网格窗格中对查询进行更改，则查询设计器将重新创建 SQL 语句以匹配用 AND 条件显式分布到两个 OR 条件的形式。

请参见

在 AND 优先时组合条件 | 组合搜索条件 | 比较运算符 | 指定搜索准则


创建子查询

可以使用一个查询的结果作为另一个查询的输入。一般情况下，使用子查询的结果作为搜索条件，且该搜索条件使用 IN( ) 函数或 EXISTS 运算符。不过，也可以在 FROM 子句中使用子查询。

可以通过在网格窗格或 SQL 窗格中输入子查询来创建子查询。

在网格窗格中定义 EXIST 子查询

  1. 创建主查询。

  2. 在网格窗格中第一个空行的"列"列中输入 EXIST，EXIST 后的圆括号内是子查询。

  3. 在包含子查询的行的"准则"列中，输入 TRUE、FALSE、=TRUE 或 =FALSE。输入 FALSE 或 =FALSE 将产生 NOT EXIST 查询。

注意 若要创建 NOT EXISTS 查询，请按上面所列的步骤创建 EXISTS 查询，并将"准则"列设置为 FALSE。如果在网格窗格内输入 NOT EXISTS，查询设计器将显示错误。

在 SQL 窗格中定义子查询

  1. 创建主查询。

  2. 在 SQL 窗格中选择 SQL 语句，然后使用"复制"命令将查询移到剪贴板上。

  3. 启动新的查询，然后使用"粘贴"命令将第一个查询移到新查询的 WHERE 子句或 FROM 子句中。

例如，假设有两个表：products 表和 suppliers 表，要创建显示瑞典供货商所有产品的查询。在 suppliers 表上创建第一个查询以查找所有的瑞典供货商：

SELECT supplier_id
FROM supplier
WHERE (country = 'Sweden')

使用"复制"命令将该查询移到剪贴板上。用 products 表创建第二个查询，以列出需要的产品信息：

SELECT product_id, supplier_id, product_name
FROM products

在 SQL 窗格中，将 WHERE 子句添加到第二个查询，然后从剪贴板粘贴第一个查询。用圆括号将第一个查询括起来，于是最终结果就是下面这样：

SELECT product_id, supplier_id, product_name
FROM products
WHERE supplier_id IN
   (SELECT supplier_id
  FROM supplier
  WHERE (country = 'Sweden'))

注意 将子查询添加到 WHERE 子句时，子查询出现在网格窗格的"准则"列中。可以在网格窗格和 SQL 窗格中进一步编辑子查询。但是，在子查询中引用的表以及表结构化对象、列和表达式不显示在关系图或网格窗格中。

请参见

支持的查询类型


在查询中使用表达式

若要在查询中使用表达式，可以直接在网格窗格中键入表达式，或在 SQL 窗格中将表达式作为语句的一部分输入。输入表达式与输入列名相似。有关创建表达式的详细信息，请参见创建表达式。

提示 为在屏幕上更容易查看长表达式，可调整网格窗格中的列大小。有关详细信息，请参见网格窗格。

本主题中包括下列内容：

  • 在结果集中显示表达式

  • 使用表达式进行排序

  • 使用表达式进行搜索

在结果集中显示表达式

通过在网格窗格中指定表达式代替列，可以在结果集中显示表达式。

在结果集中显示表达式

  1. 在网格窗格中，插入一个新网格行。

  2. 在新网格行的"列"列中，键入要显示其结果的表达式。

在结果集中显示表达式的结果时，数据库会采用"Exprn,"的格式分配列标题，其中 n 为当前查询中的表达式编号。可以用该表达式的更有意义的别名替换这个列标题。有关详细信息，请参见创建列别名。

使用表达式进行排序

在 SQL Server 中可以按表达式的结果进行排序。与列排序一样，需要指定排序类型和排序次序。

使用表达式进行排序

  1. 在网格窗格中，插入一个新网格行。

  2. 在新网格行的"列"列中，键入排序所依据的表达式。

  3. 如果不想在查询中显示表达式，则清除新行的"输出"列。

  4. 在"排序类型"列中，选择"升序"或"降序"，然后在"排序次序"列中选择表达式的排序优先级。

使用表达式进行搜索

有两种用表达式进行搜索的方法。表达式可作为比较值的条件，或充当所比较的值。

下例说明如何将表达式作为 WHERE 子句中的条件：

SELECT ord_num, ord_date
FROM sales
WHERE (price * .9) > 20

相反，下例说明表达式的另一种用法，即表达式充当所比较的值：

SELECT ord_num, ord_date
FROM sales
WHERE (ord_date >= DATEADD(day, -10, GETDATE() ) )

指定搜索表达式的方法取决于表达式是作为搜索条件还是搜索值出现。

将表达式作为条件使用

  1. 在网格窗格中，插入一个新网格行。

  2. 在新网格行的"列"列中，键入要作为条件使用的表达式。

  3. 在新行的"准则"列中，键入要同条件进行比较的值。

将表达式作为搜索值使用

  1. 如果网格窗格中还没有要搜索的数据列或表达式，请添加该数据列或表达式。

  2. 在该数据列或表达式的"准则"列中，输入作为搜索值的表达式。

请参见

创建表达式 | 表达式函数 | 表达式运算符 | 表达式预定义变量 | 对 SQL Server 数据库使用查询设计器时的注意事项


在查询中包含用户定义函数

可以在查询中包含用户定义函数。可以包含三种函数中的任意一种：

  • 用于返回表的不可更新函数

  • 用于返回表的可更新函数

  • 用于返回标量的函数

在查询或视图中包含可更新或不可更新的表函数

  1. 设计要在其中添加函数的查询。在查询设计器中，确定关系图窗格是可视的。

  2. 在 SQL Server 企业管理器中，展开"数据库"节点和正使用的数据库的特定节点。

  3. 单击"用户定义函数"节点。

  4. 从函数列表中将函数拖动到关系图窗格上。

在查询或视图中包含标量函数

  1. 设计要在其中添加函数的查询。在查询设计器中，确定网格窗格是可视的。

  2. 在 SQL Server 企业管理器中，展开"数据库"节点和正使用的数据库的特定节点。

  3. 单击"用户定义函数"节点。

  4. 在网格窗格的第一个空行中，在"列"列中输入函数名。

请参见

用户定义函数


在行组上查询

可以创建这样的查询结果：每个结果行与原始数据中的整个行组相对应。若要了解有关创建这类查询的逻辑原理，请参见折叠行组。

若要了解有关创建这类查询的详细信息，请参见下表中列出的主题：

若要 | 请参见
了解排除重复行 | 排除重复行
通过将数据组织成组来创建汇总信息的子集 | 对查询结果中的行分组
对符合特定条件的行数计数 | 对表中的行计数
为表中所有行的信息创建平均、求和或其它汇总信息 | 汇总表中所有行的值
使用计算创建汇总信息 | 使用自定义表达式汇总值
创建应用于行组的搜索条件 | 为组指定条件
对个别行和行组同时使用搜索条件 | 在同一查询中使用 HAVING 子句和 WHERE 子句


排除重复行

如果只想在结果集中看到唯一值，可以指定要从结果集中排除重复行。

从结果集中排除重复行

  1. 右击关系图窗格的背景，然后从快捷菜单中选择"属性页"命令。

  2. 在"属性页"窗口的查询选项卡中选择"唯一值"选项。

    查询设计器在 SQL 语句中所显示列的列表前面插入 DISTINCT 关键字。

    注意 如果使用 DISTINCT 关键字，则不能修改结果窗格中的结果集。

请参见

选择与值不匹配的行 | 指定搜索准则 | 折叠行组


对查询结果中的行分组

如果要创建小计或为表的子集显示其它汇总信息，请使用聚合查询创建组。每个组对表中具有相同值的所有行的数据进行汇总。

例如，可能想在 titles 表中查看书的平均价格，并将结果按出版商分组。为此，需要按出版商（如 pub_id）对查询分组。查询的输出结果可能象下面这样：

当对数据分组时，只能显示汇总或分组数据，例如：

  • 分组列的值（出现在 GROUP BY 子句中）。在上例中，pub_id 是分组列。

  • 由 SUM( ) 和 AVG( ) 等聚合函数生成的值。在上例中，第二列是对 price 列使用 AVG( ) 函数所生成的。

不能显示个别行中的值。例如，如果仅按出版商分组，则不能也在查询中显示个别的书名。因此，如果在查询输出中添加列，则查询设计器自动将这些列添加到 SQL 窗格中语句的 GROUP BY 子句中。如果要对列进行聚合，则可以为列指定聚合函数。

如果对多个列进行分组，则查询中的每个组显示所有分组列的聚合值。

例如，下面对 titles 表的查询按出版商 (pub_id) 和书的类型 (type) 进行分组。查询结果按出版商排序并显示出版商出版的每种不同类型的书的汇总信息：

SELECT pub_id, type, SUM(price) Total_price
FROM titles
GROUP BY pub_id, type

输出结果可能象下面这样：

对行进行分组

  1. 将要汇总的表添加到关系图窗格中以启动查询。

  2. 右击关系图窗格的背景，然后从快捷菜单中选择"分组"命令。查询设计器将"分组"列添加到网格窗格中的网格上。

  3. 将要分组的列添加到网格窗格中。如果要在查询输出中显示列，请务必将"输出"列选作输出列。

    查询设计器将 GROUP BY 子句添加到 SQL 窗格的语句中。例如，SQL 语句可能象下面这样：

    SELECT pub_id
FROM titles
GROUP BY pub_id
  4. 将要聚合的列添加到网格窗格中。确保将列标记为输出。

  5. 在要聚合的列的"分组"网格单元中，选择适当的聚合函数。

    查询设计器自动将列别名指派给正汇总的列。可以用更有意义的名称替换自动生成的别名。有关更多详细信息，请参见创建列别名。

SQL 窗格中相应的语句可能象下面这样：

SELECT   pub_id, SUM(price) AS Totalprice
FROM     titles
GROUP BY pub_id

请参见

为组指定条件 | 汇总和分组 | 汇总表中所有行的值 | 查询设计器中的汇总和分组行为 | 在行组上查询。


对表中的行计数

可以对表中的行计数以确定：

  • 表中的总行数，例如，计算 titles 表中所有书的数目。

  • 表中符合特定条件的行数，例如，titles 表中某出版商出版的书的数目。

  • 特定列中值的数目。

对列中的值计数时，空值不计算在内。例如，可计算 titles 表中在 advance 列中有值的书的数目。默认情况下，对所有值计数，而不只是对唯一值计数。

三种类型的计数过程相似。

对表中的所有行计数

  1. 确定要汇总的表已在关系图窗格中。

  2. 右击关系图窗格的背景，然后从快捷菜单中选择"分组"命令。查询设计器将"分组"列添加到网格窗格中的网格上。

  3. 在表示表或表结构化对象的矩形中选择"*（所有列）"。

    查询设计器自动将词"Count"填充到网格窗格中的"分组依据"列内，并给汇总的列分配列别名。可以用更有意义的名称替换自动生成的别名。有关更多详细信息，请参见创建列别名。

对符合条件的所有行计数

  1. 确定要汇总的表已在关系图窗格中。

  2. 右击关系图窗格的背景，然后从快捷菜单中选择"分组"命令。查询设计器将"分组"列添加到网格窗格中的网格上。

  3. 在表示表或表结构化对象的矩形中选择"*（所有列）"。

    查询设计器自动将词"Count"填充到网格窗格中的"分组"列内，并给汇总的列分配列别名。若要在查询输出中创建更有用的列标题，请参见创建列别名。

  4. 添加要搜索的数据列，然后在"输出"列中清除复选框。

    查询设计器自动将词"Group By"填充到网格的"分组"列中。

  5. 在"分组"列中将"Group By"改为"Where"。

  6. 在要搜索的数据列的"准则"列中，输入搜索条件。

对列中的值计数

  1. 确定要汇总的表已在关系图窗格中。

  2. 右击关系图窗格的背景，然后从快捷菜单中选择"分组"命令。查询设计器将"分组"列添加到网格窗格中的网格上。

  3. 将要计数的列添加到网格窗格。

    查询设计器自动将词"Group By"填充到网格的"分组"列中。

  4. 在"分组"列中将"Group By"改为"Count"。

注意 若要只对唯一值计数，请选择"Count Distinct"。

请参见

汇总和分组 | 汇总表中所有行的值 | 查询设计器中的汇总和分组行为


汇总或聚合表中所有行的值

使用聚合函数，可为表中的所有值创建汇总。例如，创建下面的查询以显示 titles 表中所有书的总价格：

SELECT SUM(price)
FROM titles

通过在多个列中使用聚合函数，可在同一查询中创建多个聚合。例如，可创建计算 price 列的合计和 discount 列的平均值的查询。

也可在同一查询中使用不同的方法（如合计、计数和平均）聚合同一个列。例如，下面的查询平均并汇总 titles 表中的 price 列：

SELECT AVG(price), SUM(price)
FROM titles

如果添加搜索条件，则可聚合符合条件的行的子集。

注意 还可对表中的所有行计数，或对符合特定条件的行计数。有关详细信息，请参见对表中的行计数。

当为表中的所有行创建一个单独的聚合值时，只能显示聚合值本身。例如，如果对 titles 表的 price 列值进行合计，则不能也显示个别的书名、出版商名称等。

注意 如果进行小计，即创建组，则可显示每组的列值。有关详细信息，请参见对查询结果中的行分组。

聚合所有行的值

  1. 确定要聚合的表已在关系图窗格中。

  2. 右击关系图窗格的背景，然后从快捷菜单中选择"分组"命令。查询设计器将"分组"列添加到网格窗格中的网格上。

  3. 将要聚合的列添加到网格窗格中。确保将列标记为输出。

    查询设计器自动将列别名指派给正汇总的列。可以用更有意义的名称替换自动生成的别名。有关详细信息，请参见创建列别名。

  4. 在"分组"网格列中选择适当的聚合函数，例如：Sum、Avg、Min、Max、Count。如果在结果集中只聚合唯一行，则选择带有 DISTINCT 选项的聚合函数，例如 Min Distinct。不要选择 Group By、Expression 或 Where，因为当聚合所有行时这些选项不再适用。

    查询设计器在 SQL 窗格的语句中用指定的聚合函数替换列名。例如，SQL 语句可能象下面这样：

    SELECT SUM(price)
FROM titles
  5. 如果要在查询中创建多个汇总，则重复步骤 3 和 步骤 4。

    当将其它列添加到查询输出列表中或按列表排序时，查询设计器自动将词"Group By"填充到网格的"分组"列中。选择适当的聚合函数。

  6. 添加搜索条件（若有）以指定要汇总的行的子集。

当执行查询时，结果窗格显示指定的聚合。

注意 查询设计器在 SQL 窗格中将聚合函数作为 SQL 语句的一部分来维护，直到显式关闭"分组依据"模式。因此，如果通过更改查询类型或更改关系图窗格中现有的表或表结构化对象来修改查询，所得到的查询中可能包含无效的聚合函数。

请参见

对表中的行计数 | 对查询结果中的行分组 | 汇总表中所有行的值 | 使用自定义表达式汇总值 | 查询设计器中的汇总和分组行为


使用自定义表达式汇总或聚合值

除使用聚合函数聚合数据外，还可以创建自定义表达式生成聚合值。在聚合查询中的任何地方都可以使用自定义表达式代替聚合函数。

例如，可能想对 titles 表创建一个查询，该查询不仅显示平均价格，而且显示如果打了折扣，平均价格将是多少。

不能包括基于只涉及表中个别行的计算的表达式；表达式必须基于聚合值，因为在计算表达式时，只有聚合值是可用的。

为汇总值指定自定义表达式

  1. 为查询指定组。有关详细信息，请参见对查询结果中的行分组。

  2. 移到网格窗格的空行，然后在"列"列中键入表达式。

    查询设计器会自动向该表达式指派列别名以在查询输出中创建有用的列标题。有关更多详细信息，请参见创建列别名。

  3. 在表达式的"分组"列中选择"表达式"。

请参见

对表中的行计数 | 汇总表中所有行的值 | 查询设计器中的汇总和分组行为


为组指定条件

通过为作为一个整体的组指定条件（即 HAVING 子句），可限定查询中出现的组。在对数据进行分组和聚合后，将用到 HAVING 子句中的条件。只有符合条件的组才出现在查询中。

例如，可能想在 titles 表中看到每个出版商出版的所有书的平均价格，但只显示平均价格超过 10.00 美元的书。在这种情况下，可为 HAVING 子句指定这样的条件：AVG(price) > 10。

注意 在某些情况下，在对作为一个整体的组应用条件之前，可能需要从组中排除个别的行。有关详细信息，请参见在同一查询中使用 HAVING 子句和 WHERE 子句。

可以通过使用 AND 和 OR 联接条件，为 HAVING 子句创建复杂的条件。有关在搜索条件中使用 AND 和 OR 的详细信息，请参见为一列指定多个搜索条件。

为组指定条件

  1. 为查询指定组。有关详细信息，请参见对查询结果中的行分组。

  2. 如果网格窗格中还没有条件所基于的列，请添加该列。（大多数情况下，条件包含已是组的列或汇总列。）不能使用不是聚合函数或 GROUP BY 子句的一部分的列。

  3. 在"准则"列中，指定应用于组的条件。

    查询设计器自动在 SQL 窗格的语句中创建 HAVING 子句，如下例所示：

    SELECT pub_id, AVG(price)
FROM titles
GROUP BY pub_id
HAVING (AVG(price) > 10)
  4. 对要指定的其它条件重复步骤 2 和 步骤 3。

请参见

对查询结果中的行分组 | 汇总和分组 | 查询设计器中的汇总和分组行为 | 在同一查询中使用 HAVING 子句和 WHERE 子句


在同一查询中使用 HAVING 子句和 WHERE 子句

在某些情况下，在对作为一个整体的组应用条件之前（使用 HAVING 子句），可能需要从组中排除个别的行（使用 WHERE 子句）。

HAVING 子句与 WHERE 子句类似，但只应用于作为一个整体的组（即应用于在结果集中表示组的行），而 WHERE 子句应用于个别的行。查询可同时包含 WHERE 子句和 HAVING 子句。在这种情况下：

  • 首先将 WHERE 子句应用于表中的个别行或关系图网格中的表结构化对象。只对符合 WHERE 子句条件的行进行分组。

  • 然后将 HAVING 子句应用于由分组生成的结果集中的行。只有符合 HAVING 子句条件的组才出现在查询输出中。只能将 HAVING 子句应用于也出现在 GROUP BY 子句或聚合函数中的列。

例如，假设联接 titles 和 publishers 表以创建一个查询，显示一组出版商出版的书的平均价格。只想看到一组特定出版商（可能只是加利福尼亚州 (CA) 的出版商）出版的书的平均价格。甚至只想看到超过 10.00 美元的平均价格。

在计算平均价格前，可以包含 WHERE 子句以建立第一个条件，该条件将放弃不在加利福尼亚州 (CA) 的出版商。第二个条件需要 HAVING 子句，因为该条件基于数据的分组和汇总结果。所得到的 SQL 语句可能象下面这样：

SELECT titles.pub_id, AVG(titles.price)
FROM titles INNER JOIN publishers
   ON titles.pub_id = publishers.pub_id
WHERE publishers.state = 'CA'
GROUP BY titles.pub_id
HAVING AVG(price) > 10

可在查询设计器的网格窗格中创建 HAVING 和 WHERE 子句。默认情况下，如果为列指定了搜索条件，该条件就成为 HAVING 子句的一部分。但可以将条件改为 WHERE 子句。

可以创建包含同一列的 WHERE 子句和 HAVING 子句。为此，必须将该列向网格窗格中添加两次，然后将一个实例指定为 HAVING 子句的一部分，将另一个实例指定为 WHERE 子句的一部分。

在聚合查询中指定 WHERE 条件

  1. 为查询指定组。有关详细信息，请参见对查询结果中的行分组。

  2. 如果网格窗格中还没有 WHERE 条件所基于的列，请添加该列。

  3. 清除"输出"列，除非数据列是 GROUP BY 子句的一部分或包含在聚合函数中。

  4. 在"准则"列中指定 WHERE 条件。查询设计器将该条件添加到 SQL 语句的 HAVING 子句中。

    注意 该过程示例中所显示的查询联接两个表：titles 和 publishers。

    在此时的查询中，SQL 语句中包含 HAVING 子句：

    SELECT titles.pub_id, AVG(titles.price)
FROM titles INNER JOIN publishers
   ON titles.pub_id = publishers.pub_id
GROUP BY titles.pub_id
HAVING publishers.state = 'CA'
  5. 在"分组"列中，从分组和汇总选项列表中选择"Where"。查询设计器将该条件从 SQL 语句的 HAVING 子句中删除并将其添加到 WHERE 子句中。

    SQL 语句改为包含 WHERE 子句：

    SELECT titles.pub_id, AVG(titles.price)
FROM titles INNER JOIN publishers
   ON titles.pub_id = publishers.pub_id
WHERE publishers.state = 'CA'
GROUP BY titles.pub_id

请参见

对查询结果中的行分组 | 为组指定条件 | 查询设计器中的汇总和分组行为


使用多个表进行查询

查询结果可包含多个表或表结构化对象中的数据。若要组合多个表结构化对象中的数据，请使用 SQL 的 JOIN 操作。有关更多信息，请参见组合表。

有关使用多个表创建查询的信息，请参见下列主题：

若要 | 请参见
了解联接表的不同方式 | 联接类型
了解查询设计器如何在关系图窗格中显示联接信息 | 查询设计器表示联接的方式
由查询设计器决定是否应联接表 | 自动联接表
自己联接表 | 手工联接表
指定应使用等于 (=) 以外的运算符联接表 | 修改联接运算符
指定即使某些行与对应表中的行不匹配，联接表也应包括这些行 | 创建外联接
利用联接在单个表中查找数据的子集。 | 创建自联接
删除表之间的联接 | 删除联接


自动联接表

当将两个或更多的表添加到查询时，查询设计器会尝试确定这些表是否相关。如果相关，查询设计器将在代表表或表结构化对象的矩形之间自动加上联接线。

如果符合下列条件，查询设计器将把表识别成联接：

  • 数据库包含指定表是相关的信息。

  • 如果两个列（各在一个表中）有相同的名称和数据类型。列必须至少在其中一个表中是主键。例如，如果添加 employee 和 jobs 表，如果 job_id 列是 jobs 表的主键，而且两个表中都有一个名为 job_id 且数据类型相同的列，查询设计器将自动联接这两个表。

    注意 查询设计器将仅创建一个联接，该联接基于那些具有相同名称和数据类型的列。如果可以创建一个以上的联接，查询设计器将在基于所发现的第一组匹配列创建一个联接后停止。

  • 查询设计器检测到搜索条件（WHERE 子句）实际上是联接条件。例如，可以添加 employee 和 jobs 表，然后创建一个搜索条件来搜索两个表中 job_id 列的相同值。在执行时，查询设计器检测到搜索条件产生了一个联接，于是基于该搜索条件创建一个联接条件。

如果查询设计器创建的联接对查询不合适，可以修改这个联接或将其删除。有关详细信息，请参见修改联接运算符和删除联接。

如果查询设计器不自动联接查询中的表，可以自己创建联接。有关详细信息，请参见手工联接表。

请参见

创建外联接 | 创建自联接 | 查询设计器表示联接的方式 | 自动联接表 | 手工联接表 | 修改联接运算符 | 使用多个表进行查询 | 删除联接 | 联接类型


手工联接表

当将两个或多个表添加到查询时，查询设计器会尝试根据公用数据或存储在数据库中有关表的相关方式的信息来联接这些表。有关详细信息，请参见自动联接表。但是，如果查询设计器没有自动联接表，或者如果想在表之间创建附加的联接条件，则可以手工联接表。

可以基于对任何两列的比较来创建联接，而不仅仅是基于包含相同信息的列。例如，如果数据库包含 titles 和 roysched 两个表，可以将 titles 表中 ytd sales 列的值和 roysched 表中 lorange 和 hirange 列的值做一个比较。创建该联接将使您得以查找特定的书名，这些书名截止到目前的年销售额位于版税的最高和最低范围之内。

提示 如果联接条件中的列已有索引，则联接速度最快。在某些情况下，联接没有索引的列可能使查询速度变慢。有关使用可视化数据库工具创建索引的信息，请参见索引。

手工联接表或表结构化对象

  1. 将要联接的对象添加到关系图窗格中。

  2. 拖动第一个表或表结构化对象中的联接列名，并将其放在第二个表或表结构化对象中的相关列上。联接不能以 text、ntext 或 image 列为依据。

    注意 联接列必须有相同（或兼容）的数据类型。例如，如果第一个表中的联接列是日期数据类型，则必须使其与第二个表中的日期列相关。另一方面，如果第一个联接列是整型数据类型，则相关的联接列必须也是整型数据类型，但可以有不同的大小。查询设计器不检查用于创建联接的列的数据类型，但是当执行查询时，如果数据类型不兼容，数据库将显示错误。

  3. 如果必要，更改联接运算符；默认情况下，运算符是等号 (=)。有关背景信息，请参见联接比较运算符。有关详细信息，请参见修改联接运算符。

查询设计器将一个 INNER JOIN 子句添加到 SQL 窗格中的 SQL 语句。可以将类型更改为外联接。有关详细信息，请参见创建外联接。

请参见

查询设计器表示联接的方式 | 使用多个表进行查询 | 联接类型


在多列上联接表

可以将表与多列联接。也就是说，可以创建一个查询，只有当两个表中的行满足多个条件时该查询才匹配这些行。有关背景信息，请参见联接列。如果数据库包含使一个表中的多个外键列与另一表中的多列主键相匹配的关系，则可以使用这个关系创建多列联接。有关详细信息，请参见自动联接表。

即使数据库不包含多列外键关系，也可以手动创建多列联接。

手动创建多列联接

  1. 将要联接的表添加到关系图窗格中。

  2. 拖动第一个表窗口中的第一个联接列名，将其放到第二个表窗口中的相关列上。联接不能以 text、ntext 或 image 列为依据。

    注意 通常情况下，联接列必须有相同（或兼容）的数据类型。例如，如果第一个表中的联接列是日期数据类型，则必须使其与第二个表中的日期列相关。另一方面，如果第一个联接列是整型数据类型，则相关的联接列必须也是整型数据类型，但可以有不同的大小。但是，SQL Server 提供隐性数据类型转换，以使表面上不兼容的列之间的许多联接有效。
    查询设计器不检查用于创建联接的列的数据类型，但是当执行查询时，如果数据类型不兼容，数据库将显示错误。

  3. 拖动第一个表窗口中的第二个联接列名，将其放到第二个表窗口中的相关列上。

  4. 对两个表中每个附加的联接列对重复步骤 3。

请参见

自动联接表 | 手工联接表 | 使用多个表进行查询


修改联接运算符

默认情况下，查询设计器利用等号（同等联接）联接表，等号使两个联接列中的值匹配。如果愿意，可以更改用于比较联接列中的值的运算符。

修改联接运算符

  1. 在关系图窗格中右击要修改的联接线，然后从快捷菜单中选择"属性"命令。

  2. 在"属性"对话框的联结线选项卡中，从列表中选择一个新的运算符。
    –或–
    在 SQL 窗格的 SQL 语句中更改运算符。

请参见

自动联接表 | 手工联接表 | 使用多个表进行查询


创建外联接

默认情况下，查询设计器在两个表之间创建内联接。如果要在结果集中包含在联接表中没有匹配项的数据行，可以创建外联接。

当创建外联接时，表在 SQL 语句中出现的顺序（与在 SQL 窗格中反映的一样）非常重要。添加的第一个表成为"左"表，第二个表成为"右"表。（表在关系图窗格中出现的实际顺序并不重要。）当指定左或右外联接时，即是指明将表添加到查询中的顺序以及表在 SQL 窗格的 SQL 语句中出现的顺序。

创建外联接

  1. 自动或手动创建联接。有关详细信息，请参见自动联接表或手工联接表。

  2. 在"关系图"窗格中选择联接线，然后从快捷菜单中选择"选择表中的全部行"命令，选择包含要将表的附加行都包括进去的那条命令。

    –或–

    在关系图窗格中，右击想更改为外联接的联接线，然后从快捷菜单中选择"属性"命令。在"属性"对话框的联接线选项卡中的"包括行"选项下，选择选项以指定要包括其全部行的表。

    • 选择第一个表以创建左外联接。

    • 选择第二个表以创建右外联接。

    • 选择两个表以创建完整外联接。

当指定外联接时，查询设计器会修改联接线以表示外联接。

此外，查询设计器还修改 SQL 窗格中的 SQL 语句，以反映联接类型的更改，如下面的语句中所示：

SELECT employee.job_id, employee.emp_id,
   employee.fname, employee.minit, jobs.job_desc
FROM employee LEFT OUTER JOIN jobs ON
    employee.job_id = jobs.job_id

因为外联接包括不匹配行，可以利用外联接查找违反外键约束的行。为此，需要先创建外联接，然后添加搜索条件，以查找最右边表的主键列是空值的行。例如，下面的外联接在 employee 表中查找在 jobs 表中没有对应行的行：

SELECT employee.emp_id, employee.job_id
FROM employee LEFT OUTER JOIN jobs
   ON employee.job_id = jobs.job_id
WHERE (jobs.job_id IS NULL)

请参见

查询设计器表示联接的方式 | 使用多个表进行查询 | 联接类型


自动创建自联接

如果表在数据库中有自反关系，可自动将其与自身联接。

自动创建自联接

  1. 将要使用的表添加到关系图窗格中。

  2. 再次添加同一个表，以使关系图窗格在关系图窗格内显示两次同一个表。
    查询设计器通过在表名中添加连续的数字，为第二个实例分配别名。另外，查询设计器还在代表该表参与查询的两种不同方式的两个矩形之间创建联接线。

请参见

绘制自反关系


手动创建自联接

即使表在数据库中没有自反关系，也可将表与自身联接。例如，可以利用自联接查找居住在同一个城市中的两个作者。

与任何联接一样，自联接至少需要两个表。不同的是，自联接不是将另一个表添加到查询，而是添加同一个表的第二个实例。这样，可以将表的第一个实例中的列与第二个实例中的相应列进行比较，这就使得可以相互比较列中的值。查询设计器为表的第二个实例指派别名。

例如，如果创建自联接以查找居住在 Berkeley 的所有作者对，则对表的第一个实例中的 city 列和第二个实例中的 city 列进行比较。所得到的查询可能象下面这样：

   SELECT
         authors.au_fname,
         authors.au_lname,
         authors1.au_fname AS Expr2,
         authors1.au_lname AS Expr3
      FROM
         authors
            INNER JOIN
            authors authors1
               ON authors.city
                = authors1.city
      WHERE
         authors.city = 'Berkeley'

创建自联接通常需要多个联接条件。为了解其中的原因，请考察前面查询的结果：

   Cheryl Carson       Cheryl Carson
   Abraham Bennet      Abraham Bennet
   Cheryl Carson       Abraham Bennet
   Abraham Bennet      Cheryl Carson

第一行没有用，只是表示 Cheryl Carson 与 Cheryl Carson 居住在同一个城市。第二行同样没有用。若要消除这类无用数据，请添加另一个条件以便只保留两个作者名分别描述不同作者的结果行。所得到的查询可能象下面这样：

   SELECT
         authors.au_fname,
         authors.au_lname,
         authors1.au_fname AS Expr2,
         authors1.au_lname AS Expr3
      FROM
         authors
            INNER JOIN
            authors authors1
               ON authors.city
                = authors1.city
               AND authors.au_id
                <> authors1.au_id
      WHERE
         authors.city = 'Berkeley'

结果集得到改进：

   Cheryl Carson       Abraham Bennet
   Abraham Bennet      Cheryl Carson

但有两个结果行是冗余的。第一个结果行表示 Carson 与 Bennet 居住在同一个城市，第二个结果行表示 Bennet 与 Carson 居住在同一个城市。若要消除这类冗余的结果行，可将第二个联接条件由"not equals"改为"less than"。所得到的查询可能象下面这样：

   SELECT
         authors.au_fname,
         authors.au_lname,
         authors1.au_fname AS Expr2,
         authors1.au_lname AS Expr3
      FROM
         authors
            INNER JOIN
            authors authors1
               ON authors.city
                = authors1.city
               AND authors.au_id
                < authors1.au_id
      WHERE
         authors.city = 'Berkeley'

结果集将是下面这样：

   Cheryl Carson       Abraham Bennet

手动创建自联接

  1. 将要使用的表或表结构化对象添加到关系图窗格中。

  2. 再次添加同一个表，以使关系图窗格在关系图窗格内显示两次同一个表或表结构化对象。

    查询设计器通过在表名中添加连续的数字，为第二个实例分配别名。另外，查询设计器还在关系图窗格内表或表结构化对象的两个实例之间创建联接线。

  3. 右击联接线，从快捷菜单中选择"属性"命令，然后根据需要更改主键之间的比较运算符。例如，可以将运算符改为小于 (<)。

  4. 拖动表或表结构化对象的第一个实例中的主联接列名，并将其放在第二个实例中的相应列上以创建附加的联接条件（如 authors.zip = authors1.zip)。

  5. 为查询指定其它选项，如输出列、搜索条件和排序次序。

请参见

使用多个表进行查询


删除联接

如果不想让表通过内联接或外联接进行联接，可以删除表之间的联接。例如，可以删除由查询设计器自动在两个表之间创建的联接。

注意 从查询中删除联接将改变数据库中的基础关系。

如果两个联接表是查询的一部分，并且删除了它们之间的全部联接条件，所得到的查询将成为两个表的积 — 即查询变成 CROSS JOIN。有关更多信息，请参见联接类型。

删除联接

  • 在关系图窗格中选择要删除联接的联接线，然后按 DELETE 键。可以同时选择和删除多个联接线。

查询设计器删除联接线并改变 SQL 窗格中的语句。

请参见

自动联接表 | 手工联接表 | 使用多个表进行查询


操作数据

使用查询设计器或视图设计器除查看表的内容外，还可以修改表中的数据，比如编辑列的内容、添加新行以及删除现有的行。利用查询设计器和视图设计器的图形功能，可以通过两种方式修改表中的数据：

  • 执行选择查询，然后直接在结果窗格中编辑数据。

  • 创建查询来更新、删除或复制表中或可更新视图中的数据。

注意 如果熟悉 SQL，也可以在 SQL 窗格中执行任何语句，包括在表中或可更新的视图中对数据进行更新或删除的那些语句。本节讨论的功能主要与使用关系图、网格和结果窗格的可用功能有关。

直接在结果窗格中编辑类似于在窗体或电子表格中编辑。可以立即看到所做的更改，而且如果有问题（例如，试图输入与列的数据类型不匹配的数据），则一旦试图移动到另一行，就会立即通知您有问题。有关详细信息，请参见在结果窗格中编辑行。

或者，也可以创建查询以在一个操作中更新、删除或复制多行数据。例如，可以创建一个查询来更改在公司工作五年以上的所有员工的状态；也可以创建两个查询以便先复制、然后再删除所有两年以上的订单。

请参见

在结果窗格中添加新行 | 创建删除查询 | 在结果窗格中删除行 | 在结果窗格中编辑行


在结果窗格中编辑行

许多情况下，可以在结果窗格网格中编辑数据，并将更改保存到查询所表示的表中。但是，实际上能否更改、添加或删除行，取决于所定义的查询类型以及数据库所维护的约束、触发器和权限。

有关可更新的查询类型的详细信息，请参见结果更新规则。

注意 不能用查询设计器更新 timestamp 列和 binary 列。

查询设计器或视图设计器只能对输入到结果窗格中的数据进行简单的验证。例如，如果 titles 表中的 price 列只接受正值，查询设计器或视图设计器可能不强制该限制，而且可能输入负值。但是，当保存某行时，如果该行中的任何一列有无效数据，数据库将报告错误。

在结果窗格中编辑数据

  1. 浏览到包含要更改的数据的单元。

键入新数据。当进行编辑时，最左边的列显示 [image] ，表示正在对该行进行编辑。
进行编辑时应遵循下列规则：

  • 当输入数字、货币、时间或日期信息时，根据 Windows"控制面板"中"区域设置"对话框中的规格使用一种可识别的格式。

  • 若要将 NULL 值输入到单元中，请按 CTRL+0 键。

  • 如果列不显示 <Long Text>，则可以编辑备注类型的列（如文本、备注或长字符列）。在备注类型的列中，结果窗格最多可以接受 900 个文本字符。如果在单元中键入且超过了结果窗格所能接受的文本量，查询设计器将发出声响以指出已超过文本量限制。

  • 不能编辑 BLOB 数据。
  2. 移动到网格中的另一行以保存更改。

    注意 如果切换到另一个窗格，则查询设计器或视图设计器不会自动保存所做的更改。如果编辑当前查询（如在网格窗格中进行更改），结果窗格将变暗。但是，该窗格仍是活动的，您仍可以在所处理的行上进行编辑和保存。

若要取消对当前行所做的更改，请按 ESC 键。如果在已更改的单元中按 ESC 键，则只取消对该单元所做的更改。如果在未更改的单元中按 ESC 键，则将取消对整行所做的更改，而且该行中的所有单元都将还原回原来的值。

您正在使用的结果可能与其他用户所做的更改有冲突。例如，您可能正在使用结果窗格编辑某行，这时其他用户执行了更新查询，而该查询修改了您正在编辑的行。

当保存已编辑的行时，查询设计器或视图设计器会将该行同数据库中的当前版本进行比较。如果存在差别，将出现一条消息指出不能在数据库中定位目标行。可以再次运行查询或视图以刷新结果窗格并查看其他用户所做的修改。

请参见

在结果窗格中添加新行 | 在结果窗格中删除行 | 在查询设计器中浏览 | 结果更新规则


在结果窗格中添加新行

如果可以在结果窗格中修改数据，则也可以添加新行。

注意 不能用结果窗格添加 BLOB 列或 binary 列。

查询设计器和视图设计器只能对在结果窗格中输入的数据进行简单的数据验证。例如，如果 titles 表的 price 列只接受正值，查询设计器或视图设计器可能强制该限制，而且可能在输入负值时显示错误信息。另一方面，如果在数据库中定义该列只接受一定范围内（比如在 100 到 1000 之间）的价格，则查询设计器或视图设计器不能强制该限制。当保存某行时，如果该行中的任何一列包含无效数据，数据库将显示错误信息。

添加一行时，某些列可能由默认值或触发器填充。在许多情况下，查询设计器或视图设计器可以刷新新行的显示，以显示自动生成的值。但是，如果行的主键是下面这些情况，则不能对行进行刷新：

  • 不是结果集的一部分。

  • 是自动生成的。

  • 是由触发器进行修改的。

在这些情况下，如果要在行存储在数据库中时看到该行，则必须重新执行查询。然而即使这样，如果新行与所执行的查询中的搜索条件不匹配，该行也可能不会出现。

可以通过键入或从剪贴板粘贴来添加新数据。粘贴的行与要粘贴到的表必须具有完全相同的列数和列类型。可以同时将多行粘贴到结果窗格中。

添加新数据行

  1. 浏览到结果窗格的底部，那里有一个空行可用来添加新数据行。

    提示 通过按 INS 键或右击结果窗格，然后选择"新建"命令，可以从结果窗格的任何位置跳到窗格的底部。

  2. 如果要从剪贴板粘贴行，请单击新行左边的按钮以选定新行。

  3. 为新行输入数据。如果是粘贴，可从快捷菜单中选择"粘贴"命令。

    提示 若要将空值输入到单元中，请按 CTRL+0 键。

  4. 移动到网格中的另一行以保存新行。

    注意 如果切换到另一个窗格，则查询设计器或视图设计器不会自动保存所做的更改。如果编辑当前的查询或视图（如在网格窗格中进行更改)，结果窗格将变灰。但是，该窗格仍是活动的，您仍可以在所处理的行上进行编辑和保存。

如果在保存行时出现错误（例如，将不接受空值的列置空），查询设计器将显示数据库所提供的错误信息，然后返回到刚才编辑的行上。这时可以这样做：

  • 在该行中做进一步编辑以解决这个错误。

  • 按 ESC 键以取消编辑。如果在已更改的单元中按 ESC 键，将取消对该单元所做的更改。如果在未更改的单元中按 ESC 键，则将取消对整行所做的更改。

请参见

在结果窗格中删除行 | 在结果窗格中编辑行 | 在查询设计器中浏览 | 结果更新规则


在结果窗格中删除行

如果可以在结果窗格中修改数据，则也可以删除现有行。

删除行

  1. 在结果窗格网格中选择要删除的行左边的框。

  2. 按 DELETE 键。

    注意 以此方式删除的行将从数据库中被永久删除，不能撤回。

请参见

在结果窗格中添加新行 | 在结果窗格中编辑行 | 在查询设计器中浏览 | 结果更新规则


创建更新查询

通过使用更新查询，可以在一次操作中更改多行的内容。例如，在 titles 表中，可以使用更新查询将某特定出版商的所有书籍价格提高 10%。

创建更新查询时指定：

  • 要更新的表

  • 要进行内容更新的列

  • 用于更新单个列的值或表达式

  • 定义要更新行的搜索条件

例如，下面的查询通过将某个出版商的所有书籍价格提高 10% 而对 titles 表进行更新：

UPDATE titles
SET price = price * 1.1
WHERE (pub_id = '0766')

注意 不能撤消执行更新查询的操作。作为预防措施，请在执行 INSERT INTO 查询前备份数据。

创建更新查询

  1. 将要更新的表添加到关系图窗格。

  2. 在查询设计器窗口右击，指向"更改类型"菜单，然后选择"更新"命令。

    注意 当启动更新查询时，如果"关系图"窗格中显示的表不止一个，查询设计器将显示更新表对话框，提示您输入要更新的表名。

  3. 将要更新的数据列添加到查询中以定义更新数据列。有关详细信息，请参见添加列。只有将列添加到查询中后，列才被更新。

  4. 在网格窗格的"新值"列中输入列的更新值。可以输入字面值、列名或表达式。值必须与所更新的列的数据类型相匹配（或兼容）。

    注意 查询设计器无法检查值是否适合正更新的列的长度。如果提供的值太长，则可能会被截断而不警告。例如，如果 name 列的长度是 20 个字符，但指定的更新值是 25 个字符，则最后的 5 个字符可能会被截断。

  5. 在"准则"列中输入搜索条件以定义要更新的行。有关详细信息，请参见指定搜索条件。
    如果未指定搜索条件，则指定表中的所有行都将被更新。

注意 当将某列添加到网格窗格中作为搜索条件时，查询设计器也将该列添加到待更新列的列表中。如果想将某列作为搜索条件，但不对其进行更新，请在表示表或表结构化对象的矩形中清除该列名旁边的复选框。

当执行更新查询时，结果窗格中将不报告任何结果。而是显示一条消息指出已更改的行数。

请参见

创建删除查询 | 支持的查询类型


创建 INSERT FROM 查询

通过 INSERT FROM 查询，可以将行从一个表复制到另一个表中或在同一个表内复制。例如，在 titles 表中，可以通过 INSERT FROM 查询，将有关某个出版商所有书籍的信息都复制到另一个表中，并使该表可由该出版商使用。 INSERT FROM 查询类似于生成表查询，不同的是将行复制到现有的表中。

提示 还可以通过剪切和粘贴的方法，将行从一个表复制到另一个表中。有关详细信息，请参见在结果窗格中添加新行。

创建 INSERT FROM 查询时指定：

  • 将行复制到的数据库表（目的表）。

  • 从其中复制行的表（源表）。源表或表成为子查询的一部分。如果是在表内进行复制，则源表和目的表相同。

  • 源表中要进行内容复制的列。

  • 将数据复制到的目的表中的目标列。

  • 定义要复制的行的搜索条件。

  • 排序次序（如果要以特定的顺序对行进行复制）。

  • "分组"选项（如果只对汇总信息进行复制）。

例如，下面的查询将书名信息从 titles 表复制到一个名为 archivetitles 的存档表中。该查询对属于某个出版商的所有书名的四列内容进行复制：

INSERT INTO archivetitles
   (title_id, title, type, pub_id)
SELECT title_id, title, type, pub_id
FROM titles
WHERE (pub_id = '0766')

注意 若要将值插入到新行中，请使用 INSERT INTO 查询。

可以对行中的选定列或所有列的内容进行复制。在任何一种情况下，所复制的数据都必须与要复制到的行中的列兼容。例如，如果复制某列（如 price 列）的内容，要复制到的行中的列必须接受带小数位数的数字型数据。如果要对整行进行复制，则目的表必须具有和源表的物理位置相同的兼容列。

当创建 INSERT FROM 查询时，网格窗格将更改以反映可用于复制数据的选项。添加了一个"追加"列，以允许指定数据应复制到的列。

注意 不能撤消执行从中插入查询的操作。作为预防措施，请在执行 INSERT INTO 查询前备份数据。

创建 INSERT FROM 查询

  1. 在查询设计器窗口右击，指向"更改类型"菜单，然后选择"从中插入"命令。

  2. 在为 INSERT FROM 查询选择表对话框中，选择将行复制到的表（目的表）。

    注意 查询设计器无法事先确定可以更新哪些表和视图。因此，在"为 INSERT FROM 查询选择表"对话框的"表名"列表中，将显示出所查询的数据连接中所有可用的表和视图，甚至包括或许不能将行复制到的那些表和视图。

  3. 将要从中复制行的表（源表）添加到查询中。有关详细信息，请参见添加表。如果是在表内复制行，则可以将源表作为目的表添加。
    源表中的数据列出现在关系图窗格的输入窗口中。

  4. 在表示表或表结构化对象的矩形中，选择要进行内容复制的列名。若要复制整行，请选择"*（所有列）"。

    查询设计器将选择的列添加到网格窗格的"列"列中。

  5. 在网格窗格的"追加"列中，在目的表中为要复制的每列选择一个目标列。如果要复制整行，则选择表名.*。目的表中的各列必须与源表中的各列有相同（或兼容）的数据类型。

  6. 如果要以特定的顺序对行进行复制，请指定排序次序。有关详细信息，请参见对查询结果排序。

  7. 在"准则"列中输入搜索条件以指定要复制的行。有关详细信息，请参见指定搜索条件。
    如果没有指定搜索条件，则源表中的所有行都将被复制到目的表中。

注意 当将要搜索的列添加到网格窗格时，查询设计器也将该列添加到待复制列的列表中。如果要将某列作为搜索条件但不对其进行复制，则在表示表或表结构化对象 [image] 的矩形中清除该列名旁边的复选框。

  8. 如果要复制汇总信息，请指定"分组"选项。有关详细信息，请参见汇总表中所有行的值。

当执行 INSERT FROM 查询时，结果窗格中将不报告任何结果。而是显示一条消息指出已复制的行数。

请参见

创建删除查询 | 创建更新查询 | 支持的查询类型


创建删除查询

通过使用删除查询，可以在一次操作中删除多行。当创建删除查询时，指定要从中删除行的数据库表以及定义要删除的行的搜索条件。

注意 当从表中删除所有行时，只是清除表中的数据，并不删除表本身。可以使用数据库设计器删除表。有关如何使用数据库设计器的信息，请参见数据库设计器。

当创建删除查询时，网格窗格将更改以反映可用于删除行的选项。因为不在删除查询中显示数据，所以输出、排序依据和排序次序列将被删除。另外，因为不能指定要删除的单个列，在表示表或表结构化对象的矩形中的列名旁边的复选框将被删除。

注意 不能撤消执行删除查询的操作。作为预防措施，请在执行删除查询前备份数据。

创建删除查询

  1. 将要从中删除行的表添加到关系图窗格。

  2. 在查询设计器窗口右击，指向"更改类型"菜单，然后选择"删除"命令。

    注意 当启动删除查询时，如果关系图窗格中显示的表不止一个，查询设计器将显示删除表对话框，提示您输入要从中删除行的表名。

  3. 输入搜索条件以定义要删除的行。有关详细信息，请参见指定搜索条件。如果未指定搜索条件，则指定表中的所有行都将被删除。

    注意 因为不能删除单个列的内容，所以当启动删除查询时，表示表或表结构化对象的矩形中的复选框将被删除。若要在网格窗格中添加作为搜索条件的列，请将这些列从表示表或表结构化对象的矩形中拖动到"列"列，或在"列"列中选择数据列。

当执行删除查询时，结果窗格中将不报告任何结果。而是显示一条消息指出已删除的行数。

请参见

支持的查询类型


创建 INSERT INTO 查询

可以使用 INSERT INTO 查询在当前表中创建新行。创建 INSERT INTO 查询时指定：

  • 将行添加到的数据库表。

  • 要添加内容的列。

  • 将要插入到单个列中的值或表达式。

例如，下面的查询将一行添加到 titles 表中，以指定书名、类型、出版商及价格的值：

INSERT INTO titles
         (title_id, title, type, pub_id, price)
VALUES   ('BU9876', 'Creating Web Pages', 'business', '1389', '29.99')

当创建 INSERT INTO 查询时，网格窗格将更改以反映仅可用于插入新行的选项：要插入的列名和值。

注意 不能撤消执行 INSERT INTO 查询的操作。作为预防措施，请在执行 INSERT INTO 查询前备份数据。

创建 INSERT INTO 查询

  1. 将要更新的表添加到关系图窗格。

  2. 在查询设计器中右击，指向"更改类型"菜单，然后选择"插入到"命令。

    注意 当启动 INSERT INTO 查询时，如果关系图窗格中显示的表不止一个，查询设计器将显示插入到对话框，提示您输入要更新的表名。

  3. 将数据列添加到查询中以定义要创建的数据列。有关详细信息，请参见添加列。只有将列添加到查询中后，列才被更新。

  4. 在网格窗格的"新值"列中输入列的新值。可以输入字面值、列名或表达式。值必须与所更新的列的数据类型相匹配（或兼容）。

    注意 查询设计器无法检查值是否适合正插入的列长。如果提供的值太长，则可能会被截断而不警告。例如，如果 name 列的长度是 20 个字符，但指定的插入值是 25 个字符，则最后的 5 个字符可能会被截断。

当执行 INSERT INTO 查询时，结果窗格中将不报告任何结果。而是显示一条消息指出已更改的行数。

请参见

操作数据


创建生成表查询

可以使用生成表查询将行复制到新表中，这对于创建要使用的数据子集，或将表的内容从一个数据库复制到另一数据库很有用。生成表查询类似于插入源查询，不同的是创建将行复制到其中的新表。

创建生成表查询时指定：

  • 新数据库表（目的表）的名称。

  • 从其中复制行的表（源表）。可以从单个表或联接表中进行复制。

  • 源表中要进行内容复制的列。

  • 排序次序（如果要以特定的顺序对行进行复制）。

  • 定义要复制的行的搜索条件。

  • "分组"选项（如果只对汇总信息进行复制）。

例如，下面的查询创建一个名为 uk_customers 的新表，并将 customers 表中的信息复制到该表中：

SELECT *
INTO uk_customers
FROM customers
WHERE country = 'UK'

为成功使用生成表查询：

  • 必须拥有在目标数据库中创建表的权限。

创建生成表查询

  1. 将一个或多个源表添加到关系图窗格。

  2. 在查询设计器窗口中右击，指向"更改类型"菜单，然后选择"创建表"命令。

  3. 在"生成表"对话框中，键入目的表的名称。查询设计器不检查该名称是否已经被使用，或者您是否有创建表的权限。
    若要在另一数据库中创建目的表，请指定完全合格的表名，包括目标数据库名、所有者（如果需要）以及表名。

  4. 将列添加到查询中以指定要复制的列。有关详细信息，请参见添加列。只有将列添加到查询中后，列才被复制。若要复制整行，请选择"*（所有列）"。
    查询设计器将选择的列添加到网格窗格的"列"列中。

  5. 如果要以特定的顺序对行进行复制，请指定排序次序。有关详细信息，请参见对查询结果排序。

  6. 输入搜索条件以指定要复制的行。有关详细信息，请参见指定搜索条件。
    如果没有指定搜索条件，则源表中的所有行都将被复制到目的表中。

注意 当将要搜索的列添加到网格窗格时，查询设计器也将该列添加到待复制列的列表中。如果要将某列作为搜索条件但不对其进行复制，则在表示表或表结构化对象 [image] 的矩形中清除该列名旁边的复选框。

  7. 如果要复制汇总信息，请指定"分组"选项。有关详细信息，请参见汇总表中所有行的值。

当执行生成表查询时，结果窗格中将不报告任何结果。而是显示一条消息指出已复制的行数。

请参见

操作数据


创建通用查询

在许多情况下，创建可以在应用程序中多次重新使用且每次采用不同输入值的查询是很有用的。本节包含有关如何创建这些通用参数查询的信息。

若要 | 请参见
了解有关通用查询的信息 | 参数查询
使用未命名参数创建查询 | 使用未命名参数创建查询
为查询中的参数指定名称，以帮助区分多个参数 | 使用命名参数创建查询
将名称标记为参数而非字面字符串 | 指定参数标记字符


使用未命名参数创建查询

通过将问号 (?) 指定为字面值的占位符，可以使用未命名参数创建查询。可以根据需要在查询中指定任意多个未命名参数。

注意 如果要使用多个参数，可以使用命名参数以帮助区分多个参数。有关详细信息，请参见使用命名参数创建查询。

当在查询设计器中运行查询时，将显示定义查询参数对话框，其中包含"?"作为参数名。

指定未命名参数

  1. 将要搜索的列或表达式添加到网格窗格中。如果不希望搜索列或表达式出现在查询输出中，则将其作为输出列删除。

找到含有要搜索的数据列或表达式的行，然后在"准则"网格列中输入一个问号 (?)。

默认情况下，查询设计器添加"="运算符。但是，可以对该单元进行编辑，用">"、"<"或任何其它的 SQL 比较运算符替代"="运算符。

请参见

使用命名参数创建查询 | 参数查询


使用命名参数创建查询

可以为查询中的参数指定名称以帮助区分多个参数。例如，如果创建一个用来提示输入作者名字的参数查询，可以使用参数名"first name"和"last name"。当在查询设计器中运行该查询时，将提示您按名称输入参数：

若要将参数名标记为名称而非字面字符串，请先指定参数标记字符，然后将这些字符放在参数名周围。有关详细信息，请参见指定参数标记字符。

如果同时使用前缀标记字符和后缀标记字符，则可以使用包括文字、数字、标点符号及空格在内的字符的任意组合来命名参数。（但是，不允许使用空值和问号。）如果仅指定前缀标记字符，则参数名不允许含有空格。

注意 指定的参数名在运行查询的环境中作为变量使用。确保所使用的参数名在所有要使用查询的环境中都被接受。

指定命名参数

  1. 如果尚未指定参数标记字符，则先指定参数标记字符。有关详细信息，请参见指定参数标记字符。

  2. 将要搜索的列或表达式添加到网格窗格中。如果要创建选择查询，并且不希望搜索列或表达式出现在查询输出中，则将其作为输出列删除。

  3. 找到含有要搜索的数据列或表达式的行，然后在"准则"网格列中输入参数名。确保用适当的字符标记参数：

默认情况下，查询设计器添加"="运算符。但是，可以对该单元进行编辑，用">"、"<"或任何其它的 SQL 比较运算符替代"="运算符。

请参见

使用未命名参数创建查询 | 参数查询 | 指定参数标记字符


指定参数标记字符

若要将名称标记为参数而非字面字符串，请在参数名的前面加上前缀（并可选择在后面加或不加后缀）。例如，参数标记字符可以是"@"、":"或"%"。

例如，可能在查询中定义一个名为"last name"的参数。为在 lname 列中将"last name"表示为参数而非要搜索的字符串，可能需要将参数标记字符指定为"["和"]"。然后可以输入"[last name]"作为搜索条件值，则查询设计器会正确地将"last name"解释为参数。

在极少的情况下，定义的参数标记字符还可能出现在参数名中。如果是这样，可以指定转义符。有关详细信息，请参见属性窗口的参数选项卡。

指定参数标记字符

  1. 右击查询设计器的任何窗格，然后从快捷菜单中选择"属性"命令。

  2. 在"属性"对话框中选择"参数"选项卡。

  3. 输入一个或多个参数前缀字符，如果想使用后缀字符，则输入后缀字符。（只有在指定了前缀字符后才能指定后缀字符。）如果需要指定转义符，则输入转义符。

请参见


使用视图

视图只是保存在数据库中的 SELECT 查询。因此，可对查询执行的大多数操作也可在视图上执行。但是，有一些操作不能同时适用于查询和视图。有关背景信息，请参见查询和视图的比较。

有关可在视图上执行的大多数操作的详细信息，请参见设计查询。有关视图所特有的操作的详细信息，请参见下表中列出的主题。

若要 | 请参见
创建视图 | 创建视图
创建索引视图 | 创建索引视图
修改索引视图 | 修改索引视图


创建视图

视图保存在数据库中而查询不是，因此创建新视图的过程与创建查询的过程不同。

创建视图

  1. 在 SQL Server 企业管理器中，右击"视图"节点，然后从快捷菜单中选择"新视图"命令。

  2. 象设计 SELECT 查询一样继续设计视图。

    注意 虽然可以象设计 SELECT 查询一样继续设计视图，但有一些限制。有关更多信息，请参见查询和视图的比较。

请参见

创建索引视图


创建索引视图

索引视图是其结果集存储在数据库中用于快速访问的视图。有关索引视图的更多背景信息，请参见索引视图。

创建索引视图

  1. 在 SQL Server 企业管理器中，确保数据库节点是展开的，而且目标数据库的节点也是展开的。

  2. 在"视图"节点上右击，然后从快捷菜单中选择"新建视图"命令。

  3. 将表添加到关系图窗格中。因为希望此视图成为索引视图，所以应确保只添加自己所拥有的表。

  4. 选择想在视图中包括的列。不要使用星号 (*)；必须显式地选择要在索引视图中出现的每一列。

  5. 右击关系图窗格的背景，然后从快捷菜单中选择"管理索引"命令。"索引"对话框出现。

    注意 在许多情况下"管理索引"命令不可用，因为对可以创建索引的视图有许多限制。例如，除非拥有分配给视图的每个表，否则不能为视图创建索引。有关索引视图的更多信息，请参见视图索引。

  6. 在对话框中单击"新建"命令。

  7. 提供有关索引定义如索引名、索引列及其顺序、索引文件组和其它索引设置的信息。有关这些设置的完整描述，请参见索引对话框。

  8. 单击"确定"按钮。

请参见

索引视图 | 修改索引视图 | 创建视图


修改索引视图

修改索引视图的方法有两种。可以修改视图，也可以修改视图上的索引。

修改索引视图

  1. 在 SQL Server 企业管理器中，确保数据库节点是展开的，而且目标数据库的节点也是展开的。

  2. 单击"视图"节点，右击目标视图，然后从快捷菜单中选择"设计视图"命令。

  3. 通过在关系图窗格、网格窗格和 SQL 窗格中操作视图定义继续修改视图。

注意 当保存已修改的视图时，其索引将被删除并重新创建。

修改索引视图的索引

  1. 在 SQL Server 企业管理器中，确保数据库节点是展开的，而且目标数据库的节点也是展开的。

  2. 单击"视图"节点，右击目标视图，然后从快捷菜单中选择"设计视图"命令。

  3. 右击关系图窗格的背景，然后从快捷菜单中选择"管理索引"命令。

  4. 修订索引定义如索引名、索引列及其顺序、索引文件组和其它索引设置的信息。有关这些设置的完整描述，请参见索引对话框。

  5. 单击"确定"按钮。

请参见

索引视图 | 创建索引视图


加密视图

可对视图加密。也就是说，可永久隐藏视图定义文本。

注意 该操作是不可逆的。对视图加密后，因为再也看不到视图定义，所以永远不能再对视图进行修改。如果需要修改加密视图，则必须删除该视图并重新创建一个。

对视图加密

  1. 在 SQL Server 企业管理器中，确保数据库节点是展开的，而且目标数据库的节点也是展开的。

  2. 单击"视图"节点，右击目标视图，然后从快捷菜单中选择"设计视图"命令。

  3. 右击关系图窗格的背景，然后从快捷菜单中选择"属性"命令。

  4. 选择"加密视图"命令并单击"关闭"按钮。

请参见

创建视图


参考

下列参考主题可用于可视化数据库工具：

  • 查询结果更新规则

  • 在查询设计器中浏览

  • 比较运算符

  • 逻辑运算符

  • 通配符

  • 搜索条件组合规则和网格窗格规范

  • 搜索值输入规则

  • 聚合函数

  • 表达式结构

  • 属性页

  • 对话框

  • 可视化数据库工具和 SQL Server 数据库

  • 错误信息


结果更新规则

在许多情况下，可以更新在结果窗格中显示的结果集。但在某些情况下则不能更新。

一般情况下，为了更新结果，查询设计器必须有足够的信息来唯一地标识表中的行。例如，查询在输出列表中包含主键。另外，必须有更新数据库的足够权限。

如果查询基于视图，或许能够更新查询。同样的准则不仅适用于视图本身，也适用于视图中的基础表。

注意 查询设计器不能事先确定能否更新基于视图的结果集。因此，查询设计器将显示出所有视图，即使或许不能更新所有视图。

下表汇总了特定的实例，在这些实例中或许能、或许不能在结果窗格中更新查询结果。

查询 | 能否更新结果？
基于一个表的查询，该表在输出列表中包含主键 | 是（下面列出的除外）。
基于表的查询，该表没有唯一索引和主键 | 查询必须包含唯一标识记录的足够信息。
基于多个没有联接的表的查询 | 否。
基于在数据库中被标记为只读的数据的查询 | 否。
基于视图的查询，该视图涉及一个没有约束的表 | 是（下面列出的除外）。
基于用一对一关系联接的表的查询 | 是（下面列出的除外）。
基于用一对多关系联接的表的查询 | 通常情况下。
基于用多对多关系联接的三个或更多表的查询 | 否。
基于未被授予更新权限的表的查询 | 能删除，但不能更新。
基于未被授予删除权限的表的查询 | 能更新，但不能删除。
聚合查询 | 否。
基于包含合计或聚合函数的子查询的查询 | 否。
包含排除重复行的 DISTINCT 关键字的查询 | 否。
FROM 子句包含返回表的用户定义函数，且该用户定义函数包含多个选择语句的查询 | 否。
FROM 子句包含内嵌用户定义函数的查询 | 是。

另外，或许不能更新查询结果中的特定列。下面的列表汇总了不能在结果窗格中更新的特定类型的列。

  • 基于表达式的列

  • 基于标量用户定义函数的列

  • 其他用户删除的行或列

  • 其他用户锁定的行或列（通常情况下，锁定的行一旦解锁即可更新）

  • 时间戳或 BLOB 列

请参见

参考


在查询设计器中浏览

在查询设计器中可使用键盘或鼠标。具体使用方法，请参考以下各表。

任意窗格

若要 | 按下 | 单击
在各查询设计器窗格间移动 | F6 键、SHIFT+F6 键 | 目标窗格中的任意位置

关系图窗格

若要 | 按下 | 单击
在表间移动其它表结构化对象（如果可用，移动到联接线） | TAB 键或 SHIFT+TAB 键 | 要移动到的表、表结构化对象或联接线
在表或表结构化对象中的列间移动 | 箭头键 | 要移动到的列
选择要输出的选定数据列 | 空格键1 或 加号键 | 列名旁的复选框
从查询输出中删除选定的数据列 | 空格键1 或 减号键 | 列名旁的复选框
从查询中删除选定的表、表结构化对象或联接线 | DELETE 键 | 右击，然后选择"删除"命令

1 如果选定多个项目，按此键将影响所有选定的项目。按住 SHIFT 键然后单击要选的项目，可选择多个项目。按住 CTRL 键然后单击某个项目，可切换该项的选定状态。

网格窗格

若要 | 按下 | 单击
在各单元间移动 | 箭头键或 TAB 键或 SHIFT+TAB 键 | 目标单元
移动到当前列中的最后一行 | CTRL+向下箭头键 |
移动到当前列中的第一行 | CTRL+向上箭头键 |
移动到网格可见部分的左上角单元 | CTRL+HOME 键 |
移动到右下角单元 | CTRL+END 键 |
在下拉列表中移动 | 向上箭头键或向下箭头键 | 单元中的按钮
选择整个网格列 | CTRL+空格键 | 列头
选择整个网格行 |  | 行左边的按钮
在编辑模式和单元选择模式间切换 | F2 功能键 |
将单元中的选定文本复制到剪贴板（在编辑模式下） | CTRL+C 键 |
剪切单元中的选定文本并将其放到剪贴板（在编辑模式下） | CTRL+X 键 |
从剪贴板中粘贴文本（在编辑模式下） | CTRL+V 键 |
当在单元中编辑时，在插入和置换模式间切换 | INS 键 |
切换 Output 列中的复选框 | 空格键1 | 复选框
清除单元中的选定内容 | DELETE 键 |
从查询中删除包含选定数据列的行 | DELETE 键1 |
清除选定网格列的所有值 | DELETE 键 |
在现有行之间插入行 | 选择网格行后按 INS 键 |
添加"或 ..."列 | 选择任意"或 ..."列后按 INS 键 |

1 如果选定多个项目，按此键将影响所有选定的项目。

SQL 窗格

当在 SQL 窗格中工作时，可以使用标准的 Windows 编辑键，如 CTRL+箭头键在字之间移动游标，也可使用"编辑"菜单中的"剪切"、"复制"和"粘贴"命令。

注意 只能插入文本；没有加粗模式。

结果窗格

若要 | 按下 | 单击
在单元间移动 | 箭头键或 TAB 键或 SHIFT+TAB 键 | 目标单元
移动到当前行中的第一个或最后一个单元 | HOME 键或 END 键 |
移动到当前列中的第一行 | CTRL+向上箭头键 |
移动到左上角的单元 | CTRL+HOME 键 |
移动到第一列中的底部单元 | CTRL+向下箭头键 |
选择到单元的第一个字符 | SHIFT+HOME 键 |
选择到单元的最后一个字符 | SHIFT+END 键 |
选择整个网格列 | CTRL+空格键 | 列头
选择整个网格行 |  | 行左边的按钮
在编辑模式和单元选择模式间切换 | F2 功能键 |
当在单元中编辑时，在插入和置换模式间切换 | INS 键 |
在网格中插入新行（移动到网格的最后一行） | 选择单元后按 INS 键 |
从表中删除行 | DELETE 键1 |
撤消对当前单元的更改 | 在已更改的单元中按 ESC 键 |
撤消对当前行的更改 | 在尚未更改的单元中按 ESC 键 |
将空值输入到单元中 | CTRL+0 键 |
将选定列或选定行复制到剪贴板 | CTRL+C 键 |
将单元中的选定文本复制到剪贴板（在编辑模式下） | CTRL+C 键 |
将单元中的选定文本剪切到剪贴板（在编辑模式下） | CTRL+X 键 |
从剪贴板中粘贴文本（在编辑模式下） | CTRL+V 键 |

1 如果选定多个项目，按此键将影响所有选定的项目。

请参见

参考


比较运算符

在搜索条件中，可以使用任何标准的 SQL 运算符。在搜索条件中使用运算符时，应用下面的规则：

  • 比较中所使用数据的数据类型必须匹配。即文本只能比较文本，数字只能比较数字，等等。有关转换数据类型的信息，请参见数据类型转换。

  • 比较文本数据时，结果取决于当前使用的字符集。例如，如果表是使用斯堪的纳维亚语字符集创建的，搜索的结果可能会不同，这取决于当前的字符集（代码页）是斯堪的纳维亚语字符集还是另外一种字符集。

  • 如果比较值是空值，则结果未知。空值不与任何值匹配，包括其它情况下的空值。例如，搜索以字母"M"或"M"后的字母开始的名字 (name >= 'M')，并且某些行不包含值，则无论使用何种比较运算符这些行都不显示。

下表概述了为标准 SQL 定义的搜索条件运算符以及在网格窗格中如何输入运算符。有关更多信息，请参见运算符。

运算符 含义 网格窗格示例1 SQL 窗格示例
= 等于。
= 'Smith'

SELECT fname, lname
FROM employees
WHERE lname = 'Smith'
<>
!= 		不等于。
<> 'Active'

SELECT fname, lname
FROM employees
WHERE status <> 'Active'
> 大于。
> '01 Jan 1995'2

SELECT fname, lname
FROM employees
WHERE hire_date >
 '12/31/90'
< 小于。
< 100

SELECT fname, lname
FROM employees
WHERE job_lvl < 100
>=
!< 		大于或等于。
>= 'T'

SELECT au_lname
FROM authors
WHERE au_lname >= 'T'
<=
!> 		小于或等于。
<= '01 Jan 1995' 2

SELECT fname, lname
FROM employees
WHERE hire_date <=
 '01/01/95'
BETWEEN expr1
AND expr2 		值的测试范围。
BETWEEN
'01 Jan 1995'
AND

'31 Dec 1995'2

SELECT fname, lname
FROM employees
WHERE hire_date
 BETWEEN '12/31/90'
 AND '12/31/91'
IS [NOT] NULL 测试列的内容或表达式的结果是否为空。
IS NULL

SELECT fname, lname
FROM employees
WHERE photo_on_file IS NULL
[NOT] LIKE 执行样式匹配（通常只限于字符数据类型）。
LIKE ('MAC%')

SELECT fname, lname
FROM employees
WHERE lname LIKE ('MAC%')
expr1 [NOT] IN
(val1, val2, ...)

– or –

expr1 [NOT] IN
(subquery) 		通过测试 expr1 在值的列表中还是在子查询 的结果集中来匹配特定值的列表。
IN ('SW', 'SE')

supplier_id IN

  (subquery)

SELECT fname, lname
FROM employees
WHERE sales_region IN ('SW', 'SE')

SELECT product_name

FROM products
WHERE supplier_id IN
  (SELECT supplier_id
  FROM supplier
  WHERE (country = 'Sweden'))
ANY (SOME) 测试子查询的结果集中是否有一行或多行满足指定的条件。（ANY 和 SOME 是同义词，当创建 SQL 语句时，查询设计器将使用 ANY。）
<> ANY (subquery)

SELECT au_lname, au_fname

FROM authors
where city <> any
 (SELECT city FROM publishers)
ALL 测试子查询结果集的所有行是否都满足指定的条件。
advance > ALL (subquery)

SELECT title FROM titles

where advance > all
  (SELECT advance FROM
   publishers,titles
  where titles.pub_id
   = publishers.pub_id
  AND pub_name =
   'Alogdata Infosystems')
[NOT] EXISTS 测试子查询是否返回任何结果（不只是特定的结果）。
EXISTS (subquery)

SELECT product_name

FROM products
WHERE EXISTS
  (SELECT * FROM
   orders, products
  WHERE orders.prod_id
  = products.prod_id)

1 为了清楚起见，网格窗格示例中只包括每个运算符的一个示例，且不指出所搜索的数据列。
2 使用 Windows"区域设置"对话框中指定的格式，可以将日期输入到网格窗格中。有关详细信息，请参见输入搜索值。

请参见

参考


逻辑运算符

可使用下表列出的标准逻辑运算符，对搜索条件进行组合或修改。下表中的运算符按取值的顺序列出。

运算符 含义 示例
NOT 逻辑上相反的条件
SELECT * FROM employee

WHERE NOT (fname = 'Ann')
AND 两个条件必须同时成立
SELECT * FROM employee
WHERE lname = 'Smith' AND fname = 'Ann'
OR 两个条件之一成立
SELECT * FROM employee
WHERE region = 'UK' OR region = 'FRA'

请参见

参考


通配符

通过使用通配符字符，可以在数据列或表达式中搜索模式。例如，可以搜索姓氏以"Mac"开头或以"son"结尾的所有员工。

在本主题中将了解下列相关信息：

  • 通配符

  • 搜索用作通配符的字符

  • 搜索日期时间列

  • 通配符搜索示例

通配符

使用通配符可以搜索任何被视为文本字符串的列。带有数据类型字符的列可以始终作为文本字符串处理。

若要按样式搜索，请使用 LIKE 运算符，然后用通配符代替搜索字符串中的一个或多个字符。可使用下面两个通配符的任意一个：

通配符 | 含义
%（百分号） | 在该位置有零个或多个字符
_（下划线） | 在该位置有一个字符

例如，若要搜索所有以"Mac"开始的名字，可指定搜索条件 LIKE 'Mac%'。若要查找"Jan"、"Jen"和"Jon"这类名字，可指定搜索条件 LIKE 'J_n'。

搜索用作通配符的字符

某些情况下，在要搜索的字符串中可能包含一个用作通配符的字符。例如，想在 title 表中查找书名中包含字符串"10%"的所有出版物。因为"%"是所搜索的字符串的一部分，因此必须将其指定为文字字符串而不是通配符。

若要搜索可被解释为通配符的字符，可指定转义符。将转义符放在表示字面意义的"%"或"_"字符的最前面。若要指定转义符，请在 LIKE 搜索准则的后面包含 ESCAPE 子句。在网格窗格的"准则"列中或在 SQL 窗格中都可以指定转义符。

例如，假设要查找包含字符串"10%"的所有书名。假设想将字符"#"定义为转义符，在表示字面意思的"%"字符前面加上"#"。可在网格窗格中输入：

LIKE '%10#%%' ESCAPE '#'

所得到的 SQL 语句中的 WHERE 子句象下面这样：

WHERE title LIKE '%10#%%' ESCAPE '#'

注意 只能在 SQL 窗格中定义转义符。

搜索日期时间列

当使用日期时间数据类型的列时，可以搜索日期或时间的任何部分，包括月份的缩写形式和完整表示的年份。

例如，可用下列 LIKE 子句搜索日期在 1994 年内的所有行：

LIKE '%1994%'

下列子句搜索日期在一月份内的所有行，与年份无关：

LIKE 'Jan%'

有关更多信息，请参见 LIKE。

通配符搜索示例

下面的示例说明通配符的使用。

搜索表达式 描述 匹配示例
LIKE 'Mac%'
 查找以"Mac"开始的值 Mac
MacIntosh
Mackenzie
LIKE 'J%n'
 查找以"J"开头并以"n"结尾的值 Jon
Johnson
Jason
Juan
LIKE '%son'
 查找以"son"结尾的值 Son
Anderson
LIKE '%sam%'
 查找在字符串的任何位置包含"sam"的值 Sam
Samson
Grossam
LIKE '%Mar%'
 在日期时间列中查找三月份 (March) 的值，与年份无关 3/1/94
01 Mar 1992
LIKE '%1994%'
 在日期时间列中查找 1994 年的值 12/1/94
01 Jan 1994
LIKE 'Mac_'
 查找四个字符的值，其中前三个字符为"Mac" Mack
Macs
LIKE '_dam'
 查找四个字符的值，其中后三个字符为"dam" Adam
Odam
LIKE '%s_n'
 查找包含"s"和在值的结尾包含"n"的值，并且在这两个字符之间有任意一个字符，在它们前面有任意多个字符 Anderson
Andersen
Johnson
san
sun

请参见

参考


搜索条件组合规则和网格窗格规范

可创建包含用任意多个 AND 和 OR 运算符链接的任意多个搜索条件的查询。包含 AND 和 OR 子句组合的查询可能会变得复杂。因此，了解在执行这类查询时如何对其进行解释，以及在网格和 SQL窗格中如何表示这类查询是非常有用的。

注意 有关只包含一个 AND 或 OR 运算符的搜索条件的详细信息，请参见为一列指定多个搜索条件和为多列指定多个搜索条件。

将了解下列相关信息：

  • 在包含 AND 和 OR 子句的查询中，AND 和 OR 的优先权。

  • AND 和 OR 子句中的条件如何在逻辑上相关。

  • 查询设计器如何在网格窗格中表示包含 AND 和 OR 子句的查询。

为帮助理解下面的讨论内容，假设使用一个 employee 表，该表含有 hire_date、job_lvl 和 status 列。示例假定需要知道这些信息：员工在公司工作了多长时间（即员工的雇佣日期）、员工承担何种工作（职位等级是什么）和员工的状况（例如，已退休）。

AND 和 OR 的优先权

当执行查询时，它首先计算用 AND 运算符链接的子句，然后计算用 OR 运算符链接的子句。

注意 NOT 运算符优先于 AND 和 OR 运算符。

例如，若要查找在公司工作五年以上的低级职位员工或中级职位的员工，而不考虑他们的雇佣日期，可构造如下的 WHERE 子句：

WHERE
   hire_date < '01/01/90' AND
   job_lvl = 100 OR
   job_lvl = 200

若要替代 AND 和 OR 的默认优先权，可在 SQL 窗格中将指定的条件用括号括起来。始终先对括号里的条件取值。例如，要查找在公司工作五年以上的低级职位或中级职位的所有员工，可构造如下的 WHERE 子句：

WHERE
   hire_date < '01/01/90' AND
   (job_lvl = 100 OR job_lvl = 200)

提示 为清楚起见，建议在组合 AND 和 OR 子句时始终使用括号，而不要依赖默认的优先权。

AND 子句如何与多个 OR 子句相关

理解当 AND 和 OR 子句组合时是如何相关的，有助于构造和理解查询设计器中的复杂查询。

如果使用 AND 运算符链接多个条件，则用 AND 运算符链接的第一组条件适用于第二组的所有条件。也就是说，用 AND 运算符与另一个条件链接的某个条件被分配到第二组的所有条件中。例如，下面的原理表示法说明与一组 OR 条件链接的 AND 条件：

A AND (B OR C)

上面的原理表示法与下面的原理表示法在逻辑上是相等的，说明 AND 条件如何被分配到第二组条件中：

(A AND B) OR (A AND C)

这种分配原理影响使用查询设计器的方式。例如，假设查找在公司工作五年以上的低级或中级职位的所有员工。可在 SQL 窗格的语句中输入下面的 WHERE 子句：

WHERE (hire_date < '01/01/90' ) AND
   (job_lvl = 100 OR job_lvl = 200)

用 AND 运算符链接的子句适用于用 OR 运算符链接的两个子句。表示这种情况的一种显式方法是对 OR 子句的每个条件重复一次 AND 条件。下面的语句比前面的语句更直接（也更长），但逻辑上是相等的：

WHERE    (hire_date < '01/01/90' ) AND
  (job_lvl = 100) OR
  (hire_date < '01/01/90' ) AND
  (job_lvl = 200)

将 AND 子句分配到链接的 OR 子句的原理也适用于涉及多个条件的情况。例如，假设想查找在公司工作五年以上或已退休的中级或更高职位的员工。WHERE 子句可能象下面这样：

WHERE
   (job_lvl = 200 OR job_lvl = 300) AND
   (hire_date < '01/01/90' ) OR (status = 'R')

分配了用 AND 运算符链接的条件后，WHERE 子句可能象下面这样：

WHERE
   (job_lvl = 200 AND hire_date < '01/01/90' ) OR
   (job_lvl = 200 AND status = 'R') OR
   (job_lvl = 300 AND hire_date < '01/01/90' ) OR
   (job_lvl = 300 AND status = 'R')

如何在网格窗格中表示多个 AND 和 OR 子句

查询设计器在网格窗格中表示搜索条件。但是，在某些涉及用 AND 和 OR 运算符链接的多个子句的情况下，网格窗格中的表示与预期的可能不一样。另外，如果在网格窗格或关系图窗格中修改查询，可能会发现所得到的 SQL 语句与所输入的不同。

一般情况下，下列规则决定 AND 和 OR 子句在网格窗格中的显示方式：

  • 所有用 AND 运算符链接的条件出现在"准则"网格列中或同一个"或 ..."列中。

  • 所有用 OR 运算符链接的条件出现在不同的"或 ..."列中。

  • 如果 AND 和 OR 子句组合的逻辑结果是将 AND 子句分配到几个 OR 子句中，网格窗格将根据需要重复 AND 子句以显式表示结果。

例如，在 SQL 窗格中可创建如下的搜索条件，在该条件中用 AND 运算符链接的两个子句优先于第三个用 OR 运算符链接的子句：

WHERE (hire_date < '01/01/90' ) AND
  (job_lvl = 100) OR
  (status = 'R')

查询设计器在网格窗格中将该 WHERE 子句表示为：

但是，如果链接的 OR 子句优先于 AND 子句，则每个 OR 子句都重复 AND 子句。这使 AND 子句被分配到每个 OR 子句中。例如，在 SQL 窗格中可以创建如下的 WHERE 子句：

WHERE (hire_date < '01/01/90' ) AND
  ( (job_lvl = 100) OR
  (status = 'R') )

查询设计器在网格窗格中将该 WHERE 子句表示为：

如果链接的 OR 子句仅涉及一个数据列，查询设计器会将整个 OR 子句放到单个的网格单元中，以避免重复 AND 子句。例如，在 SQL 窗格中可以创建如下的 WHERE 子句：

WHERE (hire_date < '01/01/90' ) AND
  ((status = 'R') OR (status = 'A'))

查询设计器在网格窗格中将该 WHERE 子句表示为：

如果更改查询（如更改网格窗格中的一个值），查询设计器将在 SQL 窗格中重新创建 SQL 语句。重新创建的 SQL 语句将与网格窗格的显示相似，而不是与原始语句相似。例如，如果网格窗格中包含分配的 AND 子句，将用显式分配的 AND 子句重新创建 SQL 窗格中所得到的语句。有关详细信息，请参见本主题前面的"AND 子句如何与多个 OR 子句相关"。

请参见

参考


搜索值输入规则

本主题讨论为搜索条件输入下列类型的字面值时必须遵循的规则：

  • 文本值

  • 数字值

  • 日期

  • 逻辑值

注意 本主题的信息是从标准 SQL-92 的规则派生出的。如果对如何输入搜索值有问题，请参见 Transact-SQL 参考。

搜索文本值

下列准则适用于在搜索条件中输入文本值的情况：

  • 引号 将文本值放到单引号内，如下例的姓氏所示：
    'Smith'

    如果在网格窗格中输入搜索条件，则只需输入文本值，查询设计器将自动为该值加上单引号。

    在 SQL Server 中，查询设计器始终将双引号解释为数据库对象分隔符。有关详细信息，请参见对 SQL Server 数据库使用查询设计器时的注意事项。

  • 嵌入的撇号 如果搜索的数据包含一个单引号（撇号），可以输入两个单引号以表示该单引号是字面值而非分隔符。例如，下面的条件搜索"Swann's Way"的值：
    ='Swann''s Way'
  • 长度限制 当输入长字符串时，不要超过 SQL 语句的最大长度。SQL 标准对文字字符串的最大长度没有限制，但是大多数 ODBC 驱动程序对语句的最大长度都有限制。

  • 区分大小写 遵循所使用的数据库的大小写区分规则。所使用的数据库决定文本的搜索是否区分大小写。

    如果不能确定数据库是否使用区分大小写的搜索，可以在搜索条件中使用 UPPER 或 LOWER 函数转换搜索数据的大小写，如下例所示：

    WHERE UPPER(lname) = 'SMITH'

    有关转换大小写字母的函数的详细信息，请参见表达式函数。

搜索数字值

当在搜索条件中输入数字值时，应用下列准则：

  • 引号 不能将数字放在引号中。

  • 非数字字符 除小数分隔符（小数分隔符在 Windows"控制面板"的"区域设置"对话框中定义）和负号 (-) 外，不能包含非数字字符。不能包括数字分组符号（如千位间的逗号）或货币符号。

  • 小数点标记 如果输入完整的数字，则可以包括小数点标记，不论所搜索的值是整数还是实数。

  • 科学记数法 可以使用科学记数法输入非常大或非常小的数字，如下例所示：
    > 1.23456e-9

注意 有关在 SQL Server 中输入货币值的详细信息，请参见对 SQL Server 数据库使用查询设计器时的注意事项。

搜索日期

用来输入日期的格式取决于所使用的数据库和输入日期时所在的查询设计器窗格。查询设计器可使用下列日期格式：

  • 区域设置特有的 在 Windows"区域设置属性"对话框中指定的日期格式。

  • 数据库特有的 数据库可以理解的任何格式。

  • ANSI 标准日期 使用花括号、指明日期的标记"d"和日期字符串的格式，如下例所示：
    { d '1990-12-31' }
  • ANSI 标准日期时间 与 ANSI 标准日期相似，但用"ts"代替"d"，并在日期中添加小时、分钟和秒（使用 24 小时制），如下例中对 1990 年 12 月 31 日的表示：
    { ts '1990-12-31 00:00:00' }

    一般情况下，ANSI 标准日期格式用于那些使用真实日期数据类型表示日期的数据库。相反，日期时间格式用于支持日期时间数据类型的数据库。

下表汇总了可在查询设计器的不同窗格中使用的日期格式。

窗格 | 日期格式
网格 | 区域设置特有的 数据库特有的 ANSI 标准 输入到网格窗格中的日期在 SQL 窗格中转换成与数据库兼容的格式。
SQL | 数据库特有的 ANSI 标准 输入到 SQL 窗格中的日期在网格窗格中转换成区域设置特有的格式。
结果 | 区域设置特有的

搜索逻辑值

逻辑数据的格式因数据库的不同而异。False 值通常作为零 (0) 存储。True 值通常作为 1 存储，偶尔作为 –1。当在搜索条件中输入逻辑值时，应用下列准则：

  • 若要搜索 False 值，请使用零，如下例所示：
    SELECT * FROM authors
WHERE contract = 0
  • 如果在查找 True 值时，不能确定使用什么格式，可试用 1，如下例所示：
    SELECT * FROM authors
WHERE contract = 1
  • 或者，也可以通过搜索任何非零值扩大搜索范围，如下例所示：
    SELECT * FROM authors
WHERE contract <> 0

请参见

参考


聚合函数

若要汇总表中的所有数据，请创建包含 SUM( ) 或 AVG( ) 这类函数的聚合查询。运行该查询时，结果集中将包含一个汇总信息行。例如，通过创建对 price 列的内容求和的查询，计算 titles 表中所有书的总价。查询的输出结果可能象下面这样：

相应的 SQL 语句如下：

SELECT SUM(price) total_price
FROM titles

可以使用下列聚合函数：

聚合函数 | 描述
AVG(expr) | 列值的平均值。该列只能包含数字数据。
COUNT(expr), COUNT(*) | 列值的计数（如果将列名指定为 expr）或是表或组中所有行的计数（如果指定 *）。COUNT(expr) 忽略空值，但 COUNT(*) 在计数中包含空值。
MAX(expr) | 列中最大的值（文本数据类型中按字母顺序排在最后的值）。忽略空值。
MIN(expr) | 列中最小的值（文本数据类型中按字母顺序排在最前的值）。忽略空值。
SUM(expr) | 列值的合计。该列只能包含数字数据。

当使用聚合函数时，默认情况下，汇总信息包含所有的指定行。在某些情况下，结果集包含非唯一的行。可使用聚合函数的 DISTINCT 选项筛选出非唯一的行。

可将聚合函数同其它表达式组合使用，以计算其它汇总值。有关详细信息，请参见使用自定义表达式汇总值。

请参见

参考


表达式结构

表达式可以包含列名、文字、运算符或函数的任何组合。将这些元素组合成表达式时应遵循下列准则：

  • 通过键入列名引用列。如果查询使用多个表并且使用的列名不唯一，则必须在列名中添加表名和句点。下例显示用表名 employee 限定列名 job_id：
    employee.job_id
  • 用单引号将文字文本括起来；对数字不必使用引号。

    在 SQL Server 中，查询设计器始终将双引号解释为数据库对象分隔符。有关详细信息，请参见对 SQL Server 数据库使用查询设计器时的注意事项。

  • 数字可使用标准的算术运算符，合并字符串可使用串联运算符。有关详细信息，请参见表达式运算符。

  • 用括号建立运算符的优先权。

  • 如果包含函数，则传递到函数的参数使用同样的准则。即键入列名引用列，用单引号括起文字文本，等等。有关更多信息，请参见表达式函数。

  • 如果将列名作为函数参数传递，则要确保列的数据类型适合函数参数的类型。

  • 可以在表达式中包含返回标量值的用户定义函数。有关用户定义函数的更多信息，请参见用户定义函数。

下表说明在查询中如何使用表达式。

表达式 结果
SELECT (price * .9)
FROM products 		显示打折价格（价格列中的值下调 10%）。
SELECT (lname + ', ' + fname)
FROM employee 		显示用逗号将姓氏列与名字列串联后的值。
SELECT sales.qty, titles.price

FROM sales INNER JOIN titles ON
sales.title_id = titles.title_id
ORDER BY
(sales.qty * titles.price)

 联接两个表后，按总订货值（数量乘以价格）对结果集进行排序。
SELECT au_lname, au_fname
FROM authors
WHERE
(SUBSTRING(phone, 1, 3) = '415') 		显示区号在旧金山地区的作者。
SELECT ord_num, ord_date
FROM sales
WHERE
(ord_date >=
DATEADD(day, -10, GETDATE())) 		查找 sales 表中最后 10 天发出的所有订单。当天的日期由 GETDATE( ) 函数返回。

请参见

参考


表达式运算符

为查询构造表达式时，可使用多种运算符，包括数学运算符和文本运算符。

数学运算符

下表列出在构造表达式时可以使用的数学运算符。

运算符 | 含义
+, - | 一元正、负号
+ | 加
- | 减
* | 乘
/ | 除

注意 有关更多信息，请参见运算符。

如果表达式中用到一个以上的数学运算符，查询设计器将根据下面的运算符优先权处理表达式。若要替代默认优先权，请用括号将表达式中先取值的部分括起来。如果包含一个以上的同级运算符，则按从左到右的顺序对运算符取值。

  1. 一元正、负号

  2. 乘、除

  3. 加、减

文本运算符

对文本可执行一种操作：串联或链接字符串。若要串联字符串，可在网格窗格中使用"+"运算符。有关更多信息，请参见运算符。

也可以使用遵从 ODBC 的驱动程序所支持的 ODBC CONCAT 函数。例如，下面的表达式说明如何使用 CONCAT 函数将作者的姓氏与名字用逗号组合起来：

{ fn CONCAT(au_lname,{ fn CONCAT (', ', au_fname)})}

有关可用函数的更多详细信息，请参见表达式函数。

请参见

参考


表达式函数

生成表达式时可调用许多函数，包括：

  • 字符串（字符）函数

  • 日期函数

  • 数学函数

  • 系统函数

  • 其它函数，例如某些将数据从一种类型转换为另一种类型的函数

  • 用户定义函数

有关更多信息，请参见函数。

如果创建的查询（而不是视图、存储过程或触发器）可能在不同的数据库上运行，还可以使用 ODBC 函数。ODBC 语法在函数名的前面包含"fn"限定符，并用花括号将整个函数括起来。例如，下面的表达式使用 ODBC 函数将文本转换为小写字母：

{fn LCASE ( address ) }

查询设计器通过下列方式，帮助您使用函数：

  • 在函数参数中正确地插入引号

  • 验证参数的数据类型

  • 验证返回值的数据类型

有关 ODBC 的信息，请参见 Microsoft Web 站点 上的 MSDN® 联机库中的 Data Access Services(数据访问服务)部分。有关更多信息，请参见 SQL 用户定义函数。

注意 可以使用特殊的函数集，如 SUM( ) 和 AVG( ) 这类聚合函数创建汇总数据的查询。有关详细信息，请参见汇总和分组。

字符串函数

下表包含字符串函数的示例。有关更多信息，请参见字符串函数和使用字符串函数。

函数 描述 示例
LCASE( )1、
LOWER( ) 		将字符串转换为小写字母
SELECT UPPER(substring(lname, 1, 1)) +

  LOWER(substring (lname, 2, 99))
FROM employee

将姓氏的第一个字母转换为大写，将其余字母保留小写后显示姓氏。
LTRIM( ) 删除字符串前面的空格
SELECT stor_name, LTRIM(stor_address)
FROM stores

删除前面多余的空格后显示地址列。

SUBSTRING( )
从字符串中提取一个或多个字符

SELECT SUBSTRING(phone,1,3)
FROM employee

显示电话号码的前三个字符（区号）

UCASE( )1、

UPPER( )
将字符串转换为大写字母

SELECT * FROM employee
WHERE UPPER(lname) = 'SMITH'

将 lname 列的内容转换为大写字母后再与特定的值进行比较（以避免当搜索区分大小写时不匹配）。有关在 SQL Server 中区分大小写的详细信息，请参见查询设计器注意事项。

1    如果作为 ODBC 函数调用，请使用如下语法：{ fn LCASE(text) }。

日期函数

下表包含日期函数的样本。有关更多信息，请参见 日期和时间函数。

函数
描述
示例

DATEDIFF( )
计算两个日期间的间隔。

SELECT fname, lname, hire_date
FROM employee
WHERE DATEDIFF(year, hire_date, getdate()) > 5

查找雇佣期限超过五年的所有员工。

DATEPART( )
返回日期或日期时间列的指定部分，包括日、月或年。

SELECT DATEPART(year, hire_date)
FROM employee

只显示员工是在哪一年被雇佣的（而非完整日期）。

CURDATE( )1

GETDATE( ) 或 DATE( )
以日期时间的格式返回当前日期。对于许多其它日期函数，该函数作为输入函数很有用，如计算距当天之前或之后的时间间隔。

SELECT order_id
FROM orders
WHERE order_date = GETDATE()

Displays orders placed today.

1    如果作为 ODBC 函数调用，请使用如下语法：{ fn CURDATE() }。

数学函数

下列函数是许多数据库中可用的典型函数。有关更多信息，请参见数学函数。

注意   可以使用聚合函数 AVG( )、COUNT( )、MAX( )、MIN( ) 和 SUM( ) 在报表中创建平均值及合计值。有关详细信息，请参见汇总和分组。

函数
描述
示例

ROUND( )
将数字按指定的小数位数四舍五入

SELECT ROUND(qty * (price * discount), 2)
FROM sales

显示根据折扣价格计算的总价格，然后将结果四舍五入到小数点后两位。

FLOOR( )
将数字向下四舍五入为最接近（最小）的整数

UPDATE titles
SET price = FLOOR(price)

将 titles 表中的所有价格四舍五入为最接近的整数。

CEILING( )
将数字向上四舍五入为最接近的整数

INSERT INTO archivetitle

SELECT title, CEILING(price)
FROM titles

将 titles 表中的 title 和 price（向上四舍五入为最接近的整数）复制到 archivetitle 表中。

系统函数

下列函数是许多数据库中可用的典型函数。有关更多信息，请参见系统函数。

函数
描述
示例

DATALENGTH( )
返回指定的表达式所用的字节数

SELECT DATALENGTH(au_lname + ', '

  + au_fname)
FROM authors

列出组合姓氏与名字所需的字节数。

USER( )1、

USER_NAME( )
返回当前用户名

SELECT company_name, city, phone

FROM customers
WHERE salesperson = USER_NAME()

为运行查询的销售人员创建客户列表。

1    如果作为 ODBC 函数调用，请使用如下语法：{ fn USER() }。

其它函数

下列函数举例说明许多数据库中可用的实用工具函数。有关更多信息，请参见函数。

函数
描述
示例

CONVERT( )
将数据从一种类型转换为另一种类型。格式化数据时或者在需要其它数据类型的函数中将数据列的内容作为参数时很有用。

SELECT 'Hired: ' + CONVERT(char (11),

  hire_date)
FROM employee

显示前面带题注的日期；CONVERT( ) 函数根据日期创建字符串，使其可以与文字字符串串联。

SOUNDEX( )
为可创建"近似"搜索的指定表达式返回 Soundex 代码。

SELECT au_lname, au_fname
FROM authors
WHERE SOUNDEX(au_fname) = 'M240'

搜索与"Michael"相似的名字。

STR( )
将数字数据转换为字符串，以便可以用文本运算符对其进行处理。

SELECT str(job_id) + ' ' +
   str(job_lvl)
FROM employee

在单个字符串中显示 job_id 和 job_lvl 列（都是数字型）。

请参见

参考


表达式预定义变量

在表达式中除使用列名、文字、运算符和函数外，还可以使用具有已定义的含义或值的预定义变量。例如，可以使用预定义变量显示当前用户的用户名，或搜索不含值（空）的数据列。

请参见

参考 | 保留关键字 | 函数


对话框

有关可视化数据库工具所使用的对话框的信息，请参见下面的主题：

数据库设计器对话框

查询设计器对话框


数据库设计器对话框

下列数据库设计器用户界面元素有可用的文档：

  • 添加表对话框

  • 选择名称对话框

  • 列选择对话框

  • 创建关系对话框

  • 发现数据库更改对话框

  • 需要改变数据类型对话框

  • 页面设置对话框

  • 保存更改脚本对话框

  • 保存对话框

  • 保存不完全对话框

  • 存在未保存的更改对话框

  • 验证警告对话框


添加表对话框（数据库设计器）

使您能够在数据库设计器中添加表。

添加

添加选定的一个或多个表。

如果添加的表或视图已在关系图窗格上出现，将出现一条消息警告您该表已经在关系图上存在。

注意 如果要在关系图中添加多个表，可以在单击"添加"按钮前选定所有的表。另外也可双击要添加的每个表，并在完成后单击"关闭"按钮。

关闭

关闭对话框而不再添加表。

请参见

数据库设计器对话框 | 添加表对话框（查询和视图设计器）


选择名称对话框

使您能够在某个新表在数据库中创建以前更改由系统分配给该表的名称。

输入表名

显示系统分配的表名。在文本框中键入新的表名。尽管能够在以后使用表属性页更改系统分配的名称，但最好现在就更改名称。更改已有数据库对象的名称是危险的，因为可能会使按名称引用该对象的程序和查询无效。

确认

使用指定的名称创建表。当保存表或关系图时将在数据库中创建该表。

取消

取消创建新表。

有关创建表的更多信息，请参见将表添加到数据库关系图中。

请参见

数据库设计器对话框 | 重命名表


创建关系对话框

使您能够确认相关的列并设置新关系的属性。

在数据库关系图的两个表之间绘制关系线时，将出现该对话框。

关系名

显示系统分配的关系名。若要重命名关系，请在文本框中键入新的名称。

主表

显示关系中主表的名称，后面是构成主键的列。可以选择不同的列以匹配在"外键表"下显示的列。

外键表

显示关系中外键表的名称，后面是构成外键的列。可以选择不同的列以匹配在"主表"下显示的列。

创建中检查现存数据

创建关系时将关系应用于外键表中的现有数据。如果选定该对话框，一个错误信息将会通知您有违反约束的数据。

对 INSERT 和 UPDATE 强制关系

如果选择该选项，则只要使用这些语句在外键表中添加或更新数据时都将强制约束。

对复制强制关系

如果选择该选项，则无论何时将外键表复制到一个不同的数据库，都将强制关系的引用完整性。

级联更新相关的字段

无论何时更新主键值，都指示数据库将新的键值传播到相应的外键字段。

级联删除相关的字段

无论何时删除主表中的行，都指示数据库从外键表中删除相应的行。

确认

使用选定的属性创建关系。

取消

从数据库关系图中清除关系线。将不会创建关系。

有关在表间创建关系的更多信息，请参见创建表间的关系。

请参见

数据库设计器对话框 | 关系属性页


列选择对话框

允许在数据库关系图中更改表的自定义视图。自定义视图仅显示由用户标识的列属性。

当右击表并在快捷菜单中选择"修改自定义视图"后，将出现该对话框。

可用的列

列出选定的数据库表中的所有列。此处列出的列取决于数据库表的属性和数据库的类型。突出显示想要的列并用箭头按钮将这些列移动到"选定列"框。

选定列

显示当前为自定义视图定义的列属性。使用箭头按钮将列属性添加到"选定列"列表或从该列表中删除。

移动

使用向上和向下箭头按钮在"选定列"列表中上下移动突出显示的列。表中的列属性将按表在"选定列"列表中的顺序显示。

另存为默认

用在该对话框中选定的列替换默认自定义视图。如果未选定该选项，则对话框中指定的列选择将只适用于数据库关系图中选定的表。

确认

保存自定义视图。

取消

取消对自定义视图的修改。

有关自定义视图的更多信息，请参见更改表视图。

请参见

数据库设计器对话框


发现数据库更改对话框

如果试图保存数据库关系图或选定的表，但某些将受保存操作影响的数据库对象已经过期，则将出现该对话框。如果接受对话框中显示的更改，则将更新数据库以匹配关系图并覆盖其他用户所做的更改。

注意 虽然无法撤消对表或数据库关系图所做的更改，但在保存该表或关系图之前这些更改不会保存到数据库。通过选择"否"并关闭所有打开的关系图而不进行保存，即可废弃任何未保存的更改。

是

用列表中显示的所有更改更新数据库。

否

取消保存操作。

保存文本文件

显示"另存为"对话框，让您为包含数据库更改列表的文本文件指定位置。

有关保存自开始使用数据库设计器后已更改的数据库对象的更多信息，请参见使已修改的数据库与数据库关系图相协调。

请参见

数据库设计器对话框


需要改变数据类型对话框

当更改参与关系的列的数据类型、长度、小数位数、精度或排序规则时，将显示该对话框。

是

更改列表中显示的相关列的数据类型属性，以保留现有的关系。

否

取消数据类型的更改，并将先前的数据类型还原为刚更改的列。

请参见

数据库设计器对话框


定义列排序规则对话框

允许为列指定排序序列。列的排序序列用在任何比较列之间的值或将列值与常量值进行比较的操作中。它还影响一些字符串函数（如 SUBSTRING 和 CHARINDEX）的行为。有关列排序规则设置的影响的完整列表，请参见 SQL Server 排序规则基础知识。

该对话框在下列任一情况下出现：

  • 在表设计器下半部分或"列"属性页的"排序规则"框中输入无效的排序规则名称。

  • 在"列"属性页或表设计器下半部分的"排序规则"框中单击，然后单击出现在该控件右边的按钮。

SQL 排序规则

如果想在由 SQL Server 定义的排序序列中进行选择，先选择"SQL 排序规则"。然后从下拉列表中选择一个排序序列。

Windows 排序规则

如果想在由 Windows 定义的排序序列中进行选择，先选择"Windows 排序规则"。然后从下拉列表中选择一个排序序列。

二进制排序

只有在选择 Windows 排序规则时才适用。如果想让比较操作使用字符串值的二进制代码进行比较，请选择二进制排序。如果选择该选项，某些字母比较选项将不可用。例如将无法进行不区分大小写的比较，因为大写字母和小写字母的二进制编码不同。

字典排序

只有在选择 Windows 排序规则时才适用。如果想让比较操作使用某些字母比较选项，请选择字典排序。字母比较选项有：

  • 区分大小写 如果想让比较将大写字母和小写字母视为不等，请选择该选项。

  • 区分重音 如果想让比较将重音和非重音字母视为不等，请选择该选项。如果选择该选项，比较还将重音不同的字母视为不等。

  • 区分假名 如果想让比较将片假名和平假名日语音节视为不等，请选择该选项。

  • 区分宽度 如果想让比较将半角字符和全角字符视为不等，请选择该选项。

重置为默认值

将数据库的默认排序序列应用到列。

请参见

数据库设计器对话框


页面设置对话框

使用该对话框指定关系图的打印机设置，如方向、比例和纸张尺寸。为关系图设置的打印设置选项将同关系图文件一起保存。当更改关系图的打印比例和方向选项时，将自动更新关系图的分页符。

Name

显示默认打印机的名称并列出计算机上安装的打印机。

属性

设置选定打印机的选项。哪些选项可用要取决于打印机的功能。

状态

显示有关选定打印机的信息。

类型

显示选定打印机的型号和品牌信息。

位置

显示选定打印机的网络路径或串行端口的信息。

注释

显示有关选定打印机的附加信息。

大小

指定要使用的纸张或信封的尺寸。

源

指定要使用的纸张在打印机中的位置。不同的打印机型号支持不同的纸张来源，如上层纸盒、信封传送器以及手工送纸。

纵向

设置页面上的文档为高度大于宽度的纵向布局。

横向

设置页面上的文档为宽度大于高度的横向布局。

百分比

基于应用于百分之百关系图的设置值设置关系图的尺寸。选择 10 到 400 之间的百分比。

请参见

数据库设计器对话框


保存更改脚本对话框

如果表或关系图中存在未保存的数据库更改，则只要保存该表或关系图就显示更改脚本。该对话框允许将更改脚本保存为带 .sql 扩展名的文本文件。

当从"文件"菜单中选择"保存更改脚本"命令或在数据库设计器工具栏上单击"保存更改脚本"按钮 [image] 时，将显示该对话框。

是

显示"另存为"对话框，提示您指定用以包含更改脚本的目的文件。

否

取消保存操作。

每次保存时自动生成更改脚本

选择该选项可以在每次保存数据库关系图或选定的表时创建更改脚本。这将提供对数据库所做的所有更改的记录。

如果选择在每次保存时自动创建更改脚本，则在保存数据库关系图时该对话框将不会出现。

有关保存 SQL 更改脚本的更多信息，请参见保存更改脚本。

请参见

数据库设计器对话框 | 保存更改脚本


保存对话框

在保存数据库关系图或选定的表时将显示该对话框。该对话框让您确认将要保存的表。当关系图仅包含一个已修改的表时，该对话框不出现。

注意 虽然无法撤消对表或数据库关系图所做的更改，但在保存该表或关系图之前这些更改不会保存到数据库。在关闭所有打开的关系图时只要不进行保存，即可放弃任何未保存的更改。

是

保存列表中显示的所有表。

否

取消保存操作。

保存文本文件

显示"另存为"对话框，提示您指定用于保存列出表的文本文件的位置。该文件提供受所做更改影响的表的记录。

请参见

数据库设计器对话框 | 保存选定的表


保存不完全对话框

当尝试保存数据库关系图或选定表并遇到错误时，将显示该对话框。该对话框列出：已成功保存在数据库中的对象、没有保存的对象以及遇到的错误。

确认

返回到关系图。

保存文本文件

显示"另存为"对话框，提示您指定用于保存列出表的文本文件的位置。该文件记录已成功保存的数据库更改以及因为错误而未能保存的更改。

有关可能发生错误的更多信息，请参见：

  • 修改列属性时出错。

  • 无效的游标状态

  • 无法添加约束

  • 无法创建索引

  • 无法创建关系

  • 无法修改表

  • 无法保留触发器

如果想解决的错误没有出现在列表中，请参见系统错误，以获得由 Microsoft® SQL Server™ 返回的其它消息。

修改列属性时出错

当约束表达式中含有错误时将显示该错误信息。

ODBC 错误文本

[Microsoft][ODBC SQL Server Driver][SQL Server] 在此上下文中，名称 '[column value]' 是非法的。此处只允许常量、常量表达式或变量。列名是非法的。

原因

为字符列定义的默认值没有包括在单引号 (') 中。

推荐的解决方案

将数据库列"默认值"单元中的值用单引号引起来，然后保存表。

无效的游标状态

当 Microsoft® SQL Server™ 试图保存选定的表或数据库关系图而资源不足时出现该错误信息。

ODBC 错误文本

[Microsoft][ODBC SQL Server Driver] 无效的游标状态。

原因

数据库或事务日志中没有足够的空间完成保存进程。

推荐的解决方案

请检查数据库或事务日志是否已满。如果已满，请增加数据库的大小以容纳更改。请检查其它的系统资源或与系统管理员联系。

有关增加数据库大小的更多信息，请参见扩充数据库。

无法添加约束

当新的约束在现有的数据上已失败或约束表达式包含错误时出现该错误信息。比较出现在保存不完全对话框中的 ODBC 错误文本和下面显示的错误文本，以确定适当的解决方案。

ODBC 错误文本

[Microsoft][ODBC SQL Server Driver][SQL Server] 数据库 '[database name]' 的表 '[table name]' 中的数据违反所添加的 CHECK 约束 '[constraint name]'。ALTER 命令已终止。

[Microsoft][ODBC SQL Server Driver][SQL Server] 不能创建约束。请参见前面的错误。

原因

现有的数据与 CHECK 约束不匹配。

推荐的解决方案

更改数据（例如，通过使用查询设计器）以匹配约束。有关详细信息，请参见查询设计器。

-或-

对于所论及的 CHECK 约束，清除"表"属性页中的"创建中检查现有数据"复选框。有关禁用该属性的更多信息，请参见创建 CHECK 约束时检查现有数据。

-或-

对于所论及的 CHECK 约束，更改"表"属性页中的约束表达式。

ODBC 错误文本

[Microsoft][ODBC SQL Server Driver][SQL Server] 在约束定义中指定的列 '[column name]' 无效。

[Microsoft][ODBC SQL Server Driver][SQL Server] 不能创建约束。请参见前面的错误。

原因

表属性页上的 CHECK 约束表达式中的文本值没有包括在单引号 (') 中。

-或-

某个参与 CHECK 约束的列被重命名。例如，如果原来的约束中包含表达式 (cityname = 'Paris') 而将该列重命名为 city，则会显示现该错误。

推荐的解决方案

更正表达式并保存表。

ODBC 错误文本

[Microsoft][ODBC SQL Server Driver][SQL Server] 行 [line number]:'[operator]' 附近的语法不正确。

原因

为 CHECK 约束定义的表达式（在"表"属性页中）或 默认约束（在"默认值"单元中）是无效的 SQL 语法。例如，CHECK 约束表达式 'city = Paris' 被 'city equals Paris' 代替。

推荐的解决方案

更正表达式并保存表。

有关约束的更多信息，请参见约束。

无法创建索引

当新的索引在现有的数据上失败时，将显示该错误信息。

ODBC 错误文本

[Microsoft][ODBC SQL Server Driver][SQL Server] 在重复键上创建唯一索引已终止。主键是 [primary key data]'。

[Microsoft][ODBC SQL Server Driver][SQL Server] 不能创建约束。请参见前面的错误。

原因

在"索引/键"属性页中创建了唯一索引，但是数据库中存在重复数据。

推荐的解决方案

从数据库中删除重复数据。有关更多信息，请参见设计查询。

-或-

更改"索引/键"属性页中的选项以允许索引中有重复行。

有关创建唯一索引的更多信息，请参见创建唯一索引。

无法创建关系

当新的引用完整性约束在现有的数据上失败时，将显示该错误信息。

ODBC 错误文本

[Microsoft][ODBC SQL Server Driver][SQL Server] 数据库 '[database name]' 的表 '[table name]' 中的数据违反所添加的 FOREIGN KEY 约束 '[constraint name]'。ALTER 命令已终止。

[Microsoft][ODBC SQL Server Driver][SQL Server] 不能创建约束。请参见前面的错误。

原因

现有数据使外键约束失败。

推荐的解决方案

通过运行查询以显示所有与主键值不匹配的外键值，更改使外键约束失败的数据。例如，若要在 employee 表的 job_id 列中查找与 jobs 表中的主键值不匹配的外键值，请运行具有下列 SQL 语法的查询：

SELECT  employee.emp_id, employee.job_id
FROM  employee LEFT OUTER JOIN jobs ON employee.job_id = jobs.job_id
WHERE (jobs.job_id IS NULL)

有关更多信息，请参见创建查询。

-或-

清除"关系"属性页中的"创建中检查现有数据"复选框。有关更多信息，请参见创建关系时检查现有数据。

无法修改表

当新的约束在现有的数据上失败时，将显示该错误信息。请比较出现在保存不完全对话框中的 ODBC 错误文本和下面显示的两个 ODBC 错误，以确定适当的解决方案。

ODBC 错误文本

[Microsoft][ODBC SQL Server Driver][SQL Server] 表 Tmp_ [table name] 中的列 [column name] 不可以为空。

原因

已经添加的新数据库列不允许空值并且没有提供默认值。所论及的表名将显示在"Tmp_"之后。

推荐的解决方案

修改列属性。或者选择"允许空"属性，或者键入"默认值"设置。有关设置数据库列属性的更多信息，请参见列属性。

ODBC 错误文本

[Microsoft][ODBC SQL Server Driver][SQL Server] 试图向表 '[database name ] TMP_ [table name]' 的列 '[column name]' 中插入 NULL 值；列不允许空值。INSERT 失败。

[Microsoft][ODBC SQL Server Driver][SQL Server] 命令已终止。

原因

现有数据库列上的"允许空"属性已被清除，但是列中存在现有的空值。

推荐的解决方案

到该列中选择"允许空"属性。

有关设置数据库列属性的更多信息，请参见列属性。

不能保留触发器

当触发器文本引用了已被重命名、删除或指派了不同数据类型的列时，将显示该错误信息。

ODBC 错误文本

[Microsoft][ODBC SQL Server Driver][SQL Server] 无效的列名 '[column name]'。

— 无法保留触发器 '[trigger name]'。

原因

对表所做的某个更改要求重新创建表。重新创建表时，附加在该表上的触发器也将自动重新创建。

推荐的解决方案

推荐的解决方案取决于对触发器引用的列所做更改的类型。

保留引用重命名列的触发器

  • 将列重命名为原来的名称，然后保存表。该操作将允许重新创建表。可以立即重命名列，再次保存表，然后编辑触发器以确定重命名的列。

保留引用已删除列的触发器

  1. 展开该触发器附加到的表。

  2. 右击要更改的触发器，并从快捷菜单中选择"打开"命令。

  3. 编辑触发器文本并保存触发器。

  4. 保存表或数据库关系图。

有关触发器的更多信息，请参见触发器和用触发器强制执行业务规则。

系统错误

当超出不受数据库设计器控制的 Microsoft® SQL Server™ 的限制时，在保存不完全对话框中将出现系统错误。在这里描述一个此类错误。

ODBC 错误文本

[Microsoft][ODBC SQL Server Driver] 超时已过期。

原因

当用任何 Transact-SQL 更改来更新数据库时，可能会发生超时。

推荐的解决方案

稍后重新尝试保存关系图或选定的表。

-或-

保存更改脚本并在以后将其应用于数据库。有关更多信息，请参见保存更改脚本。

-或-

增加 SQL 查询超时值并尝试重新保存关系图或选定的表。

请参见

数据库设计器对话框 | 对 SQL Server 数据库使用数据库设计器时的注意事项


存在未保存的更改对话框

如果内存中存在尚未保存的表，则当试图在数据库设计器中关闭数据库关系图的最后一个表或关系图本身时，将显示该对话框。

注意 虽然无法撤消对表或数据库关系图的更改，但在保存该表或关系图之前这些更改不会保存到数据库。通过选择"否"并关闭所有打开的关系图而不进行保存，即可放弃任何未保存的更改。

是

保存列表中显示的所有表。

否

不保存更改即关闭关系图。

保存文本文件

显示"另存为"对话框以便让您为文本文件指定位置，该文本文件包含受更改影响的表的记录。

请参见

数据库设计器对话框 | 保存选定的表


验证警告对话框

如果试图保存的修改具有潜在的破坏作用，或者如果数据库提交操作很可能会失败，则将显示该错误信息。该对话框指出那些破坏作用可能会是什么或提交操作为什么失败。它给您提供是继续修改还是取消操作的机会。

注意 当试图将修改传送到数据库或当保存更改脚本时，将显示该对话框。

下列任一原因会导致显示该对话框：

  • 可能没有提交所有修改的数据库权限。

  • 修改将导致形式不正确的计算列、默认约束或 CHECK 约束。

  • 对列数据类型的修改可能导致数据丢失。

  • 修改可能导致索引大于 900 字节。

  • 修改将更改分配给架构绑定视图或用户定义函数的表或列。

是

继续操作。也就是说，选择"是"将继续生成更改脚本或将修改传送到数据库。请记住，即使正在将修改传送到数据库并且选择"是"，但如果没有修改数据库的权限，如果修改导致索引大于 900 字节，或者如果修改将导致不正确形式的计算列、默认约束或 CHECK 约束，则提交操作仍将失败。

否

取消保存操作。

保存文本文件

显示"另存为"对话框，让您为包含警告列表的文本文件指定位置。

请参见

数据库设计器对话框 | 索引视图 | 保存更改脚本


查询设计器对话框

下列数据库设计器用户界面元素有可用的文档：

添加表对话框

发现数据库更改对话框

定义查询参数对话框

删除表对话框

转到行对话框

索引对话框

为 INSERT FROM 对话框选择目标表

插入到对话框

生成表对话框

查询定义不同对话框

返回查询结果对话框

返回查询结果（编辑）对话框

遇到 SQL 语法错误对话框

更新表对话框


添加表对话框（查询和视图设计器）

使您能够在查询或视图设计器中添加表、视图或用于返回表的用户定义函数。

表

列出可以添加到关系图窗格中的表。若要添加一个表，请选定该表并单击"添加"按钮。若要同时添加多个表，请选定这些表并单击"添加"按钮。

视图

列出可以添加到关系图窗格中的视图。若要添加一个视图，请选定该视图并单击"添加"按钮。若要同时添加多个视图，请选定这些视图并单击"添加"按钮。

函数

列出可以添加到关系图窗格中的用户定义函数。若要添加一个函数，请选定该函数并单击"添加"按钮。若要同时添加多个函数，请选定这些函数并单击"添加"按钮。

添加

添加选定的一个或多个项目。

关闭

关闭对话框而不再添加项目（包括当前突出显示的项目）。

请参见

查询设计器对话框 | 添加表对话框（数据库设计器）


发现数据库更改对话框

通知您正在结果窗格中编辑的数据行不再是当前行。当试图通过将某行移到结果窗格中的另一行来保存对该行的更改，并且查询设计器确定数据库中相应的行已经更改时，将显示该对话框。这种情况最常发生在自执行查询后其他用户已编辑该行并保存更改时。

该对话框显示一条消息，询问您想如何继续。

是

选择此按钮以指定要保存更改并覆盖其他用户所做的更改。

否

选择此按钮以放弃所做的更改，并提取该行的最新版本。查询设计器重读数据库中的该行后返回到结果窗格。

取消

选择此按钮，则既不保存该行也不放弃更改，而是返回到结果窗格。如果选择该选项，可以尝试再次保存该行或做进一步的更改，比如使所做的编辑同该行在数据库中的版本相匹配。

提示 若要查看行的最新版本但不放弃所做的更改，请再次对所编辑的数据执行查询。

请参见

查询设计器对话框


定义查询参数对话框

允许为查询中定义的参数输入值。当执行包含在运行时填写的参数的查询时，将显示该对话框。

参数名

列出为正在执行的查询定义的参数。如果查询包含命名参数，则这些名称出现在列表中。如果查询包含未命名参数，则将为查询中的每个参数都显示一个问号。

参数值

为参数名下列出的每个参数输入值。最近所用的值作为默认的参数值出现。

请参见

查询设计器对话框 | 使用命名参数创建查询 | 使用未命名参数创建查询 | 参数查询 | 指定参数标记符


删除表对话框

允许指定要从中删除行的表。如果在启动删除查询时关系图窗格中显示的表不止一个，将显示该对话框。

选择要从中删除行的表，然后选择"确定"按钮。

注意 删除查询会从表中删除整行。如果要从个别数据列中清除值，请使用更新查询。如果要从表定义中删除列，或删除表本身，请使用数据库设计器或数据库的数据库设计工具。

请参见

查询设计器对话框


转到行对话框

允许浏览到结果窗格中的特定行。当右击结果窗格并选择"行"时，将显示该对话框。

行

输入要浏览到的行号。如果查询提取完了查询结果，则在结果集内显示总行数。如果输入的数字大于结果集内的总行数，查询设计器将移到最后一行。

请参见

查询设计器对话框 | 在查询设计器中浏览 | 结果窗格


索引对话框

允许指定创建、删除和修改索引。

选定的索引

显示选定视图的第一个索引名。若要显示其它索引的属性，请从下拉列表中选择索引。

新建

选择此按钮以创建新索引。有关更多信息，请参见创建索引视图。

删除

选择此按钮以删除选定的索引。

索引名称

显示选定项目的名称。可以通过在此框中输入新名称重命名项目。

列名/顺序

显示分配给索引的列，同时也显示每列的值在项目内是按升序还是降序排列。可以添加、更改或删除该列表中的列名。还可以更改每列的升序/降序设置。

索引文件组

选择用来存储选定索引的文件组名。必须至少有一个用户定义的文件组才能启用该设置。该设置仅在 Microsoft® SQL Server™ 7.0 或更高版本的数据库上才可用。如果创建了数据库对象但没有为其指定文件组，则 SQL Server 将其分配到默认文件组。默认文件组最初是主文件组。

有关创建和使用文件组的更多信息，请参见文件和文件组。

创建 UNIQUE

选择该选项可以为选定的视图创建唯一索引。

  • 忽略重复键 如果创建唯一索引，可以设置该选项以确保每个索引值都唯一。

创建为 CLUSTERED

选择该选项为选定的视图创建聚集索引。有关更多信息，请参见创建聚集索引。

不自动重新计算统计

选择该选项以让 SQL Server 使用以前创建的统计。该选项仅在 Microsoft® SQL Server™ 7.0 及更高版本的数据库中才可用，并且可能无法生成优化结果，故不推荐使用。

有关更多信息，请参见统计信息。

填充因子

显示填充因子以指定每个索引页所允许的填满程度。如果没有指定填充因子，则使用数据库的默认填充因子。有关更多信息，请参见为索引指定填充因子。

填充索引

如果指定的填充因子大于 0% 且选择了创建唯一索引的选项，则能让 SQL Server 使用的、您在填充因子中指定的百分比可以与每个内部节点上的自由空间相同。默认情况下，SQL Server 将设置两行的索引大小。

请参见

查询设计器对话框


为 INSERT FROM 对话框选择目标表

允许指定要插入新行的表。启动 INSERT FROM 查询时将显示该对话框。

表名

从表名列表中选择行所要添加到的表的名称。只能为 INSERT FROM 查询指定一个表。

注意 可以在"属性"窗口中更改要插入行的表。有关详细信息，请参见属性窗口中的查询选项卡。

请参见

查询设计器对话框


插入到对话框

允许指定要添加行的表。当启动插入到查询时，如果关系图窗格中显示的表不止一个，将显示该对话框。

选择要添加行的表，然后选择"确定"按钮。

请参见

查询设计器对话框


生成表对话框

允许命名将要创建并将向其中复制行的表。启动生成表查询时将显示该对话框。

表的名称

键入要创建的表名。查询设计器不检查该名称是否已经被使用，或者您是否有创建表的权限。

若要在另一个数据库中创建目的表，请指定完全合法的表名，包括目标数据库名、所有者（若需要）以及表名。

注意 执行查询前，可以从"属性页"窗口中更改要创建的表的属性。有关详细信息，请参见属性窗口中的查询选项卡。

请参见

查询设计器对话框 | 创建生成表查询


查询定义不同对话框

通知您不能在关系图和网格窗格中以图形方式表示查询，并且只能在 SQL 窗格中编辑查询。当在 SQL 窗格中输入或编辑 SQL 语句，然后切换到另一个窗格验证查询，或试图执行查询，并符合下列条件之一时，将显示该对话框：

  • SQL 命令不完整或包含一个或多个语法错误。

  • SQL 命令有效但在图形窗格中不受支持（如联合查询）。

  • SQL 命令有效但包含正使用的数据连接的特有语法。

提示 可以使用"查询"工具栏上的"验证 SQL 语句"按钮来检查 SQL 语句是否有效。

该对话框显示出一条消息，指出不能表示 SQL 语句的原因，并询问如何继续。

注意 如果隐藏关系图和网格窗格，则不会显示"查询定义不同"对话框，因为查询设计器假定您只在 SQL 窗格中编辑。

是

选择此按钮以指定接受 SQL 语句，或者进一步编辑语句，或者执行语句。如果接受语句，关系图和网格窗格将变成灰色，以表明它们不表示 SQL 窗格中的语句。

否

选择此按钮以放弃对 SQL 窗格所做的更改。

注意 如果语句正确，但查询设计器不支持以图形方式显示语句，那么即使语句不能在关系图和网格窗格中表示，仍然可以执行它。例如，如果输入联合查询，该语句可以执行但不能在其它窗格中表示。

请参见

查询设计器对话框


返回查询结果（编辑）对话框

通知您查询设计器或视图设计器不能保存对已编辑的行的更改，因为正在从数据库向您的计算机传送结果集。有关更多信息，请参见结果窗格和数据库间的交互。

该对话框显示进度计数器以帮助估计必须等待的时间。

取消

选择此按钮以指定取消移动到另一行的尝试。查询设计器返回到已编辑的行。

如果不选择"取消"按钮，则查询设计器在结果集完全传送到您的计算机后保存所做的更改。

请参见

查询设计器对话框


返回查询结果对话框

通知您查询设计器或视图设计器不能执行所请求的操作，因为正在从数据库向您的计算机传送结果集。当已执行查询，然后在结果集完全传送到您的计算机之前试图执行下列操作之一时，将显示该对话框：

  • 转到还没有返回的结果集行。

  • 在结果窗格中插入新行。

  • 在结果窗格中删除一行或多行。

  • 使用"复制"命令将选定的行放到剪贴板上。

有关更多信息，请参见结果窗格和数据库间的交互。

该对话框显示进度计数器以帮助估计必须等待的时间。

取消

取消尝试的操作并返回请求操作时所在的行。

请参见

查询设计器对话框


遇到 SQL 语法错误对话框

通知您查询设计器不能对 SQL 窗格中的 SQL 语句进行语法分析。当在 SQL 窗格中输入或编辑 SQL 语句，然后切换到另一个窗格验证查询，或试图执行查询，并符合下列条件之一时，将显示该对话框：

  • SQL 命令不完整或包含一个或多个语法错误。

  • SQL 命令有效但在图形窗格中不受支持（如联合查询）。

  • SQL 命令有效但包含正使用的数据连接的特有语法。

提示 可以使用"查询"工具栏上的"验证 SQL 语句"按钮来检查 SQL 语句是否有效。

该对话框显示出一条消息，指出不能对 SQL 语句进行语法分析的原因。选择"确定"按钮继续。

请参见

查询设计器对话框


更新表对话框

允许指定要更新的表。如果在启动更新查询时关系图窗格中显示的表不止一个，将显示该对话框。

选择要更新的表，然后选择"确定"按钮。

请参见

查询设计器对话框 | 创建更新查询


属性页

有关可视化数据库工具所使用的属性页的信息，请参见下列主题：

数据库设计器和表设计器属性页

查询设计器和视图设计器属性页


数据库设计器和表设计器属性页

数据库设计器和表设计器提供属性页，通过这些属性页可创建、删除和修改数据库对象并设置影响这些对象的其它选项。

若要 | 请参见
设置数据库表属性 | 表属性页
设置列属性 | 列属性页
在表间创建和操作关系，包括为关系选择主键和外键 | 关系属性页
创建和操作附加在表上的索引、主键和唯一约束 | 索引/键属性页
创建和操作 CHECK 约束 | 约束属性页


列属性页

该属性页包含表中列的一组属性。

表名

显示包含正查看其属性的列的表名。仅在数据库设计器（而不是表设计器）内才能编辑"表名"选项。如果在关系图中选定的表不止一个，则只有第一个表的名称是可见的。

列名

显示关系图中选定表的选定列名。如果在关系图中选定的表不止一个，则只有第一个表的第一个列名是可见的。若要显示其它列的属性，请展开"列名"列表。

描述

显示对选定列的文本描述。

默认值

每当在表中为该列插入带空值的行时，显示该列的默认值。该字段的值既可以是 SQL Server 默认约束值，也可以是该列绑定的全局约束名。下拉列表包含在数据库中定义的所有全局默认值。若要将列绑定到全局默认值上，请从下拉列表中选择。或者，若要创建列的默认约束，请直接以文本形式输入默认值。

精度

显示该列值的最大数字个数。

小数位数

显示该列值小数点右边能出现的最大数字个数。

标识

显示 SQL Server 是否将该列用作标识列。可能的值是：

  • 否 不将该列用作标识列。

  • 是 将该列用作标识列。

  • 是（不适用于复制） 将该列用作标识列，但复制代理程序正将数据插入表中时除外。

Identity Seed

显示标识列的种子值。该选项只适用于其"标识"选项设置为"是"或"是（不适用于复制）"的列。

Identity Increment

显示标识列的递增量值。该选项只适用于其"标识"选项设置为"是"或"是（不适用于复制）"的列。

是 RowGuid

显示 SQL Server 是否将该列用作 ROWGUID 列。只有对于标识列才能将该值设置为"是"。

公式

显示用于计算列的公式。

排序规则

每当列值用于对查询结果的行进行排序时，显示默认情况下 SQL 应用到列的排序序列。若要使用数据库的默认排序序列，请选择 <database default>。

已索引

显示列上是否存在索引。可能的值是：

  • 否 列上不存在索引。

  • 是（允许重复） 列上存在非唯一索引。

  • 是（不允许重复） 列上存在唯一索引。

请参见

数据库设计器和表设计器属性页


CHECK 约束属性页

该属性页包含附加到数据库中的表上的一组约束属性（唯一约束除外）。应用于唯一约束的属性显示在"索引/键"属性页上。

表的名称

显示关系图中的选定表名。如果在关系图中选定的表不止一个，则只有第一个表的名称是可见的。

选定的约束

显示正查看其属性的约束名。若要查看其它约束的属性，请从下拉列表中选择约束。

新建

选择该按钮为选定的数据库表创建新约束。输入索引的属性。有关更多信息，请参见将新的 CHECK 约束附加到表或列。

删除

选择该按钮从数据库中删除选定的约束。有关更多信息，请参见删除 CHECK 约束。

约束名

显示正查看其属性的约束名。使用该控件修改约束名。有关更多信息，请参见修改 CHECK 约束。

约束表达式

显示选定 CHECK 约束的 SQL 语法。对于新约束，在退出此框之前必须输入 SQL 语法。还可以编辑现有的 CHECK 约束。有关更多信息，请参见定义 CHECK 约束表达式。

创建中检查现存数据

选择该选项将确保根据约束对表中所有在创建该约束前存在的数据进行验证。

对 INSERT 和 UPDATE 强制约束

在将数据插入表中或更新表中的数据时强制该约束。

对复制强制约束

在将表复制到另一个数据库中时强制该约束。

请参见

数据库设计器和表设计器属性页


索引/键属性页

该属性页包含附加在数据库关系图中的表上的索引、主键和唯一约束的一组属性。索引和约束在数据库关系图中不以图形表示。

表名

显示关系图中的选定表名。如果在关系图中选定的表不止一个，则只有第一个表的名称是可见的。

选定的索引

显示关系图中选定表的第一个索引名。如果在关系图中选定的表不止一个，则只有第一个表的第一个索引名是可见的。若要显示其它索引的属性，请展开下拉列表。

类型

显示选定表的索引或键对象类型：索引、主键或唯一约束。

新建

选择该按钮为选定的数据库表创建新的索引、键或唯一约束。有关更多信息，请参见创建索引。

删除

选择该按钮从表中删除选定的索引、键或约束。有关更多信息，请参见删除索引。

注意 如果试图删除参与关系的主键，会出现一条消息询问您是否也要删除全部关系。如果不先删除主键所参与的关系，则不能删除主键。

列名/顺序

显示分配给索引、主键或唯一约束的列，以及每个列的值是按升序还是降序在项目内排列。可以添加、更改或删除该列表中的列名。还可以更改每列的升序/降序设置。

索引名

显示选定的索引名。可以通过在此框中输入新名称重命名索引。有关更多信息，请参见重命名索引。

索引文件组

选择用来存储选定索引的文件组名。必须至少有一个用户定义的文件组才能启用该设置。如果创建了数据库对象但没有为其指定文件组，则 SQL Server 将其分配到默认文件组。默认文件组最初是主文件组。

有关创建和使用文件组的更多信息，请参见在文件组上放置索引。

创建 UNIQUE

选择该选项为选定的数据库表创建唯一约束或索引。通过选择"约束"或"索引"按钮指定是创建约束还是索引。

  • 忽略重复键 如果创建唯一索引，可以设置该选项以确保索引列中的每个值都是唯一的。

填充因子

显示填充因子以指定每个索引页所允许的填满程度。如果没有指定填充因子，则使用数据库的默认填充因子。有关更多信息，请参见为索引指定填充因子。

填充索引

如果指定的填充因子百分比大于零并且选择了创建唯一索引的选项，则可以让 SQL Server 将在填充因子中指定的百分比用于每个内部节点上打开的空间。默认情况下，SQL Server 将设置两行的索引大小。

创建为 CLUSTERED

选择该选项为选定的数据库表创建聚集索引。有关更多信息，请参见创建聚集索引。

不自动重新计算统计

选择该选项以让 SQL Server 使用以前创建的统计。该选择可能不会产生优化结果，因此不推荐使用。

有关更多信息，请参见统计信息。

请参见

数据库设计器和表设计器属性页


关系属性页

该属性页包含数据库中表之间关系的一组属性。

表名

显示关系图中的选定表名。如果在关系图中选定的表不止一个，则只有第一个表的名称是可见的。

选定的关系

显示关系图中选定关系的名称。如果在关系图中选定的关系不止一个，则只有第一个选定关系的名称是可见的。展开列表以查看或修改其它关系的属性。

在下拉列表中，每项的前面都有一个图标。钥匙图标表示将参与了关系的表作为被引用表使用。无穷大图标表示将参与了关系的表作为引用表使用。（引用表具有关系的外键约束。）

新建

选择该按钮为选定的数据库表创建新关系。有关更多信息，请参见创建关系。

删除

选择该按钮从数据库中删除选定的关系。有关更多信息，请参见删除关系。

关系名

显示选定关系的名称。可以通过在此框中输入新名称重命名关系。有关更多信息，请参见重命名关系。

主键表

显示关系中主表的名称，后面是构成主键的列。有关更改主键的信息，请参见修改主键。

外键表

显示关系中外键表的名称，后面是构成外键的列。有关更改外键的信息，请参见修改外键。

创建中检查现存数据

在外键表上添加关系时，对数据库中已存在的数据应用约束。

对 INSERT 和 UPDATE 强制关系

对在外键表中插入、删除或更新的数据应用该约束。如果外键表中存在匹配的行，还将禁止删除主表中的行。

对复制强制关系

在将外键表复制到其它数据库时应用该约束。

级联更新相关的字段

无论何时更新主键值，都指示 DBMS 自动更新该关系的外键值。

级联删除相关的字段

无论何时删除主表的被引用行，都指示 DBMS 自动删除外键表的行。

请参见

数据库设计器和表设计器属性页


表属性页

该属性页包含数据库中表的一组属性。

选定的表

显示选定的表名。如果在关系图中选定的表不止一个，则只有第一个选定表的名称是可见的。展开列表以选择其它要检查或修改其属性的表。

所有者

显示表所有者的名称。所有者名称是 SQL Server 角色或 SQL Server 用户。下拉列表包含在数据库中定义的所有用户和角色。在下拉列表内，用户和角色具有不同的图标；角色图标显示两个人头，用户图标只显示一个人头。

只有当作为 db_owner 角色成员，或同时作为 db_ddladmin 和 db_securityadmin 角色的成员的用户连接数据库时，该控件才是可编辑的。

表名

显示选定的表名。若要重命名表，请在此框中输入新名称。有关更多信息，请参见重命名表。

表的标识列

显示由 SQL Server 用作表标识列的列。若要更改标识列，请从下拉列表中选择。可以在下拉列表内选择空项以表示该表没有标识列。

表的 ROWGUID 列

显示由 SQL Server 用作表的 ROWGUID 列的列。若要更改 ROWGUID 列，请从下拉列表中选择。可以在下拉列表内选择空项以表示该表没有 ROWGUID 列。

表文件组

选择要在其中存储选定表数据的文件组名。必须至少有一个用户定义的文件组才能启用该设置。如果创建了数据库对象但没有为其指定文件组，则 SQL Server 将其分配到默认文件组。默认文件组最初是主文件组。

有关更多信息，请参见在文件组上放置表。

文本文件组

选择要在其中存储选定表的文本和图像的文件组名。必须至少有一个用户定义文件组才能启用该设置。如果创建了数据库对象但没有为其指定文件组，则 SQL Server 将其分配到默认文件组。默认文件组最初是主文件组。

有关更多信息，请参见在文件组上放置表。

描述

可以在该字段中输入任何文本。输入的文本作为 SQL Server 2000 扩展属性实现。

请参见

数据库设计器和表设计器属性页


查询设计器属性页

查询设计器提供属性页以设置影响如何对数据库执行查询的选项。

若要 | 请参见
通过使用查询设计器设置查询属性来控制查询行为 | 属性窗口的查询选项卡（查询设计器）
通过使用视图设计器设置查询属性来控制查询行为 | 属性窗口的查询选项卡（视图设计器）
用特殊字符标记查询中的参数 | 属性窗口的参数选项卡
指定用于在多表查询中联接表的选项 | 属性窗口的联接线选项卡


属性窗口的查询选项卡（查询设计器）

包含控制正在生成或修改的查询行为的选项。

查询名

显示当前查询的名称。不能在此框中更改查询名。有关更多信息，请参见可视化数据库工具使用注意事项。

输出全部列

指定当前查询中所有表的全部列都将包含在结果集中。选择该选项相当于在 SQL 语句的 SELECT 关键字后指定星号 (*) 代替个别列名。

DISTINCT 值

指定查询将在结果集中筛选重复值。当只使用表中的部分列并且那些列可能包含重复值时，或者当联接两个或更多表的过程在结果集中生成重复行时，该选项非常有用。选择该选项相当于在 SQL 窗格的语句中插入 DISTINCT 关键字。

目的表

指定向其中插入行的表名。如果正在创建插入查询或生成表查询，将出现该列表。对于插入查询，从列表中选择表名。

对于生成表查询，则键入要创建的表名。查询设计器不检查该名称是否已经被使用，或者您是否有创建表的权限。若要在另一个数据库中创建目的表，请指定完全合法的表名，包括目标数据库名、所有者（若需要）以及表名。

GROUP BY 扩展项

指定基于聚合查询的视图的附加选项为可用选项。

WITH CUBE

指定聚合查询应为 GROUP BY 子句所指定的组生成汇总值。通过交叉引用 GROUP BY 子句中所包含的列，然后应用查询的聚合函数为附加的超聚合行生成汇总值来创建组。WITH CUBE 选项是多维的，从查询的聚合函数与列的所有组合中创建汇总。

WITH ROLLUP

指定聚合查询应为 GROUP BY 子句所指定的组生成汇总值。WITH ROLLUP 选项类似于 WITH CUBE 选项，但是只为聚合函数与列的每个组合创建一种汇总类型。

ALL

指定聚合查询将在汇总中包含所有的重复行。

Top

指定查询将包含 TOP 子句，该子句只返回结果集中的前 n 行或前百分之 n 行。默认情况下，查询返回结果集中的前 10 行。

使用此框指定返回的不同行数或指定百分比。

百分比

指定查询将包含 TOP 子句，只返回结果集中的前百分之 n 行。

With Ties

指定查询将包含 WITH TIES 子句。如果查询包含 ORDER BY 子句和基于百分比的 TOP 子句，WITH TIES 将非常有用。如果设置该选项，并且百分比截止在 ORDER BY 子句中具有相同值的一组行中间，则查询将扩大百分比的范围直到包含所有这样的行。

请参见

查询设计器属性页


属性窗口的查询选项卡（视图设计器）

包含控制正在生成或修改的视图行为的选项。

视图名

显示当前查询的名称。如果尚未保存视图，则将显示默认名称。不能在此框中更改名称。若要分配名称，请从"文件"菜单中选择"保存"或"另存为"命令。

输出全部列

指定当前显示的所有表中的全部列都将包含在视图中。选择该选项相当于指定星号 (*) 代替个别列名。

DISTINCT 值

指定查询将在视图中筛选重复值。当只使用表中的部分列并且那些列可能包含重复值时，或者当联接两个或更多表的过程在结果集中生成重复行时，该选项非常有用。选择该选项相当于在 SQL 窗格的语句中插入 DISTINCT 关键字。

加密视图

当保存视图时对其加密。将能持续使用视图，直到关闭视图设计器。

重要 关闭加密视图后，将不能在视图设计器中再次打开该视图。如果需要修改加密视图，必须删除该视图并重新创建一个。

GROUP BY 扩展项

指定基于聚合查询的视图的附加选项为可用选项。

WITH CUBE

指定聚合查询应为 GROUP BY 子句所指定的组生成汇总值。通过交叉引用 GROUP BY 子句中所包含的列，然后应用查询的聚合函数为附加的超聚合行生成汇总值来创建组。WITH CUBE 选项是多维的，从查询的聚合函数与列的所有组合中创建汇总。

WITH ROLLUP

指定聚合查询应为 GROUP BY 子句所指定的组生成汇总值。WITH ROLLUP 选项类似于 WITH CUBE 选项，但是只为聚合函数与列的每个组合创建一种汇总类型。

ALL

指定聚合查询将在汇总中包含所有的重复行。

检查选项

表示每次打开该视图并修改结果窗格时，DBMS 都检查添加或修改的数据是否满足视图定义的 WHERE 子句。

所有者

显示视图所有者的名称。所有者名称是 SQL Server 角色或 SQL Server 用户。下拉列表包含在数据库中定义的所有用户和角色。在下拉列表内，用户和角色具有不同的图标；角色图标显示两个人头，用户图标只显示一个人头。

仅在作为 db_owner 角色成员，或同时作为 db_ddladmin 和 db_securityadmin 角色的成员连接到数据库时，该控件才可编辑。

Top

指定查询将包含 TOP 子句，该子句只返回结果集中的前 n 行或前百分之 n 行。默认情况下，查询返回结果集中的前 10 行。

使用此框指定返回的不同行数或指定百分比。

百分比

指定查询将包含 TOP 子句，只返回结果集中的前百分之 n 行。

With Ties

指定视图将包含 WITH TIES 子句。如果视图包含 ORDER BY 子句和基于百分比的 TOP 子句，WITH TIES 将非常有用。如果设置该选项，并且百分比截止在 ORDER BY 子句中具有相同值的一组行中间，则将扩展视图以包含所有这样的行。

请参见

查询设计器属性页


属性窗口的数据源选项卡

为查询或视图的关系图窗格中显示的表或表结构化对象指定选项。

对象名

如果选定的对象是表、视图或函数，该控件将包含该对象的名称。

如果选定的对象是子查询，该控件将包含子查询的文本。

别名

包含选定对象的别名（若有）。可通过在此框中键入的方式来创建或修改对象的别名。

全名

如果选定的对象是表、视图或函数，该控件将包含对象的全名（如 Northwind.dbo.Invoices）。

如果选定的对象是子查询，该控件将包含子查询的文本。

请参见

查询设计器属性页 | 使用其它对象代替表


属性窗口的函数参数选项卡

指定表值用户定义函数的参数选项。该属性页包含网格，网格的每行描述一个参数。

选项

名称

包含参数名。不能编辑此框。

数据类型

包含参数的数据类型。不能编辑此框。

默认值

包含参数的默认值。不能编辑此框。

值

包含该查询使用的该参数的值。

请参见

查询设计器属性页


属性窗口的参数选项卡

指定用于在查询中标记参数的选项。

若要在查询中包含参数，必须用特殊字符标记该参数，这样查询设计器就不会将参数名误认为是文本数据。例如，如果将方括号（[ 和 ]）指定为参数标记，则可以通过指定如下的搜索表达式来输入参数：

= [last_name]

运行查询时，查询设计器提示您输入一个值，然后用该值替换参数 last_name。

有关在查询中使用参数的更多信息，请参见参数查询。

选项

前缀字符

指定标记参数开始的单个或多个字符。

后缀字符

指定标记参数结尾的单个或多个字符。

转义符

指定转义符，用来表示名称中的参数标记字符只具有字面意义。例如，如果将"%"指定为参数标记，则通常不能在参数名（如"% complete"）中包含该字符。但可以将"\"指定为转义符，然后将下面的字符串作为参数名：

%\% complete%

请参见

查询设计器属性页


属性窗口的联接线选项卡

指定用于在查询中联接表的选项。

默认情况下，相关表通过内联接进行联接，内联接基于包含联接列中匹配信息的行创建结果集。通过在"联接线"选项卡中设置选项，可以指定基于不同运算符的联接，并且可以指定外联接。

有关联接表的更多信息，请参见使用多个表进行查询。

选项

表

联接中所涉及的表名。不能在此处更改表名，该信息仅作为信息显示。

列

用于联接表的列名。运算符列表中的运算符指定列中数据之间的关系。不能在此处更改列名，该信息仅作为信息显示。

运算符

指定用于使联接列相关的运算符。若要指定等号 (=) 以外的运算符，请从列表中选择。当关闭对话框时，选定的运算符将出现在联接线的菱形图中，如下所示：

包括行

指定不匹配的行是否出现在"结果"窗格中。

<table1> 的所有行

指定左表中的所有行都出现在输出中，即使右表中没有对应的匹配行。右表中不含匹配数据的列显示为空。选择该选项相当于在 SQL 语句中指定 LEFT OUTER JOIN。

<table2> 的所有行

指定右表中的所有行都出现在输出中，即使左表中没有对应的匹配行。左表中不含匹配数据的列显示为空。选择该选项相当于在 SQL 语句中指定 RIGHT OUTER JOIN。

选择 <table1> 的所有行和 <table2> 的所有行相当于在 SQL 语句中指定 FULL OUTER JOIN。

当选择创建外联接的选项时，联接线中的菱形图会改变，以表示联接是左外联接、右外联接还是完整外联接。

注意 单词"左"和"右"并不一定对应于表在关系图窗格中的位置。"左"指其名称出现在 SQL 语句中 JOIN 关键字左边的表，而"右"指其名称出现在 JOIN 关键字右边的表。如果在关系图窗格中移动表，不会更改表的左或右位置。

请参见

查询设计器属性页


错误信息

在使用 Microsoft® 可视化数据库工具的过程中，可能会遇到消息框。有关这些消息的更多信息，请浏览下列主题。

数据库设计器疑难解答错误信息

查询设计器疑难解答错误信息

注意 可视化数据库工具依赖很多其它的应用程序和组件。如果接收到在可视化数据库工具文档中没有列出的错误信息，请参见疑难解答部分的错误信息。


数据库设计器疑难解答错误信息

在保存数据库关系图或关系图中的选定表时，可能会出现错误信息。有关这些错误信息的更多信息，请参见保存不完全对话框。

有关其它的可视化数据库工具错误信息的信息，请参见查询设计器疑难解答错误信息。

注意 可视化数据库工具依赖很多其它的应用程序和组件。如果接收到在可视化数据库工具文档中没有列出的错误信息，请参见疑难解答中的错误信息。


需要一对匹配的列以创建关系。

必须从参与外键关系的两个表中选择匹配的列。选定的列不匹配，因此它们无法相关。

请选择两个匹配的列，然后尝试建立关系。为了匹配，列的数目必须相同并且每对列的每一方都必须具有同等的数据类型。

有关更多信息，请参见外键和创建表间的关系。


无法在列 '<0s>' 上创建主键因为它允许 NULL 值。

主键用于使表与其它表的外键相关。所有参与主键的列都必须包含 NULL 以外的已定义值。

若要在选定的列上创建主键，请首先清除该列的"允许空"复选框。

有关更多信息，请参见主键和列属性。


无法在数据类型为 <0s> 的列上创建主键或索引。

列的数据类型定义可存储在列中的信息类型。不能在索引中使用 TEXT 或 Image 这类数据类型，因为服务器不允许这些数据类型有索引。

有关更多信息，请参见索引、创建唯一索引和定义主键。


主键或索引的列数不能超过 <0d>。

Microsoft® SQL Server™ 不允许在一个索引中超过 16 列。因为主键有关联的索引，所以主键中不能超过 16 列。

有关更多信息，请参见索引和定义主键。


在表 '<0s>' 可以参与关系之前，必须为其定义主键或唯一约束。

为创建外键关系，两个表中必须至少有一个定义了主键或唯一约束。若要创建正在尝试创建的关系，请首先为其中一个表创建主键。

有关更多信息，请参见定义主键和创建表间的关系。


关系中包含的列数不能多于 '<0d>'。

当定义外键关系时，选择的列要少于 16 个。

有关更多信息，请参见创建表间的关系。


含有列 '<1s> ' 的表 '<0s>' 已有索引。

Oracle 只允许每个有序列集有一个索引。

通常情况下，仅当经常查询选定列的数据时才应创建索引。索引将占用磁盘空间并会减慢行的添加、删除和更新速度。

大多数情况下，索引的好处远远超过性能上的开销，但是如果应用程序非常频繁地更新数据或有磁盘空间的约束，可能需要限制索引的数目。

有关更多信息，请参见索引和创建索引。


索引无法存在于空白列上。

索引至少必须包含一列，并且如果创建唯一索引，则该列必须包含唯一的数据值。选定的列名必须在"选定的索引"框的"列名"下输入。

有关更多信息，请参见索引和创建索引。


确实想从数据库中删除当前选定的内容？

将从数据库永久地删除表及其所有数据。

有关更多信息，请参见从数据库关系图和数据库中删除表。


确实想从数据库中永久删除表 '<0s>' 吗？

将从数据库永久地删除表及其所有数据。

有关更多信息，请参见从数据库关系图和数据库中删除表。


确实想从数据库中永久删除选定的表吗？

将从数据库中删除表及其所有数据。

有关更多信息，请参见从数据库关系图和数据库中删除表。


确实想从关系图中删除选定的表吗？

将从关系图中删除表，但该表仍保留在数据库中。

有关更多信息，请参见从数据库关系图中删除表。


确实想从关系图中删除选定的表吗？

将从关系图中删除表，而不是从数据库中删除表。

有关更多信息，请参见从数据库关系图中删除表。


关系中的双方必须具有相同的列数。

当创建复合外键关系时，关系的双方必须具有相同数目的列。确保选定的列数与目标表中的列数匹配。

有关更多信息，请参见创建表间的关系。


表 '<0s>' 中的列 '<1s>' 参与索引 '<2s>'。带 '<3s>' 数据类型的列无法参与索引或主键。

您已尝试更改作为索引或主键一部分的列的数据类型。不能为含有 TEXT 或 IMAGE 这类数据类型的列创建索引和主键。若要更改数据类型，请首先删除索引或主键。

有关更多信息，请参见索引、创建唯一索引和定义主键。


编辑该默认值将永久解除对已命名默认值的绑定。

在 Microsoft® SQL Server™ 中，不允许从命名默认值更改为默认约束。有关更多信息，请参见约束。


表 '<1s>' 中的标识列 '<0s>' 的数据类型必须是 int、smallint、tinyint、decimal 或小数位数为 0 的 numeric。

只有某些数据类型可以用于标识列。标识列中包含由系统生成的连续值，用于唯一标识表中的每一行。

有关更多信息，请参见列属性。


无效名称。必须为该对象提供名称。

必须有对象名才能继续。有效名称以下划线 (_) 或字符开头，并且由字符、数字和下划线组成。

对于 Microsoft® SQL Server™ 6.5 版及更早的版本，基于服务器的名称的最大长度是 32，对于 Oracle 也是 32。

一般情况下，请避免使用包含句点的名称。

有关更多信息，请参见唯一命名数据库对象。


ODBC 错误：<0s>。

生成了 ODBC 错误。可能删除了与某个外键值相关的记录，或者违反了 CHECK 约束。

有关详细信息，请参见 ODBC 文档。


一个或多个选定的表已经在该关系图中。

对于关系图上的任何表只能有一个复本。如果要创建与现有的表有某些相同列的新表，可以在创建新表时首先复制现有的表。

有关更多信息，请参见复制表。


在表 '<0s>' 上只能创建一个聚集索引。

聚集索引是一种特殊类型的索引，它将重新排列表中记录的物理存储方式。因此在每个表上只能创建一个聚集索引。

若要在同一个表上创建第二个索引，请在创建第二个索引之前更改"聚集"属性的设置。

有关更多信息，请参见索引和创建聚集索引。


每个表只能有一个 ROWGUID 列。

已尝试分配多个 ROWGUID。 ROWGUID 是与 IDENTITY 相似的特殊属性，只允许每个表有一个 ROWGUID。

有关更多信息，请参见设置列属性。


在加载关系图后关系 '<0s>' 已被修改或删除。

将要保存已修改的关系。可能其他用户从数据库中删除了该关系所涉及的表。

请验证是否要修改该关系。更改或删除一个表的关系可能会影响其它的表。

有关关系的更多信息，请参见表关系和删除关系。


表 <0s> 已经存在。

指定的表名已存在于数据库中。为新表键入另一个名称。


表 '<0s>' 标记为删除，未被添加到关系图中。

当保存更改时，从关系图中移出的表将从关系图中被删除。不过，该表不会从数据库中被删除。

有关更多信息，请参见从数据库关系图中删除表。

-或-

其他用户已经从数据库中删除该表，您无法将该表添加到关系图中。

有关更多信息，请参见从数据库关系图和数据库中删除表。


表 '<0s>' 在数据库中已不存在。

该表已经从数据库中删除，不能再用于关系图。

有关更多信息，请参见从数据库关系图和数据库中删除表。


无法在作为主键一部分的列上设置允许空属性。

所有是表主键一部分的列都必须包含 NULL 以外的聚合唯一值。若要将列添加到主键，请首先清除"列属性"对话框中的"允许空"复选框。

有关更多信息，请参见列属性。


无法在列 '<0s>' 上设置允许空属性，因为它是标识列。

所有的标识列都必须包含 NULL 以外的唯一值。若要使列成为标识列，请首先清除"列属性"对话框中的"允许空"复选框。

有关更多信息，请参见列属性。


表 '<0s>' 中的列与现有的已启用主键或 UNIQUE 约束不匹配。

至少有一个参与关系的表必须有一个主键或一个唯一约束 。为选定的一个表设置主键或唯一约束后，即可为该表定义其它关系。

有关更多信息，请参见创建唯一约束和定义主键。


表 '<0s>' 中的列与现有的主键或 UNIQUE 约束不匹配。

外键关系中主键方的列必须参与主键或唯一约束。为选定的一个表设置主键或唯一约束后，即可为该表定义其它关系。

有关更多信息，请参见创建唯一约束和定义主键。


无法更改表 '<0s>' 中列 '<1s>' 的数据类型，因为它参与了索引 '<2s>'。

索引中所有列的长度之和不能超过 256 字节。更改为指定的数据类型将导致索引的最大大小超过 <3d> 字节。

有关更多信息，请参见列属性和创建索引。


下面 '<0s>.<1s>' 的数据类型或大小属性与 '<2s>.<3s>' 不匹配。

创建外键关系时，选定列的数据类型和其它属性必须匹配。请选择与相关列具有相同的数据类型和其它属性的列。必须匹配的属性包括数据类型、长度、精度、小数位数和排序规则。


无法在列 '<0s>' 上设置默认值属性，因为它是标识列。

标识列包含由系统生成的连续值，用于唯一标识表中的每一行。因此，标识列不能包含默认值。

有关更多信息，请参见列属性。


现有的关系必须至少有一对相关列。

外键关系的双方都必须是匹配的列。删除作为关系的一部分的列将禁用该关系。

有关更多信息，请参见创建关系。


无法在列 '<0s>' 上设置标识属性，因为它允许空值。

标识列包含由系统生成的连续值，用于唯一标识表中的每一行。因此，标识列不能包含空值。

有关更多信息，请参见列属性。


无法在列 '<0s>' 上设置标识属性，因为它有默认值。

标识列包含由系统生成的连续值，用于唯一标识表中的每一行。因此，标识列不能包含默认值。

有关更多信息，请参见列属性。


选定的列数超过了目标表中的列数。

当使用的列超过目标表中的现有列数时，不能创建复合外键关系。确保选定的列数与目标表中的列数匹配。

有关更多信息，请参见创建表间的关系。


在删除现有的关系前无法更改主键或 UNIQUE 约束。

当其它外键关系仍存在位时，不能更改表的主键或唯一约束。若要更改表的主键或唯一约束，请首先删除表的所有现有关系。

有关更多信息，请参见删除关系。


当强制与现有主键或唯一约束的关系时，不能更改主键或唯一约束。

当其它外键关系仍存在位时，不能更改表的主键或唯一约束。若要更改表的主键或唯一约束，请首先删除表的所有现有关系。

有关更多信息，请参见删除关系。


索引或主键的总大小不能超过 256 字节。

索引中所有列的长度之和不能超过 256 字节。更改为指定的数据类型将导致索引的最大大小超过 <3d> 字节。

有关更多信息，请参见索引, 列属性和创建索引。


您没有作为数据库所有者或 db_owner 角色的成员登录。您不能保存对不属于您的表的更改。

因为您没有作为系统管理员、数据库所有者或 db_owner 角色成员的用户登录，所以对数据库只有有限的特权。您所拥有的特权取决于为登录 ID 授予的权限以及为登录 ID 所属角色授予的特权。

即使不是数据库所有者，仍能使用任何对其有查看权限的表。例如，可以使用这些表创建关系图。但是将无法执行所有编辑。某些编辑需要 SQL Server CREATE TABLE 权限，该权限授予创建新表和修改所拥有表的权限。

即使有 CREATE TABLE 权限，对可以进行的修改也有限制。请记住，当修改现有的表或设计新表时，所做的工作会导致其它表中的相应修改。例如，如果更改外键列的数据类型，可视化数据库工具将自动修改主表中的相应列。如果不拥有主表，而且没有作为系统管理员、数据库所有者或 db_owner 角色的成员登录，则修改将失败。

有关更多信息，请参见在多用户环境中工作。


不允许空白约束表达式。

在继续定义表的属性之前，必须在"约束表达式"对话框中输入约束。

有关更多信息，请参见创建唯一约束。


确实想从数据库中删除选定的关系吗？

回答"是"将删除选定的关系。

有关关系的更多信息，请参见表关系和删除关系。


删除选定的列将同时删除关系。

选择要删除的列包含现有的关系。删除这些列将删除与它们相关的关系。

有关关系的更多信息，请参见表关系和删除关系。


是否想保存该关系图中的更改？

已更改了该关系图。如果不保存更改即关闭该关系图，更改将丢失。是否想保存更改？

有关数据库图表的更多信息，请参见数据库设计器。


是否想保存该表中的更改？

已更改了该表。如果不保存更改即关闭该表，更改将丢失。是否想保存更改？

有关使用表的更多信息，请参见表。


数据库设计器错误

没有关于此错误的具体帮助。如果错误信息中的文本不能为解决问题提供足够的信息，可考虑以下选项：

  • 验证设置值是否正确，并再次尝试操作。

  • 使用索引搜索与该错误信息相关的关键字。

  • 如果问题是由外部应用程序或软件引起的，请参见相关部分的文档。例如，错误可能是由于所使用的数据库软件、服务器设置或网络引起的。

  • 对于数据库修改错误（如数据库表中的无效参数），请参见数据库软件以了解详细信息。

  • 查看 Readme 文件中关于该错误的最新信息。


内部错误。

发生了意外错误。可以尝试以下补救措施：

  • 重试操作。

  • 重新启动应用程序并重试。

  • 重新启动计算机并重试。

  • 用可视化数据库工具在 Microsoft Web 站点 上的知识数据结构中检查有关内部错误的可用新信息。


名称太长。

为数据库对象提供的名称太长。请输入较短的名称。


不支持该后端版本设计数据库关系图或表。

正连接的数据库不允许使用可视化数据库工具修改架构。确保连接到正确的数据库。


将列更改为选定数据类型会删除关系。

正在更改其数据类型的列参与了外键关系。如果更改数据类型，将删除关系。选择"是"将继续操作并删除关系。选择"否"停止操作。

注意： 选择"否"不会取消已在数据库中完成的那部分操作。


将公式添加到选定的列将删除它参与的全部索引和关系。

正在修改的列参与了一个或多个关系或者分配给了一个或多个索引。修改该列后，它将成为计算的列，不能参与关系或分配给索引。选择"是"将继续操作并删除索引和关系。选择"否"取消操作。


从选定的列中删除公式将使该列的数据类型被排除在索引和关系的允许范围外。

正在删除其公式的列参与了一个或多个索引或关系。修改将导致该列的数据类型使该列不能参与索引或关系。选择"是"将继续修改并删除索引和关系。选择"否"将取消修改。


将列更改为选定的数据类型将删除其索引。

正在更改其数据类型的列分配给了一个或多个索引。修改将删除索引。选择"是"将继续修改并删除索引。选择"否"将取消修改。


更改列的数据类型将导致索引过大。

正在更改其数据类型的列分配给了一个或多个索引。新的数据类型将增大列，使该列的一个或多个索引过大。选择"是"将继续修改并删除索引。选择"否"将取消修改。


将公式添加到选定的列会删除该列作为外键参与的所有关系。

正向其中添加公式的列分配给了一个或多个外键。修改将删除相关的外键关系。选择"是"将继续修改并删除关系。选择"否"将取消修改。


验证列的公式时出错。

该公式中含有错误。常见的错误包括括号不匹配、列名拼错、在某列上使用的运算符不受该列的数据类型支持。选择"是"将修改公式。选择"否"将不修改公式。


列没有名称，并将被删除。

由于列名字段为空白，因此将删除该列。选择"是"将删除该列。选择"否"将返回到表设计器或数据库关系图以提供列名。


无法在列 '<0s>' 上创建主键或索引，因为其数据类型是 '<1s>'。

在索引或主键中包含的某列的数据类型使该列不能参与键或索引。更改列的数据类型，或将其从索引或主键中删除。

有关限制索引和键列数据类型的规则的更多信息，请参见创建和修改 PRIMARY KEY 约束和表索引。


无法在没有名称的列上创建主键或索引。

主键中包含了没有名称的列。在将该列包含到主键中之前先为该列提供名称。


为 '<1s>' 输入了 <0d> 个字符。允许的最大字符数为 <2d>。

输入的属性值比该属性的允许最大值长。选择较短的值。


'<0s>' 的值必须在 <1d> 和 <2d> 之间。

输入的属性值在该属性的合法值范围之外。选择指定范围内的值。


表 '<0s>' 中没有列。

试图保存的表中没有列。请向该表中添加列，或从关系图中删除该表，或不保存该表即关闭表设计器。


不能在列 '<0s>' 上设置默认值属性，因为它是计算的列。

试图在包含公式的列上设置默认值。请在设置默认值前先删除该列的公式。


列 '<0s>' 是计算的列，无法参与索引或关系。

试图在索引或关系中使用包含公式的列。在 SQL Server 7.0 数据库中，计算的列不能参与索引或关系。在 SQL Server 2000 中，计算的列可以参与索引，但不能参与关系。请清除该列的"公式"属性或从索引或关系中删除该列。


列 '<0s>' 是计算的列，无法分配给外键。

试图在外键中使用包含公式的列。请清除该列的"公式"属性或从外键中删除该列。


索引用于强制该表的全文本键。删除该索引将禁用该表的全文索引。是否继续？

正在执行的操作将删除索引，该索引用作该表的全文索引键。如果继续操作，将禁用该表的全文索引。


列 '<0s>' 用于强制表 '<1s>' 的全文本键，其长度必须小于或等于 <2d> 字节。

正在执行的操作将增大列，而该列用作该表的全文索引键，增大将使其超出这类列的最大大小。选择"是"将继续操作并禁用该表的全文索引。选择"否"取消操作。


列 '<0s>' 参与了表 '<1s>' 上的全文索引。更改后，该列将无法参与该表的全文索引。

正在执行的操作不允许对该列中的数据执行全文检索。选择"是"将继续操作并禁用该列的全文检索。

即使选择"是"，也不影响参与该表全文索引的其它列。也就是说，仍能对这些列中的数据执行全文检索。


更改排序规则时遇到以下错误：<0s>。

由于存在消息中所描述的根本问题，排序规则未更改。更改列的排序规则与更改其数据类型类似。也就是说，更改排序规则后，可视化数据库工具将验证列的数据类型。验证能揭示许多问题，包括：

  • 修改增大了列，这反过来又使索引增大到超出索引的最大值。

  • 修改与列中现有的数据值不兼容。

请为列选择不同的排序规则或解决根本问题。


索引 '<0s>' 用于强制表 '<1s>' 的全文本键，不能为空。

正在执行的操作将允许列中有空值，而该列用作该表的全文索引键。继续操作以禁用该表的全文索引，或取消操作以保留全文索引。


索引 '<0s>' 用于强制表 '<1s>' 的全文本键，必须是单列。

正向索引添加列，而该索引用作该表的全文索引键。继续操作将禁用该表的全文索引。选择"是"继续操作并禁用全文索引。选择"否"取消操作。


索引 '<0s>' 用于强制表 '<1s>' 的全文本键，必须是唯一的。

该操作将允许索引上有重复值，而该索引用作该表的全文索引键。如果继续操作，将禁用该表的全文索引。选择"是"继续操作并禁用全文索引。选择"否"取消操作。


索引 '<0s>' 用于强制表 '<1s>' 的全文本键，其长度必须小于或等于 <2d> 字节。

该操作将增大索引，而该索引用作该表的全文索引键，并且超出了这类索引的最大大小。如果继续操作，将禁用该表的全文索引。选择"是"继续操作并禁用全文索引。选择"否"取消操作。


标识递增量必须是位数等于或小于 <0d> 的数字。

为标识递增量字段输入的值无效。输入位数小于错误信息中指出的最大值的整数。如果列的数据类型是 TINYINT，则必须输入正数。对于任何其它数据类型，可以输入正数或负数。


标识种子必须是位数等于或小于 <0d> 的数字。

为标识种子字段输入的值无效。输入位数小于错误信息中指出的最大值的整数。如果列的数据类型是 TINYINT，则必须输入正数。对于任何其它数据类型，可以输入正数或负数。


该表必须至少有一个非计算列。

不能创建所有的列都是计算列的表。不过，可以创建包含的数据全都是计算数据的视图。

有关更多信息，请参见查询和视图。


新关系必须至少有一对相关列。

关系必须至少使外键表中的一列与主表中的一列相关。请从每个表中选择一列或删除关系。


列 <0s> 和列 <1s> 的排序规则属性不匹配。

关系的主表和外键表中的每对对应列必须有相同的排序规则设置值，但是该关系包含一对设置不同的对应列。请从关系中删除列或将排序规则设置更改为相同的值。


在选择任何关系字段之前先选择主表和外键表。

试图在指明关系的另一个表前先从第一个表中选择列。在选择列之前，必须先指出主表和外键表。


您的登录不具备 CREATE TABLE 权限；可能不能进行某些需要该权限的编辑操作。

正在创建或修改数据库中的表，您的登录 ID 在该数据库内没有 CREATE TABLE 权限并且不是 DBO 角色成员。请与数据库管理员联系，确认在数据库中有创建表所需的权限。

请记住，表面上对现有表无害的修改可能需要 CREATE TABLE 权限。例如，向表添加列时，可视化数据库工具会指示 SQL Server 删除表、重新创建表以及重新插入表中原来包含的行。


长度的设置值必须介于 <0d> 和 <1d> 之间。

必须输入一个整数，其大小应在错误信息中指定的范围内。


精度的设置值必须介于 <0d> 和 <1d> 之间。

必须输入一个整数，其大小应在错误信息中指定的范围内。


小数位数的设置值必须介于 <0d> 和 <1d> 之间。

必须输入一个整数，其大小应在错误信息中指定的范围内。


无法修改属性。

试图更改的属性与已指定的其它属性不兼容。


数据库中已存在同名的关系图。

数据库中已存在同名的关系图。选择"是"将会要保存的关系图替换现有的关系图。


在您操作关系图时另一个用户修改了该关系图。

自您打开关系图并开始使用该关系图后，另一个用户已在数据库中保存了对该关系图的修改。如果保存您的修改，将覆盖该用户的更改。

有关更多信息，请参见多用户环境。


正加载到内存的表中含有无法识别的用户定义数据类型。

正在加载到内存的表引用了最近创建的用户定义数据类型，但是内存中的用户定义数据类型列表中不包括该数据类型。

因为该数据类型是最近创建的，所以本地内存中不存在该数据类型。在与数据库的连接内打开第一个表设计器窗口或数据库关系图时，所有的用户定义数据类型将从该数据库加载到本地内存中。若要刷新该数据库在内存中的用户定义数据类型复本，请关闭该数据库连接内所有打开的数据库关系图和表设计器窗口。全部关闭完后，依次重新打开它们。重新打开第一个窗口时，用户定义数据类型的列表将得以刷新。

有关更多信息，请参见多用户环境。


在能够加载下列表前，将使用如下更改更新您的关系图以匹配数据库。

试图添加到关系图的表与关系图上已存在的表相关，此关系由于某种原因与关系图的内容相矛盾。自您开始使用该关系图后，另一个用户添加或修改了关系，因此发生了这种情况。

请记住，当向关系图添加表时，数据库设计器将自动包括现有表和新添加表之间的任何关系。数据库设计器在尝试添加这样的关系时，发现该数据库结构在内存中的复本不再与数据库的内容相匹配。因此在添加表前，数据库设计器将相应地更新关系图。

例如，假设关系图最初与数据库一致。关系图中包括两个表（Student 和 Course）以及这两个表间的一对一关系，称为 TutoringAssignment。该关系表明每个学生可以辅导一门课程，且每门课程可由一个学生辅导。关系图中最初不包括其它表。

当使用关系图时，另一个用户更改了数据库结构。该用户删除了 TutoringAssignment 关系，并在表 Student 和 SectionOfCourse 之间添加了另一个同名的关系。（这些更改改进了数据库结构，因为更如实地表示了单位的信息需求。指派学生辅导课程的特定部分，而不是一般的课程。）另一个用户提交了对数据库所做的这些更改。

现在将 SectionOfCourse 表添加到关系图中。因为该表与关系图上已有的 Student 表有关系，数据库设计器将尝试包括关系图上的这个关系。而将要包括的关系与关系图上存在的现已过时的关系同名，因此产生冲突。

由于存在这些冲突，数据库设计器将相应地更新数据库结构在内存中的复本。也就是说，将删除表 Student 和 Course 之间的 TutoringAssignment 关系。只有在此时，数据库设计器才将表 SectionOfCourse 和 Student 与 SectionOfCourse 之间的 TutoringAssignment 关系添加到关系图。

注意 数据库设计器不对关系图与数据库之间的任何差异进行协调。而只协调那些将会防碍将表添加到关系图的差异。


将使用如下更改更新您的表以匹配数据库。

表设计器需要加载有关尝试与其建立关系的表的信息。例如，需要加载有关其它表的列的详细信息，以便可以从正在设计的表中选择与其它表的列相对应的列。

数据库的内容和表设计器的内存中内容发生冲突。之所以存在这种冲突，是因为其他用户最近修改了您正在使用的表，而表设计器在本地内存中保留了表的更早版本。

错误信息的正文显示冲突的详细信息。在继续将其它表加载到本地内存前，表设计器将相应地协调这些冲突。

注意 表设计器不对本地内存与数据库之间的任何差异进行协调。而只协调那些将会防碍创建尝试创建的关系的差异。


下面的架构绑定对象将被修改。

正在修改的对象分配给了一个或多个架构绑定对象的定义。这些架构绑定对象将被修改或丢弃。错误信息的正文提供详细信息。


列是参与某个表上全文索引的列的全文本过滤。

您正试图删除某列或更改其数据类型，但该列是其它一个或多个存在全文索引的列的全文本过滤。如果继续该操作，这些列将不再参与全文索引。

如果以后希望重新建立这些列的全文索引，您必须选择或创建一个新的全文本过滤字段，并将这些列重新添加到全文索引当中。有关完成这些任务的信息，请参见全文索引。


查询设计器疑难解答错误信息

这部分包含当用查询设计器创建和运行查询时可能返回的消息列表。当尝试保存或执行查询时，通常会出现这些错误。

有关其它的 Microsoft 可视化数据库工具错误信息的更多信息，请参见数据库设计器疑难解答错误信息。

注意 如果接收到一个在可视化数据库工具部分没有列出的错误信息，请参见错误信息。


忽略 (+) 运算符。

输入的 Oracle 外联接运算符不合适，因此将被忽略。

有关更多信息请参见联接类型和创建外联结。


(+) 表引用无法与多个表联接。

尝试联接表引用的方法有错误。该表引用只能与一个其它表联接。

有关更多信息，请参见联接类型。


表达式中的 <0s> 不是查询的一部分。

查询中的表达式格式不正确。当输入的标准表达式与可用的输入源列不匹配时，通常会出现该错误。请清除该值，然后键入与输入源匹配的列引用。

有关更多信息，请参见在查询中使用表达式。


查询设计器不支持 <0s> SQL 构造。

输入的语法有效，但查询设计器不能直观地支持该语法。请确保在保存前验证语法。

有关更多信息，请参见支持的查询类型。


<0s> 无法用于该查询类型。

选定的查询类型不允许正在尝试的操作。验证查询语法或更改查询类型。

有关更多信息，请参见支持的查询类型。


<0s> 支持在该服务器版本上不可用。

尝试使用的功能不为服务器软件所支持。


已影响许多行。

查询已成功执行。生成表的过程影响了指定的行。


二义性的外联接 (+) 运算符。

查询设计器要求在设计查询时遵循特定的规则。查询设计器无法处理输入的外联接运算符。请检查 SQL 语句的语法。

有关更多信息，请参见创建外联接。


无法生成合适的 SQL。

Microsoft 可视化数据库工具查询设计器要求在设计查询时遵循特定的规则。如果使用关系图或网格窗格创建无法用 SQL 语句表示的查询，则会出现该错误。请验证选定的查询选项。

有关更多信息，请参见创建查询和指定搜索准则。


您将删除行（一行或多行）。

选择"是"将从表中删除选定的行。如果回答"是"，删除操作将立即传送到数据库。将无法撤消所做的更改。

有关删除行的更多信息，请参见在结果窗格中删除行。

有关使用查询更改数据的更多信息，请参见操作数据。


错误的顶端值。

查询中的顶端值无效或超出范围。如果没有使用 PERCENT 子句，则 top 子句的值必须为整型值。若要使用 PERCENT 子句，只需在单元内的数字值后键入 PERCENT 关键字。

有关更多信息，请参见输入搜索值。


无法将表达式放入选择列表中。

对选择列表中所允许的表达式有限制。正尝试添加的表达式可能无效。请验证表达式的语法是否正确。表达式的类型可能无效。

有关更多信息，请参见在查询中使用表达式。


无法为该字段分配别名。

只能为合适的列或表创建别名。所选择的字段无效。请验证字段的设置是否正确。

有关更多信息，请参见创建列别名或创建表别名。


无法将条目转换为有效的日期/时间。

Microsoft 可视化数据库工具查询设计器要求在设计查询时遵循特定的规则。请验证输入项是否正确。

有关更多信息，请参见操作数据。


无法转换为正确的类型。

转换值时，Microsoft 可视化数据库工具查询设计器要求遵从特定的规则。无法转换该查询。请验证查询中的信息和查询类型是否合适。

有关更多信息，请参见表达式函数。


无法删除包含未知键的行。

尝试删除的行含有未知键。此时无法删除该行。

有关更多信息，请参见在结果窗格中删除行。


无法编辑包含未知键的行。

尝试编辑的行含有未知键。

有关更多信息，请参见在结果窗格中编辑行。


无法编辑该单元。

无法编辑选定的单元。此单元可能是计算结果或联接表的一部分。

有关更多信息，请参见操作数据。


无法筛选该表达式。

无法筛选输入的表达式。如果用户输入的准则是基于 * 或基于 QBE 中的空字段，则一般会出现该错误。用户应该只基于 QBE 中已有的字段输入准则。

有关更多信息，请参见指定搜索准则。


无法插入到该表达式。

无法将数据插入到选定的表达式。此时不支持该功能。

有关更多信息，请参见创建插入查询。


无法打开已加密的 <0s> <1s>。

加密并关闭视图后，无法再打开该视图。

有关更多信息，请参见创建视图。


无法更新该表达式。

无法更新选定的表达式。

有关更多信息，请参见在查询中使用表达式。


该上下文中无法使用数据类型为 IMAGE 或 TEXT 的列。

Microsoft 可视化数据库工具查询设计器要求在设计查询时遵循特定的规则。

有关更多信息，请参见创建查询和指定搜索准则。


该上下文中无法使用 LONG 数据类型。

Microsoft 可视化数据库工具查询设计器要求在设计查询时遵循特定的规则。

有关更多信息，请参见创建查询和指定搜索准则。


对于生成表查询不支持列列表。

对于 Oracle 生成表查询，查询设计器不支持包括可选的列列表。请删除列列表，并且在 select 语句中改为使用列别名。

有关更多信息，请参见创建生成表查询。


带有 (+) 运算符的列没有引用有效表。

查询列中使用的运算符必须引用有效的表。查询设计器无法验证当前引用的表。请验证数据库中是否存在该表，并且查询设计器是否能够访问它。

有关更多信息，请参见指定搜索条件。


数据源别名为只读。

无法编辑只读值。若要使用该数据源，需要该数据源的可用于查询设计器的写启用版本。

有关更多信息，请参见操作数据。


数据源基名称为只读。

无法编辑只读值。若要使用该数据源，需要该数据源的可用于查询设计器的写启用版本。

有关更多信息，请参见操作数据。


表达式中的数据类型错误。

使用不同数据类型的表达式会生成错误。要在单个表达式中使用几种不同的数据类型，需要先转换成相同的数据类型。

有关更多信息，请参见创建表达式。


数据类型不匹配 -- 不可能进行转换。

 可视化数据库工具

数据类型不匹配 — 不可能进行转换。

要在单个表达式中使用几种不同的数据类型，需要先转换成相同的数据类型。无法转换已选定的数据类型。

有关更多信息，请参见在查询中使用表达式。


数据类型不匹配 -- 请使用 CONVERT 函数。

 可视化数据库工具

数据类型不匹配 — 请使用 CONVERT 函数。

要在单个表达式中使用几种不同的数据类型，需要先转换成相同的数据类型。必须先转换其中的一个数据类型才能继续。

有关更多信息，请参见在查询中使用表达式。


DELETE 语句与 COLUMN REFERENCE 约束冲突。

尝试执行查询时发生冲突。查询设计器已尝试确定冲突的直接来源。请检查查询语法以尝试解决冲突。


是否要禁止更多的错误信息说明无法粘贴记录的原因？

如果回答"是"，则收不到解释为何无法正确粘贴记录的消息。


函数 '<0s>' 后错误

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和创建查询。


'<0s>' 附近谓词后错误

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和创建查询。


EXISTS 子句前错误。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和创建查询。


EXISTS 子句前错误：'<0s>' 无法识别。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和创建查询。


FROM 子句前错误。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和创建查询。


UNION 运算符后错误。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和创建查询。


列列表错误。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和创建查询。


列列表错误：'<0s>' 无法识别。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和创建查询。


目的表规范错误。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

要达到最佳效果，请不要在目的表规范中包含句号。

有关更多信息，请参见指定搜索准则和创建查询。


'<0s>' 附近的 FROM 子句错误

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和创建查询。


GROUP BY 子句错误。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和汇总和分组。


'<0s>' 附近的 GROUP BY 子句错误。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和汇总和分组。


HAVING 子句错误。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和在行组上查询。


'<0s>' 附近的 HAVING 子句错误。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和在行组上查询。


INSERT 语句错误。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和创建查询。


INSERT 语句错误：'<0s>' 无法识别。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和创建查询。


联接表达式错误。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和使用多个表进行查询。


联接表达式错误：'<0s>' 无法识别。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和使用多个表进行查询。


函数参数列表错误：'<0s>' 无法识别。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和创建查询。


值列表错误。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和创建查询。


IN 子句中的值列表错误。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和创建查询。


IN 子句中的值列表错误：'<0s>' 无法识别。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和创建查询。


值列表错误：'<0s>' 无法识别。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和创建查询。


'<0s>' 附近的 ON 子句错误。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和创建查询。


可选的 FROM 子句错误。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和创建查询。


ORDER BY 子句错误。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和创建查询。


'<0s>' 附近的 ORDER BY 子句错误。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和创建查询。


SELECT 子句错误：别名 '<0s>' 无法识别。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和创建查询。


SELECT 子句错误：别名无法识别。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和创建查询。


SELECT 子句错误：'<0s>' 附近的表达式。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和创建查询。


UPDATE 子句中的集合列表错误。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和创建查询。


DELETE 子句中的表名或视图名错误。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。确保根据需要使用"被引用的标识符"。

有关更多信息，请参见指定搜索准则和创建查询。


DELETE 子句中的表名或视图名错误：'<0s>' 无法识别。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。确保根据需要使用"被引用的标识符"。

有关更多信息，请参见指定搜索准则和创建查询。


INSERT 子句中的表名或视图名错误。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。确保根据需要使用"被引用的标识符"。

有关更多信息，请参见指定搜索准则和创建查询。


INSERT 子句中的表名或视图名错误：'<0s>' 无法识别。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。确保根据需要使用"被引用的标识符"。

有关更多信息，请参见指定搜索准则和创建查询。


UPDATE 子句中的表名或视图名错误。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。确保根据需要使用"被引用的标识符"。

有关更多信息，请参见指定搜索准则和创建查询。


查询语句后的文本错误：'<0s>'。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和创建查询。


INSERT INTO 子句中的值列表错误。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和创建查询。


INSERT INTO 子句中的值列表错误：'<0s>' 无法识别。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

请确保列列表中的项数与值列表中的项数相匹配。

有关更多信息，请参见指定搜索准则和创建查询。


'<0s>' 附近的 WHERE 子句错误。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和在行组上查询。


函数参数计数错误。

查询中函数的参数个数错误。请检查查询语法以定位该函数。

有关更多信息，请参见表达式函数和指定搜索准则。


忽略对 ALL 的非法使用。

查询的语法中有错误。查询设计器已尝试确定错误的来源。尽管查询能运行，但也应该检查查询语法并更正错误。

有关更多信息，请参见指定搜索准则和指定搜索条件。


忽略 ODBC 语法。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和指定搜索条件。


非法使用表达式列表。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和指定搜索条件。


非法序列使用。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和指定搜索条件。


非法使用外联接运算符。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见创建外联接。


不完整的列列表。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和指定搜索条件。


不完整的 SET 子句。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和指定搜索条件。


不完整的 VALUES 列表。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和指定搜索条件。


退出该窗格前必须先解决无效输入项。

退出一个窗格将使其它窗格更新。如果正在编辑的窗格中有无效输入项，则需要更改或删除该项。


转义符无效。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

转义符必须是单个字符。

有关更多信息，请参见指定搜索准则和指定搜索条件。


标识符 '<0s>' 无效。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和指定搜索条件。


表达式无效或丢失。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和指定搜索条件。


'<0s>' 附近的表达式无效或丢失。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和指定搜索条件。


前缀或后缀字符无效。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和指定搜索条件。


行索引无效：Goto 失败。

在 GoTo 记录字段中输入了非数值型值。请改为输入数值型值。如果输入的数值大于表中的行数，将移到最后一个记录。

有关更多信息，请参见指定搜索准则。


文本或符号无效。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和指定搜索条件。


视图名无效。

指定的视图名无效。有效的名称以下划线 (_) 或字符开头，并且包含字符、数字及下划线的组合。

Microsoft® SQL Server™ 6.5 的视图名称最大长度是 32，Oracle 的视图名称最大长度是 32，SQL Server 7.0 和 SQL Server 2000 的视图名称最大长度是 128。不能使用过去某段时期的名字。

有关更多信息，请参见使用视图。


LIKE 谓词中的转义字符丢失。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和指定搜索条件。


FROM 子句丢失。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和指定搜索条件。


'<0s>' 附近的 FROM 子句丢失。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和指定搜索条件。


丢失 FROM 关键字。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和指定搜索条件。


'<0s>' 附近的 FROM 关键字丢失。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和指定搜索条件。


丢失 INTO 关键字。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和指定搜索条件。


'<0s>' 附近的 INTO 关键字丢失。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和指定搜索条件。


SELECT 子句丢失或不完整。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和指定搜索条件。


LIKE 谓词中的样式丢失。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和指定搜索条件。


丢失 SET 关键字。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则和指定搜索条件。


丢失子查询。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见创建子查询。


丢失子查询相关名称。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见创建子查询。


子查询丢失或输入的运算符需要圆括号。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见创建子查询。


必须输入 TRUE 或 FALSE。

为 EXISTS 语句指定准则时，对 EXISTS 必须使用 True，对 NOT EXISTS 必须使用 False。

有关更多信息，请参见指定搜索准则。


外联接列不能同 IN 谓词或子查询一起使用。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见创建外联接。


查询设计器无法打开该查询文件。

查询设计器无法打开指定的查询文件。请确认该文件是否为查询文件。该文件可能已损坏，或者来自不支持的查询设计器版本。

有关更多信息，请参见支持的查询类型。


已成功执行了查询。

查询已成功执行。


行限制值应在 <xxx> 和 <xxx> 之间。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见输入搜索值。


无法对 SQL 语句做语法分析。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见创建查询。


已针对数据源检查过 SQL 语法。

已成功验证 SQL。

有关更多信息，请参见创建查询和指定搜索准则。


表引用中的语法错误。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见创建查询和指定搜索准则。


表引用中的语法错误：'<0s>' 无法识别。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则。


ODBC 驱动程序返回了一个无效的 ODBC 版本并需要更新。

ODBC 驱动程序不是当前版本。为获得最佳效果，请使用 Microsoft 可视化数据库工具 (Visual Database Tools) 安装程序提供的 ODBC 驱动程序。

有关更多信息，请参见 ODBC 文档。


WHERE 子句中不允许使用 GROUP BY 函数。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见在行组上查询。


NOT 关键字不能用于列单元。

当在"列"单元中输入 NOT EXIST 子查询时，请只输入 EXIST 子句。然后，转到"准则"单元并输入 False。

有关更多信息，请参见指定搜索准则。


对 CREATE TABLE 查询不支持 ORDER BY。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见重新排列输出列。


外联接运算符 (+) 不允许作为 OR 操作数。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见创建外联接和指定搜索准则。


网格窗格中不允许外联接运算符 (+)。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见创建外联接。


无法执行查询，因为一些文件丢失或未注册。

查询设计器无法定位查询文件，并且无法运行查询。可能需要重新安装该产品。


查询设计器不支持关键的 ODBC API。

不支持正尝试使用的 API。请参见 ODBC 驱动程序文档。只要可能，就使用 Microsoft 提供的 ODBC 驱动程序。


查询设计器不支持当前的 ODBC API。

不支持正尝试使用的 API。请参见 ODBC 驱动程序文档。只要可能，就使用 Microsoft 提供的 ODBC 驱动程序。


在该类型的查询中查询设计器无法支持一个以上的表。

该查询类型只能使用一个数据源。

有关更多信息，请参见支持的查询类型。


指定的 OR 组数已经被使用。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则。


输入的值与该列的数据类型或长度不一致。

输入的值必须与列数据类型匹配。

有关更多信息，请参见输入搜索值。


子查询选择列表中没有足够多的值。

SELECT 语句包含的列数必须与嵌入式子查询返回的列数相同。

有关更多信息，请参见创建子查询。


没有足够列与值列表匹配。

UPDATE 或 INSERT 语句包含的值比要更新的表多。请验证 SQL 语句，以确保列数与表相匹配。


没有选定的列。请选择一列或多列并重新运行查询

SELECT 列表不包含任何输出列。指定要返回的列并再次运行查询。


该查询中没有唯一表。

查询需要没有二义性地标识从哪个表返回值。


ALIAS 名已经被使用。

别名必须唯一。请输入不同的别名。

有关更多信息，请参见创建表别名和创建列别名。


该单元包含文本字符串 "<NULL>"，可能没有正确处理。

使用 NULL 或 NOT NULL 比较空数据。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见创建查询。


IS 运算符只能同 NULL 或 NOT NULL 一起使用。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则。


该运算符无法与数据类型为 uniqueidentifier 的列一起使用。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则。


表不在查询定义中。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见创建查询。


字段包含的字符太多。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见创建查询。


无法定位数据源。

找不到指定的数据源。请检查数据源位置及输入的位置。


无法对表达式做语法分析。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则。


无法对查询文本做语法分析。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则。


无法分析语句。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则。


未知列。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则。


未知的转换规格。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则。


可能不必使用 CONVERT 函数。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则。


SQL 文本无法出现在网格窗格和关系图窗格中。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则。


视图在数据库中已存在。

数据库中的视图名必须唯一。请输入不同的视图名。

有关更多信息，请参见创建视图。


您可能没有执行该操作的权限，或者数据库中对象 <0s> 已不存在。

要使用的对象可能已列出，但您可能对该对象没有 SELECT 权限。或者，该对象在数据库中可能已不存在。

刷新对象的列表以确定该对象是否仍在数据库中。如果该对象仍存在，请与该对象的所有者或数据库管理员联系以获得对该对象的权限。

有关更多信息，请参见数据库对象所属关系。


链接服务器对象无法用作该查询类型的目标。

选定的查询类型不支持将链接服务器对象作为目标。

有关更多信息，请参见创建查询。


ALL 无法与 CUBE 或 ROLLUP 一起使用。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则。


OpenRowset 无法用作该查询类型的目标。

查询的语法中有错误。查询设计器已尝试确定错误的来源。在运行查询前检查查询的语法并更正错误。

有关更多信息，请参见指定搜索准则。


先在列单元中输入一个表达式。

在列单元中输入一个表达式。

有关更多信息，请参见在查询中使用表达式。


无法将输入项转换为有效日期时间值。

一般情况下，ANSI 标准日期格式用于那些使用真实日期数据类型表示日期的数据库。相反，日期时间格式用于支持日期时间数据类型的数据库。

有关更多信息，请参见输入搜索值。


查询设计器错误。

没有关于此错误的具体帮助。如果错误信息中的文本不能为解决问题提供足够的信息，可考虑以下选项：

  • 验证设置值是否正确，并再次尝试操作。

  • 使用索引搜索与该错误信息相关的关键字。

  • 如果问题是由外部应用程序或软件引起的，请参见相关部分的文档。例如，错误可能是由所使用的服务器设置或网络引起的。

  • 有关 SQL 语句错误，请参见 Transact-SQL 参考。

  • 查看 Readme 文件中关于该错误的最新信息。


别名太长。

为表或表结构化对象提供的别名太长。请输入较短的名称。


注释格式不对。

注释包含错误。请确保注释的正文不包含任何注释标记（/* 或 */）。


无法将表达式用作参数值。

表达式作为参数值出现。参数值必须是标量或简单文本。为该数量提供适当的文本值或数字。


参数或列列表不完整。

插入语句中缺少参数。重写插入语句以提供缺少的参数。


参数列表不完整。

返回表的用户定义函数中缺少参数。重写语句以提供缺少的参数。


警告：所做的修改有可能导致无法对视图进行索引。

正试图向数据库传送的修改可能导致无法对视图进行索引。如果继续修改，视图的现有索引将被删除。


警告：视图定义有可能导致无法对视图进行索引。

正试图向数据库传送的视图定义可能导致无法对视图进行索引。可以继续保存该视图，但 SQL Server 可能不为它创建索引。


索引已经存在。

数据库已经包含同名的索引。请另选一个名称。


未加引号的别名中包含空格。

提供的别名包含嵌入式空格或其它空格。删除空格或在别名的左右加上双引号。


如果以加密方式保存该视图，将无法再更改该视图定义。

加密视图后，将使包括您自己在内的所有用户（与数据库特权无关）均不能查看该视图定义。因而将无法改变该视图定义。选择"确定"将以加密方式保存该视图。选择"取消"将取消保存操作。


视图有索引。如果删除架构绑定，将会丢弃索引。

正在执行的操作将自动从索引视图中删除架构绑定。删除架构绑定时，将丢弃索引。单击"确定"将继续操作；单击"取消"将取消操作。

有关更多信息，请参见索引视图。


不允许编辑。索引视图中不允许 HAVING 子句。

不能在索引视图的视图定义中使用 HAVING 子句。可以删除索引或删除 HAVING 子句。


数据库服务器版本运行时错误。

数据库服务器返回了运行时错误。请参见错误信息。


SQL 验证失败。

数据库服务器无法验证 SQL 语句的有效性。有关更多信息，请参见 Transact-SQL 参考。


投影函数格式不对。

表达式包含错误的 CAST 函数。


非法使用排序规则子句。

SQL 语句非法使用排序规则子句。有关更多信息，请参见 COLLATE。


该表达式中的列含有不兼容的排序规则。

在索引视图定义中提供的表达式使用了排序规则设置不同的两列，因此排序规则子句已经添加到其中的一列。但是索引视图定义无法包含该排序规则子句。删除包含不兼容列的表达式，或从视图中删除索引以修改视图定义。


索引视图中无法使用 COLLATE 子句。

COLLATE 子句在索引视图定义中出现，但是索引视图无法包含 COLLATE 子句。删除 COLLATE 子句，或从视图中删除索引以修改视图定义。


星号 (*) 不能在索引视图中使用。

因为索引视图存储在磁盘上，所以视图定义必须显式引用要包含在视图中的列。用要包含在视图中的列替换星号。


索引必须至少含有一列。

修改将导致索引没有列，而这是非法的。可以删除索引，或向索引中添加列以修改索引。


填充因子无效；请输入一个 0 到 100 之间的整数。

因为填充因子必须是百分数，所以其最小值为 0，最大值为 100。只能使用整数的百分数。例如，67 可以接受，而 66.7 则是不可接受的。


索引视图必须包含聚集索引。

因为索引视图存储在磁盘上，所以它必须包含聚集索引（而不是非聚集索引）。修改索引使其成为聚集索引。


用作目标的表值函数不是内嵌函数。

正在尝试的操作需要可更新的用户定义函数（内嵌函数），但是正在使用的函数不可更新。可以用可更新的函数替换该函数，或者将查询类型更改为 SELECT 查询。


WITH TIES 子句需要 ORDER BY 子句。

该查询不符合 SQL 语法，因为它在使用 WITH TIES 子句时没有包含相关的 ORDER BY 子句。删除 WITH TIES 子句或添加 ORDER BY 子句。


子查询选择列表里值太多。

INSERT 操作目标中的列数超过了提供的数据值的数目。修改该查询以使每列都有值。


无法在列单元里使用 NOT。

若要对包含子查询的准则进行取反，就不能将 NOT 运算符放入网格窗格的"列"单元中。相反，应该将关键字 FALSE 放入网格窗格同一行的"准则"单元中。


视图定义在 FROM 子句中不含任何输出列或项目。

视图定义在 FROM 子句中必须至少有一个表或表结构化对象，而且在选择列表中必须至少有一列。该视图定义缺少其中一个或两个条件。请相应地修改视图定义。


无法创建自引用视图。

视图定义的 FROM 子句包含该视图的名称。从 FROM 子句中删除该视图的名称。


无法在视图中使用该 SQL 语句类型。

视图定义必须是 SELECT 语句（而不是 INSERT、UPDATE、DELETE 或 CREATE TABLE 语句）。请相应地修改视图定义。


查询或视图已修改。关闭前保存更改吗？

已更改查询或视图。如果不保存，修改将丢失。选择"是"将保存更改，选择"否"将取消操作。


查询或视图已存在。要覆盖它吗？

同名的查询或视图已存在。如果选择"是"，现有的查询将由新查询替换。


将粘贴 n 行。

在结果窗格中粘贴行时，行将立即传送到数据库。传送修改时数据库将提交这些修改，因此无法撤消所做的更改。


行已粘贴。

在结果窗格中粘贴的行已经传送到数据库。传送修改时数据库已提交了这些修改，因此无法撤消所做的更改。


无法更新列。

无法更新该列中的值，可能由于该列是计算的列、标识列或值是 RowGuid 的列。


正修改的数据库行在该数据库中已不存在。

将数据检索到结果窗格后，其他用户从数据库中删除了某行。现在正在试图从结果窗格内修改该行。修改将无效，因为作为修改目标的那一行已不存在。


指定的参数太多或太少。

正在使用用户定义函数，但未提供正确数目的参数。检查用户定义函数的定义以确定需要使用多少参数。


视图名称不能以 # 开头。

视图名不能以井号 (#) 开头。请选择不同的名称。


表名不能包含双引号字符。

表名不能包含双引号字符 (")。请选择不同的名称。