⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 50622.htm

📁 一本很基础的SQL讲解
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<P>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><P>USE AdventureWorks;<BR>GO</P><P>/* Create a user-defined table type */<BR>CREATE TYPE LocationTableType AS TABLE <BR>( LocationName VARCHAR(50)<BR>, CostRate INT );<BR>GO</P></PRE></TD></TR></TBODY></TABLE></P>
<P>对于表类型,有如下约束:</P>
<P>(1)用户自定义表类型不能作为表的列或者结构化用户自定义类型的域。<BR>(2)基于用户自定义表类型的别名类型。<BR>(3)不允许 NOT FOR REPLICATION 选项。<BR>(4)CHECK 约束需要一个计算列。<BR>(5)在计算列上的主键必须包含 NOT NULL 和 PERSISTED 约束。<BR>(6)不能在用户自定义表类型上创建非簇索引。除非索引是创建 PRIMARY KEY 或 UNIQUE 约束的返回值。<BR>(7)不能指定 DEFAULT 值。<BR>(8)一旦用户自定义表类型被创建,则它就无法更改。<BR>(9)如果没有定义用户自定义表类型上的计算列,则用户自定义函数无法调用。</P>
<P><STRONG>6. 表值参数</STRONG></P>
<P>数据库引擎现在支持一种新的参数类型来引用用户自定义表类型(参考 5)。表值参数可以发送更多的 SQL Server 数据。</P>
<P>下面的示例展示了如何使用表值参数。</P>
<P>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><P>USE AdventureWorks;<BR>GO</P><P>/* Create a table type. */<BR>CREATE TYPE LocationTableType AS TABLE <BR>( LocationName VARCHAR(50)<BR>, CostRate INT );<BR>GO</P><P>/* Create a procedure to receive data for the table-valued parameter. */<BR>CREATE PROCEDURE usp_InsertProductionLocation<BR>&nbsp;&nbsp;&nbsp; @TVP LocationTableType READONLY<BR>&nbsp;&nbsp;&nbsp; AS <BR>&nbsp;&nbsp;&nbsp; SET NOCOUNT ON<BR>&nbsp;&nbsp;&nbsp; INSERT INTO [AdventureWorks].[Production].[Location]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ([Name]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ,[CostRate]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ,[Availability]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ,[ModifiedDate])<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT *, 0, GETDATE()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM&nbsp; @TVP;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GO</P><P>/* Declare a variable that references the type. */<BR>DECLARE @LocationTVP <BR>AS LocationTableType;</P><P>/* Add data to the table variable. */<BR>INSERT INTO @LocationTVP (LocationName, CostRate)<BR>&nbsp;&nbsp;&nbsp; SELECT [Name], 0.00<BR>&nbsp;&nbsp;&nbsp; FROM <BR>&nbsp;&nbsp;&nbsp; [AdventureWorks].[Person].[StateProvince];</P><P>/* Pass the table variable data to a stored procedure. */<BR>EXEC usp_InsertProductionLocation @LocationTVP;<BR>GO</P></PRE></TD></TR></TBODY></TABLE></P>
<P><STRONG>7. MERGE 语句</STRONG></P>
<P>这个新增的 Transaction SQL 语句在一个基于源数据连接结果集的目标表上执行 INSERT、UPDATE 和 DELETE 操作。该语法允许您将一个数据源连接到目标表或视图上。然后在连接后的结果集上执行多种操作。</P>
<P>#p#</P>
<P>MERGE 的语法为:</P>
<P>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><P>[ WITH &lt;common_table_expression&gt; [,...n] ]<BR>MERGE <BR>[ TOP ( expression ) [ PERCENT ] ] <BR>[ INTO ] target_table [ [ AS ] table_alias ]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ WITH ( &lt;merge_hint&gt; ) ]<BR>USING &lt;table_source&gt;<BR>ON &lt;search_condition&gt;<BR>[ WHEN MATCHED [ AND &lt;search_condition&gt; ]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; THEN &lt;merge_matched&gt; ]<BR>[ WHEN [TARGET] NOT MATCHED [ AND &lt;search_condition&gt; ]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; THEN &lt;merge_not_matched&gt; ]<BR>[ WHEN SOURCE NOT MATCHED [ AND &lt;search_condition&gt; ]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; THEN &lt;merge_ matched&gt; ]<BR>&lt;output_clause&gt;<BR>[ OPTION ( &lt;query_hint&gt; [ ,...n ] ) ]&nbsp;&nbsp;&nbsp; <BR>;<BR>&lt;merge_hint&gt;::=<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { [ &lt;table_hint_limited&gt; [ ,...n ] ]<BR>&nbsp;&nbsp;&nbsp; [ [ , ] INDEX ( index_val [ ,...n ] ) ] }</P><P>&lt;table_source&gt; ::= <BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; table_or_view_name [ [ AS ] table_alias ] [ &lt;tablesample_clause&gt; ] <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ WITH ( table_hint [ [ , ]...n ] ) ] <BR>&nbsp;&nbsp;&nbsp; | rowset_function [ [ AS ] table_alias ] <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ ( bulk_column_alias [ ,...n ] ) ] <BR>&nbsp;&nbsp;&nbsp; | user_defined_function [ [ AS ] table_alias ]<BR>&nbsp;&nbsp;&nbsp; | OPENXML &lt;openxml_clause&gt; <BR>&nbsp;&nbsp;&nbsp; | derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ] <BR>&nbsp;&nbsp;&nbsp; | &lt;joined_table&gt; <BR>&nbsp;&nbsp;&nbsp; | &lt;pivoted_table&gt; <BR>&nbsp;&nbsp;&nbsp; | &lt;unpivoted_table&gt; <BR>}</P><P>&lt;merge_matched&gt;::=<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { UPDATE SET &lt;set_clause&gt; | DELETE }</P><P>&lt;set_clause&gt;::=<BR>&nbsp;&nbsp;&nbsp; { column_name = { expression | DEFAULT | NULL }<BR>&nbsp; | { udt_column_name. { { property_name = expression <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | field_name = expression } <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | method_name ( argument [ ,...n ] ) } }<BR>&nbsp; | column_name { .WRITE ( expression , @Offset , @Length ) }<BR>&nbsp; | @variable = expression <BR>&nbsp;&nbsp;&nbsp; } [ ,...n ] </P><P>&lt;merge_not_matched&gt;::=<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INSERT [ ( &lt;column_list&gt; ) ] <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { VALUES ( &lt;values_list&gt; )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | DEFAULT VALUES }</P><P>&lt;output_clause&gt;::=<BR>{<BR>&nbsp;&nbsp;&nbsp; [ OUTPUT &lt;dml_select_list&gt; INTO { @table_variable | output_table }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ (column_list) ] ]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ OUTPUT &lt;dml_select_list&gt; ]<BR>}<BR>&lt;dml_select_list&gt;::=<BR>{ &lt;column_name&gt; | scalar_expression } [ [AS] column_alias_identifier ]<BR>&nbsp;&nbsp;&nbsp;&nbsp; [ ,...n ]</P><P>&lt;column_name&gt; ::=<BR>&nbsp;&nbsp;&nbsp; { DELETED | INSERTED | from_table_name } . { * | column_name }<BR>&nbsp;&nbsp; | $ACTION</P></PRE></TD></TR></TBODY></TABLE></P>
<P>示例:在一条 SQL 语句中使用 WHERE 在一张表上执行 UPDATE 和 DELETE 操作</P>
<P>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><P>USE AdventureWorks;<BR>GO<BR>MERGE Production.ProductInventory AS pi<BR>USING (SELECT ProductID, SUM(OrderQty) FROM Sales.SalesOrderDetail sod<BR>&nbsp;&nbsp;&nbsp; JOIN Sales.SalesOrderHeader soh<BR>&nbsp;&nbsp;&nbsp; ON sod.SalesOrderID = soh.SalesOrderID<BR>&nbsp;&nbsp;&nbsp; AND soh.OrderDate = GETDATE()<BR>&nbsp;&nbsp;&nbsp; GROUP BY ProductID) AS src (ProductID, OrderQty)<BR>ON (pi.ProductID = src.ProductID)<BR>WHEN MATCHED AND pi.Quantity - src.OrderQty &lt;&gt; 0 <BR>&nbsp;&nbsp;&nbsp; THEN UPDATE SET pi.Quantity = pi.Quantity - src.OrderQty<BR>WHEN MATCHED AND pi.Quantity - src.OrderQty = 0 <BR>&nbsp;&nbsp;&nbsp; THEN DELETE;</P></PRE></TD></TR></TBODY></TABLE></P>
<P>这个示例是一个非常典型的销售定货库存问题。这个示例很简单,表达的意思就是:如果某一个产品产生了销售定单数据,则将其对应的产品库存除去该销售定单所产生的数量,如果当前库存数量与该销售定单数量相同,则从库存表中删除该产品的库存纪录。</P>
<P>我们看到,利用 MERGE 语句可以将复杂的 SQL 语句简化。它比起 IF、CASE 等更加灵活和强大。</P>
<P><STRONG>结论</STRONG></P>
<P>Microsoft SQL Server 2008 对事务性 SQL 语言做了一些增强,提高了查询效率。使得 SQL&nbsp; Server 成为大中型企业数据库的首先产品。SQL Server 2008 将伴随 Visual Studio 2008 一起发布,开发人员提前了解这些信息有助于在 SQL Server 的新版本发布后快速建立基于该版本的企业级应用程序。</P>
<P><FONT size=4>【相关文章】</FONT></P>
<UL type=disc>
<LI><A href="http://database.51cto.com/art/200707/50357.htm" target=_blank><U><FONT color=blue>SQL Server 2008 -“Katmai”功能简介</FONT></U></A></LI></UL>
<UL type=disc>
<LI><A href="http://database.51cto.com/art/200706/49904.htm" target=_blank><U><FONT color=blue>微软新一代数据库SQL Server 2008明年初上市</FONT></U></A></LI></UL>
<UL type=disc>
<LI><A href="http://database.51cto.com/art/200706/48898.htm" target=_blank><U><FONT color=blue>Katmai改名SQL Server 2008</FONT></U></A></LI></UL>
<UL type=disc>
<LI><A href="http://www.51cto.com/art/200511/12389.htm" target=_blank><U><FONT color=blue>SQL Server 2005中的T-SQL</FONT></U></A></LI></UL>
<UL type=disc>
<LI><A href="http://www.51cto.com/art/200510/8649.htm" target=_blank><U><FONT color=blue>T-SQL实用例句</FONT></U></A></LI></UL>
<DIV align=right>【责任编辑:<A class=ln href="mailto:sunsj@51cto.com">火凤凰</A> TEL:(010)68476606-8007】</DIV></td>      </tr>      <tr>        <td class="d_font4">&nbsp;</td>      </tr>    </table>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -