sql的语句功能非常强大.docx_第1页
sql的语句功能非常强大.docx_第2页
sql的语句功能非常强大.docx_第3页
sql的语句功能非常强大.docx_第4页
sql的语句功能非常强大.docx_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

INSERT (Transact-SQL)将一个或更多新行添加到表或视图中。Transact-SQL 语法约定语法 WITH ,.n INSERT TOP ( expression ) PERCENT INTO | rowset_function_limited WITH ( .n ) ( column_list ) VALUES ( DEFAULT | NULL | expression ,.n ) ,.n | derived_table | execute_statement | | DEFAULT VALUES ; := server_name . database_name . schema_name . | database_name . schema_name . | schema_name . table_or_view_name := SELECT FROM ( ) AS table_alias ( column_alias ,.n ) WHERE OPTION ( ,.n ) 参数WITH 指定在 INSERT 语句作用域内定义的临时命名结果集(也称为公用表表达式)。结果集源自 SELECT 语句。公用表表达式还可以与 SELECT、DELETE、UPDATE 和 CREATE VIEW 语句一起使用。有关详细信息,请参阅WITH common_table_expression (Transact-SQL)。TOP ( expression ) PERCENT 指定将插入的随机行的数目或百分比。expression 可以是行数或行的百分比。在和 INSERT、UPDATE 或 DELETE 语句结合使用的 TOP 表达式中引用的行不按任何顺序排列。在 INSERT、UPDATE 和 DELETE 语句中,需要使用圆括号分隔 TOP 中的 expression。有关详细信息,请参阅 TOP (Transact-SQL)。INTO 一个可选的关键字,可以将它用在 INSERT 和目标表之间。server_name 表或视图所在服务器的名称(将 OPENDATASOURCE 函数用作服务器名称)。如果指定了 server_name,则需要 database_name 和 schema_name。database_name 数据库的名称。schema_name 表或视图所属架构的名称。table_or view_name 要接收数据的表或视图的名称。table 变量在其作用域内可用作 INSERT 语句中的表源。table_or_view_name 引用的视图必须可更新,并且只在该视图的 FROM 子句中引用一个基表。例如,多表视图中的 INSERT 必须使用只引用一个基表中的各列的 column_list。有关可更新视图的详细信息,请参阅 CREATE VIEW (Transact-SQL)。rowset_function_limited OPENQUERY 或 OPENROWSET 函数。WITH ( . n ) 指定目标表允许的一个或多个表提示。需要有 WITH 关键字和括号。不允许 READPAST、NOLOCK 和 READUNCOMMITTED。有关表提示的详细信息,请参阅表提示 (Transact-SQL)。重要提示:在将来的 SQL Server 版本中,将删除对作为 INSERT 语句目标的表指定 HOLDLOCK、SERIALIZABLE、READCOMMITTED、REPEATABLEREAD 或 UPDLOCK 提示的功能。这些提示不影响 INSERT 语句的性能。请避免在新的开发工作中使用该功能,并计划修改当前使用该功能的应用程序。 对作为 INSERT 语句目标的表指定 TABLOCK 提示与指定 TABLOCKX 提示具有相同的效果。对表采用排他锁。( column_list ) 要在其中插入数据的一列或多列的列表。必须用括号将 column_list 括起来,并且用逗号进行分隔。如果某列不在 column_list 中,则数据库引擎必须能够基于该列的定义提供一个值;否则不能加载行。如果列满足下面的条件,则数据库引擎将自动为列提供值:l 具有 IDENTITY 属性。使用下一个增量标识值。l 有默认值。使用列的默认值。l 具有 timestamp 数据类型。使用当前的时间戳值。l 可以为 Null。使用 Null 值。l 是计算列。使用计算值。当向标识列中插入显式值时,必须使用 column_list 和 VALUES 列表,并且表的 SET IDENTITY_INSERT 选项必须为 ON。OUTPUT 子句 将插入行作为插入操作的一部分返回。引用本地分区视图、分布式分区视图或远程表的 DML 语句或包含 execute_statement 的 INSERT 语句都不支持 OUTPUT 子句。在包含 子句的 INSERT 语句中不支持 OUTPUT INTO 子句。VALUES 引入要插入的数据值的一个或多个列表。对于 column_list(如果已指定)或表中的每个列,都必须有一个数据值。必须用圆括号将值列表括起来。如果 VALUES 列表中的各值与表中各列的顺序不相同,或者未包含表中各列的值,则必须使用 column_list 显式指定存储每个传入值的列。SQL Server 2008 引入了 Transact-SQL 行构造函数(又称为表值构造函数),用于在一个 INSERT 语句中指定多个行。行构造函数包含一个 VALUES 子句和多个括在圆括号中且以逗号分隔的值列表。请参见下面“示例”部分中的“示例 B”。若要插入多行值,VALUES 列表的顺序必须与表中各列的顺序相同,且此列表必须包含与表中各列或 column_list 对应的值以便显式指定存储每个传入值的列。在多行 INSERT 语句中指定的值遵循 UNION ALL 语法的类型转换属性。这样,不匹配的类型可以隐式转换为具有更高优先级的类型。如果此转换不是所支持的隐式转换,则返回错误。例如,以下语句将整数值和字符值插入到类型为 char 的列中。CREATE TABLE t (a int, b char);GOINSERT INTO t VALUES (1,a), (2, 1);GO运行 INSERT 语句时,SQL Server 尝试将 a 转换为整数,因为数据类型优先级指示整数类型的优先级高于字符。转换失败,并且返回错误。您可以根据需要显式转换值,从而避免发生此错误。例如,前面的语句可以编写为:INSERT INTO t VALUES (1,a), (2, CONVERT(CHAR,1);可在单个 INSERT 语句中插入的最大行数为 1000。若要插入超过 1000 行的数据,请创建多个 INSERT 语句,或通过使用 bcp 实用工具或 BULK INSERT 语句大容量导入数据。DEFAULT 强制数据库引擎加载为列定义的默认值。如果某列并不存在默认值,并且该列允许 Null 值,则插入 NULL。对于使用 timestamp 数据类型定义的列,插入下一个时间戳值。DEFAULT 对标识列无效。expression 一个常量、变量或表达式。表达式不能包含 EXECUTE 语句。注意:当引用 Unicode 字符数据类型 nchar、nvarchar 和 ntext 时,expression 应采用大写字母 N 作为前缀。如果未指定 N,则 SQL Server 会将字符串转换为与数据库或列的默认排序规则相对应的代码页。此代码页中没有的字符都将丢失。 derived_table 任何有效的 SELECT 语句,它返回将加载到表中的数据行。SELECT 语句不能包含公用表表达式 (CTE)。execute_statement 任何有效的 EXECUTE 语句,它使用 SELECT 或 READTEXT 语句返回数据。如果 execute_statement 使用 INSERT,则每个结果集必须与表或 column_list 中的列兼容。可以使用 execute_statement 对同一服务器或远程服务器执行存储过程。执行远程服务器中的过程,并将结果集返回到本地服务器并加载到本地服务器的表中。在分布式事务中,当连接启用了多个活动结果集 (MARS) 时,无法针对环回链接服务器发出 execute_statement。如果 execute_statement 使用 READTEXT 语句返回数据,则每个 READTEXT 语句最多可以返回 1 MB (1024 KB) 的数据。execute_statement 还可以用于扩展过程。execute_statement 插入由扩展过程的主线程返回的数据,但不插入主线程以外的线程的输出。 指定插入目标表的行是 INSERT、UPDATE、DELETE 或 MERGE 语句的 OUTPUT 子句返回的行;可以通过 WHERE 子句对行进行筛选。如果指定了 ,外部 INSERT 语句的目标必须满足以下限制:l 必须是基表而不是视图。l 不能是远程表。l 不能对其定义任何触发器。l 不能参与任何主键-外键关系。l 不能参与合并复制或事务复制的可更新订阅。数据库的兼容级别必须设置为 100。有关详细信息,请参阅下面“备注”下的“从 OUTPUT 子句插入”。 指定要插入 OUTPUT 子句返回的哪些列的逗号分隔列表。 中的列必须与要插入值的列兼容。 无法引用聚合函数或 TEXTPTR。注意:无论在 中对 SELECT 列表中列出的任何变量做何种更改,这些变量都将引用其原始值。 在 OUTPUT 子句中返回受影响行的有效 INSERT、UPDATE、DELETE 或 MERGE 语句。语句中不能包含 WITH 子句,且不能以远程表或分区视图为目标。如果指定了 UPDATE 或 DELETE,则所指定的 UPDATE 或 DELETE 不能是基于游标的。源行不能作为嵌套的 DML 语句进行引用。WHERE 任意 WHERE 子句,其中包含对 返回的行进行筛选的有效 。有关详细信息,请参阅 搜索条件 (Transact-SQL)。在此上下文中使用时, 不能包含子查询、执行数据访问的标量用户定义函数、聚合函数、TEXTPTR 或全文搜索谓词。DEFAULT VALUES 强制新行包含为每个列定义的默认值。备注INSERT 将新行追加到表中。若要替换表中的数据,必须在使用 INSERT 加载新数据之前,使用 DELETE 或 TRUNCATE TABLE 语句清除现有的数据。若要修改现有行中的列值,请使用 UPDATE。可以创建新表,并使用 SELECT 语句的 INTO 选项通过一个步骤为它加载数据。使用 uniqueidentifier 数据类型创建的列存储特殊格式的 16 位二进制值。与标识列不同,数据库引擎不为 uniqueidentifier 数据类型的列自动生成值。在插入操作过程中,可以将 uniqueidentifier 数据类型的变量和 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 格式的字符串常量(包括连字符在内共 36 个字符,其中 x 表示从 0 到 9 或从 a 到 f 的十六进制数字)用于 uniqueidentifier 列。例如,6F9619FF-8B86-D011-B42D-00C04FC964FF 是 uniqueidentifier 变量或列的有效值。使用 NEWID() 函数获取全局唯一 ID (GUID)。在本地和远程分区视图上,忽略 INSERT 语句的 SET ROWCOUNT 选项的设置。此外,当兼容级别设置为 80 或更高时,对于针对数据库引擎中的远程表发出的 INSERT 语句也不支持此选项。如果在表达式计算过程中 INSERT 语句遇到算术错误(溢出、被零除或域错误),则数据库引擎会处理这些错误,就好像 SET ARITHABORT 设置为 ON 一样。停止批处理的其余部分,并返回一条错误消息。尽管不允许在表达式列表中使用涉及多个列的子查询,但允许在表达式列表中使用单个标量值。下面的代码将会产生语法错误。/* This statement causes an error*/ INSERT INTO Employees VALUES(Marjorie, 25, 5),(Christina, 30, 6), ( SELECT Name, Age, 1 FROM People); 插入行的规则插入行时,可以应用下列规则:1、如果将值加载到 char、varchar 或 varbinary 数据类型的列中,则尾随空格(对于 char 和 varchar 为空格,对于 varbinary 为零)的填充或截断由创建表时为该列定义的 SET ANSI_PADDING 设置确定。有关详细信息,请参阅 SET ANSI_PADDING (Transact-SQL)。下表显示了 SET ANSI_PADDING OFF 的默认操作。数据类型 默认操作 char 将带有空格的值填充到已定义的列宽。varchar 删除最后的非空格字符后面的尾随空格,而对于只由空格组成的字符串,一直删除到只留下一个空格。varbinary 删除尾随的零。2、如果将一个空字符串 ( ) 加载到数据类型为 varchar 或 text 的列,则默认操作是加载一个零长度的字符串。3、如果 INSERT 语句违反约束或规则,或者包含与列的数据类型不兼容的值,则该语句将失败,并且数据库引擎显示错误消息。4、将 Null 值插入到 text 或 image 列不创建有效的文本指针,也不预分配 8 KB 的文本页。有关插入 text 和 image 数据的详细信息,请参阅使用 text、ntext 和 image 函数。5、如果 INSERT 是使用 SELECT 或 EXECUTE 加载多行,那么一旦加载的值中出现任何违反规则或约束的情况,就会导致终止整个语句,且不会加载任何行。6、当向远程数据库引擎实例的表中插入值且没有为所有列指定所有值时,用户必须标识将向其中插入指定值的列。对 INSERT 操作使用 INSTEAD OF 触发器当为表或视图的 INSERT 操作定义了 INSTEAD OF 触发器时,则执行该触发器而不是 INSERT 语句。SQL Server 的早期版本只支持在 INSERT 和其他数据修改语句上定义的 AFTER 触发器。有关 INSTEAD OF 触发器的详细信息,请参阅 CREATE TRIGGER (Transact-SQL)。将值插入到用户定义类型列中可以通过以下方法将值插入到用户定义的类型列中:l 提供用户定义类型的值。l 提供 SQL Server 系统数据类型的值,条件是该用户定义类型支持该类型的隐式转换或显式转换。下面的示例演示了如何基于字符串进行显式转换将值插入到用户定义的类型 Point 的列中。INSERT INTO Cities (Location)VALUES ( CONVERT(Point, 12.3:46.2) );l 由于所有用户定义的类型可以从二进制值进行隐式转换,因此还可以在不执行显式转换的情况下提供二进制值。有关转换和用户定义类型的详细信息,请参阅对用户定义类型执行操作。调用一个用户定义函数,该函数返回用户定义类型的值。下面的示例使用用户定义函数 CreateNewPoint() 创建一个用户定义类型 Point 的新值,并将该值插入到 Cities 表中。INSERT INTO Cities (Location)VALUES ( dbo.CreateNewPoint(x, y) );使用 OPENROWSET 和 BULK 大容量加载数据OPENROWSET 大容量行集提供程序附带的表提示通过 INSERT 语句实现了以下大容量加载优化:l 大容量加载日志记录。(TABLOCK 提示可以最大限度减少插入操作的日志记录数量。)l 可以将约束检查设置为 ON 或 OFF。l 可以将触发器执行设置为 ON 或 OFF。这些优化类似于可与 BULK INSERT 命令一起使用的优化。如果数据库的恢复模式设置为简单或大容量日志记录,并且未在复制中使用该表,便有可能使用带有 INSERT 语句的 OPENROWSET 大容量行集提供程序按最小方式记录日志。有关详细信息,请参阅 在大容量导入中按最小方式记录日志的前提条件。将从 OUTPUT 子句返回的数据插入目标表您可以捕获嵌套 INSERT、UPDATE、DELETE 或 MERGE 语句中 OUTPUT 子句的结果,然后将这些结果插入目标表中。这通过使用语法中的 参数来实现。执行此操作时,请谨记下列注意事项: 整个操作为原子操作。要么执行 INSERT 语句和包含 OUTPUT 子句的嵌套 DML 语句,要么整个语句失败。 以下限制适用于外部 INSERT 语句的目标: 目标不能为远程表、视图或公用表表达式。 目标不能具有 FOREIGN KEY 约束,或者由 FOREIGN KEY 约束引用。 不能对目标定义任何触发器。 不能参与合并复制或事务复制的可更新订阅。 以下限制适用于嵌套 DML 语句: 目标不能为远程表或分区视图。 源本身不能包含 子句。 在包含 子句的 INSERT 语句中不支持 OUTPUT INTO 子句。 ROWCOUNT 仅返回外部 INSERT 语句插入的行。 IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT 仅返回嵌套 DML 语句生成的标识值,而不返回外部 INSERT 语句生成的标识值。 查询通知将语句作为单个实体进行处理,即使重大更改来自外部 INSERT 语句本身,所创建的任何消息的类型也是嵌套 DML 的类型。 在 子句中,SELECT 和 WHERE 子句不能包括子查询、聚合函数、排名函数、全文谓词、执行数据访问的用户定义函数或 TEXTPTR 函数。权限需要针对目标表的 INSERT 权限。INSERT 权限默认授予 sysadmin 固定服务器角色、db_owner 和 db_datawriter 固定数据库角色以及表所有者的成员。sysadmin、db_owner 和 db_securityadmin 角色成员以及表所有者可以将权限转让给其他用户。若要使用 OPENROWSET 函数 BULK 选项执行 INSERT,您必须是 sysadmin 固定服务器角色成员或 bulkadmin 固定服务器角色成员。示例A. 执行简单的 INSERT 语句以下示例在 Production.UnitMeasure 表中插入一行。由于提供了所有列的值并按表中各列的顺序列出这些值,因此不必在 column_list. 中指定列名。USE AdventureWorks;GOINSERT INTO Production.UnitMeasureVALUES (NF2, NSquare Feet, GETDATE();GOB. 插入多行数据下面的示例创建表 dbo.Departments,然后使用行构造函数将五行数据插入到该表中。由于提供了所有列的值并按表中各列的顺序列出这些值,因此不必在列列表中指定列名。USE AdventureWorks;GOIF OBJECT_ID (Ndbo.Departments, NU) IS NOT NULL DROP TABLE dbo.Departments;GOCREATE TABLE dbo.Departments (DeptID tinyint NOT NULL PRIMARY KEY, DeptName nvarchar(30), Manager nvarchar(50);GOINSERT INTO dbo.Departments VALUES (1, Human Resources, Margheim),(2, Sales, Byham), (3, Finance, Gill),(4, Purchasing, Barber), (5, Manufacturing, Brewer);C. 按与表列顺序不同的顺序插入数据下面的示例使用 column_list 显式指定插入到每个列中的值。UnitMeasure 表中的列顺序为 UnitMeasureCode、Name、ModifiedDate;但这些列的列出顺序与 column_list 中的顺序不同。USE AdventureWorks;GOINSERT INTO Production.UnitMeasure (Name, UnitMeasureCode, ModifiedDate)VALUES (NSquare Yards, NY2, GETDATE();GOD. 插入所含值数目少于列数目的数据以下示例显示了如何将行插入到表中,该表包含自动生成值或具有默认值的列。INSERT 语句插入一些行,这些行只有部分列包含值。在最后一个 INSERT 语句中,未指定列,只插入了默认值。USE AdventureWorks;GOIF OBJECT_ID (dbo.T1, U) IS NOT NULL DROP TABLE dbo.T1;GOCREATE TABLE dbo.T1 ( column_1 int IDENTITY, column_2 varchar(30) CONSTRAINT default_name DEFAULT (my column default), column_3 timestamp, column_4 varchar(40) NULL);GOINSERT INTO dbo.T1 (column_4) VALUES (Explicit value);INSERT INTO dbo.T1 (column_2, column_4) VALUES (Explicit value, Explicit value);INSERT INTO dbo.T1 (column_2) VALUES (Explicit value);INSERT INTO T1 DEFAULT VALUES; GOSELECT column_1, column_2, column_3, column_4FROM dbo.T1;GOE. 将数据插入到含标识列的表中下面的示例演示了将数据插入到标识列中的不同方法。前两个 INSERT 语句允许为新行生成标识值。第三个 INSERT 语句用 SET IDENTITY_INSERT 语句覆盖列的 IDENTITY 属性,并将一个显式值插入到标识列中。USE AdventureWorks;GOIF OBJECT_ID (dbo.T1, U) IS NOT NULL DROP TABLE dbo.T1;GOCREATE TABLE dbo.T1 ( column_1 int IDENTITY, column_2 VARCHAR(30);GOINSERT T1 VALUES (Row #1);INSERT T1 (column_2) VALUES (Row #2);GOSET IDENTITY_INSERT T1 ON;GOINSERT INTO T1 (column_1,column_2) VALUES (-99, Explicit identity value);GOSELECT column_1, column_2FROM T1;GOF. 通过使用 NEWID() 将数据插入到 uniqueidentifier 列中下面的示例使用 NEWID() 函数获取 column_2 的 GUID。与标识列不同,数据库引擎不为 uniqueidentifier 数据类型的列自动生成值(如第二个 INSERT 语句所示)。USE AdventureWorks;GOIF OBJECT_ID (dbo.T1, U) IS NOT NULL DROP TABLE dbo.T1;GOCREATE TABLE dbo.T1 ( column_1 int IDENTITY, column_2 uniqueidentifier,);GOINSERT INTO dbo.T1 (column_2) VALUES (NEWID();INSERT INTO T1 DEFAULT VALUES; GOSELECT column_1, column_2FROM dbo.T1;GOG. 通过视图将数据插入表中下面的示例在 INSERT 语句中指定一个视图名,但将新行插入到该视图的基础表中。INSERT 语句中 VALUES 列表的顺序必须与视图的列顺序相匹配。USE AdventureWorks;GOIF OBJECT_ID (dbo.T1, U) IS NOT NULL DROP TABLE dbo.T1;GOIF OBJECT_ID (dbo.V1, V) IS NOT NULL DROP VIEW dbo.V1;GOCREATE TABLE T1 ( column_1 int, column_2 varchar(30);GOCREATE VIEW V1 AS SELECT column_2, column_1 FROM T1;GOINSERT INTO V1 VALUES (Row 1,1);GOSELECT column_1, column_2 FROM T1;GOSELECT column_1, column_2FROM V1;GOH. 使用 SELECT 和 EXECUTE 选项插入数据下面的示例演示了三种不同的方法,用来从一个表获取数据,并将数据插入到另一个表中。每种方法都基于一个多表 SELECT 语句,该语句在列列表中包含一个表达式及一个文字值。第一个 INSERT 语句使用 SELECT 语句直接从源表(Employee、SalesPerson 和 Contact)中检索数据,并将结果集存储在 EmployeeSales 表中。第二个 INSERT 执行一个包含 SELECT 语句的存储过程,而第三个 INSERT 将 SELECT 语句作为一个文字字符串执行。USE AdventureWorks;GOIF OBJECT_ID (dbo.EmployeeSales, U) IS NOT NULL DROP TABLE dbo.EmployeeSales;GOIF OBJECT_ID (dbo.uspGetEmployeeSales, P) IS NOT NULL DROP PROCEDURE uspGetEmployeeSales;GOCREATE TABLE dbo.EmployeeSales( DataSource varchar(20) NOT NULL, EmployeeID varchar(11) NOT NULL, LastName varchar(40) NOT NULL, SalesDollars money NOT NULL);GOCREATE PROCEDURE dbo.uspGetEmployeeSales AS SET NOCOUNT ON; SELECT PROCEDURE, e.EmployeeID, c.LastName, sp.SalesYTD FROM HumanResources.Employee AS e INNER JOIN Sales.SalesPerson AS sp ON e.EmployeeID = sp.SalesPersonID INNER JOIN Person.Contact AS c ON e.ContactID = c.ContactID WHERE e.EmployeeID LIKE 2% ORDER BY e.EmployeeID, c.LastName;GO-INSERT.SELECT exampleINSERT dbo.EmployeeSales SELECT SELECT, e.EmployeeID, c.LastName, sp.SalesYTD FROM HumanResources.Employee AS e INNER JOIN Sales.SalesPerson AS sp ON e.EmployeeID = sp.SalesPersonID INNER JOIN Person.Contact AS c ON e.ContactID = c.ContactID WHERE e.EmployeeID LIKE 2% ORDER BY e.EmployeeID, c.LastName;GO-INSERT.EXECUTE procedure exampleINSERT EmployeeSales EXECUTE uspGetEmployeeSales;GO-INSERT.EXECUTE(string) exampleINSERT EmployeeSales EXECUTE (SELECT EXEC STRING, e.EmployeeID, c.LastName, sp.SalesYTD FROM HumanResources.Employee AS e INNER JOIN Sales.SalesPerson AS sp ON e.EmployeeID = sp.SalesPersonID INNER JOIN Person.Contact AS c ON e.ContactID = c.ContactID WHERE e.EmployeeID LIKE 2% ORDER BY e.EmployeeID, c.LastName);GO-Show results.SELECT DataSource,EmployeeID,LastName,SalesDollarsFROM dbo.EmployeeSales;GOI. 通过使用 TOP 子句插入数据下面的示例创建 NewEmployee 表,并将 Employee 表中前 10 名雇员的地址数据插入到该表中。然后执行 SELECT 语句以验证 NewEmployee 表的内容。USE AdventureWorks;GOIF OBJECT_ID (NHumanResources.NewEmployee, NU) IS NOT NULL DROP TABLE HumanResources.NewEmployee;GOCREATE TABLE HumanResources.NewEmployee( EmployeeID int NOT NULL, LastName nvarchar(50) NOT NULL, FirstName nvarchar(50) NOT NULL, Phone Phone NULL, AddressLine1 nvarchar(60) NOT NULL, City nvarchar(30) NOT NULL, State nchar(3) NOT NULL, PostalCode nvarchar(15) NOT NULL, CurrentFlag Flag);GOINSERT TOP (10) INTO HumanResources.NewEmployee SELECT e.EmployeeID, c.LastName, c.FirstName, c.Phone, a.AddressLine1, a.City, sp.StateProvinceCode, a.PostalCode, e.CurrentFlag FROM HumanResources.Employee e INNER JOIN HumanResources.EmployeeAddress AS ea ON e.EmployeeID = ea.EmployeeID INNER JOIN Person.Address AS a ON ea.AddressID = a.AddressID INNER JOIN Person.StateProvince AS sp ON a.StateProvinceID = sp.StateProvinceID INNER JOIN Person.Contact as c ON e.ContactID = c.ContactID;GOSELECT EmployeeID, LastName, FirstName, Phone, AddressLine1, City, State, PostalCode, CurrentFlagFROM HumanResources.NewEmployee;GOJ. 将 OUTPUT 用于 INSERT 语句下面的示例将行插入到 ScrapReason 表中,并使用 OUTPUT 子句将语句的结果返回到 MyTableVar table 变量。由于 ScrapReasonID 列使用 IDENTITY 属性定义,因此未在 INSERT 语句中为该列指定值。但应注意,数据库引擎为该列生成的值在 INSERTED.ScrapReasonID 列中的 OUTPUT 子句中返回。USE AdventureWorks;GODECLARE MyTableVar table( ScrapReasonID smallint, Name varchar(50), ModifiedDate datetime);INSERT Production.ScrapReason OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate INTO MyTableVarVALUES (NOperator error, GETDATE();-Display the result set of the table variable.SELECT ScrapReasonID, Name, ModifiedDate FROM MyTableVar;-Display the result set of the table.SELECT ScrapReasonID, Name, ModifiedDate FROM Production.ScrapReason;GOK. 将 WITH 公用表表达式用于 INSERT 语句下面的示例创建 NewEmployee 表。公用表表达式 (EmployeeTemp) 定义要插入到 NewEmployee 表中的行。INSERT 语句引用公用表表达式中的列。USE AdventureWorks;GOIF OBJECT_ID (NHumanResources.NewEmployee, NU) IS NOT NULL DROP TABLE HumanResources.NewEmployee;GOCREATE TABLE HumanResources.NewEmployee( EmployeeID int NOT NULL, LastName nvarchar(50) NOT NULL, FirstName nvarchar(50) NOT NULL, Phone Phone NULL, AddressLine1 nvarchar(60) NOT NULL, City nvarchar(30) NOT NULL, State nchar(3) NOT NULL, PostalCode nvarchar(15) NOT NULL, CurrentFlag Flag);GOWITH EmployeeTemp (EmpID, LastName, FirstName, Phone, Address, City, StateProvince, PostalCode, CurrentFlag)AS (SELECT e.EmployeeID, c.LastName, c.FirstName, c.Phone, a.AddressLine1, a.City, sp.StateProvinceCode, a.PostalCode, e.CurrentFlag FROM HumanResources.Employee e INNER JOIN HumanResources.EmployeeAddress AS ea ON e.EmployeeID = ea.EmployeeID INNER JOIN Person.Address AS a ON ea.AddressID = a.AddressID INNER JOIN Person.StateProvince AS sp ON a.StateProvinceID = sp.StateProvinceID INNER JOIN Person.Contact as c ON e.ContactID = c.ContactID )INSERT INTO HumanResources.NewEmployee SELECT EmpID, LastName, FirstName, Phone, Address, City, S

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论