sqlserver 2008 with 关键字怎么用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlserver 2008 with 关键字怎么用相关的知识,希望对你有一定的参考价值。

查了一下With 的用法:

WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到。
有的时候,是为了让SQL语句的可读性更高些,也有可能是在UNION ALL的不同部分,作为提供数据的部分。
特别对于UNION ALL比较有用。因为UNION ALL的每个部分可能相同,但是如果每个部分都去执行一遍的话,则成本太高,所以可以使用WITH AS短语,则只要执行一遍即可。
如果WITH AS短语所定义的表名被调用两次以上,则优化器会自动将WITH AS短语所获取的数据放入一个TEMP表里,
 如果只是被调用一次,则不会。而提示materialize则是强制将WITH AS短语里的数据放入一个全局临时表里。很多查询通过这种方法都可以提高速度。

WITH AS 语法:

[ WITH <common_table_expression> [ ,n ] ]
<common_table_expression>::=
expression_name [ ( column_name [ ,n ] ) ]
AS www.2cto.com
( CTE_query_definition )

示例:

1 with
2 cr as
3 (
4 select CountryRegionCode from person.CountryRegion where Name like \'C%\'
5 )
6 select * from person.StateProvince where CountryRegionCode in (select * from cr)
参考技术A ;with test as (select * from 表)
select * from test本回答被提问者采纳

在 SQL Server 中结合 CTE“WITH”和“WITH XMLNAMESPACES....”

【中文标题】在 SQL Server 中结合 CTE“WITH”和“WITH XMLNAMESPACES....”【英文标题】:Combine CTE "WITH" and a "WITH XMLNAMESPACES...." in SQL Server 【发布时间】:2011-04-10 18:04:58 【问题描述】:

有没有人设法在 SQL Server 的 T-SQL 中创建一个 CTE,其中还包含 WITH XMLNAMESPACES 声明?

似乎WITH 两个关键字都坚持要成为“T-SQL 批处理中的第一个”,但这并没有真正起作用....

我试过了:

WITH XMLNAMESPACES('http://schemas.myself.com/SomeSchema' as ns)
WITH CTEQuery AS
(
SELECT (list of fields)
    FROM dbo.MyTable
    WHERE (conditions)
)
SELECT * FROM CTEQuery

没用 :-((语法错误)

消息 156,第 15 级,状态 1,第 2 行 关键字“WITH”附近的语法不正确。 消息 319,第 15 级,状态 1,第 2 行 附近的语法不正确 关键字“与”。如果这个语句是 公用表表达式,一个 xmlnamespaces 子句或更改 跟踪上下文子句,前一个 语句必须以 分号。

所以我尝试在第二个 WITH 前面加上分号:

WITH XMLNAMESPACES('http://schemas.myself.com/SomeSchema' as ns)
;WITH CTEQuery AS
(
SELECT (list of fields)
    FROM dbo.MyTable
    WHERE (conditions)
)
SELECT * FROM CTEQuery

得到了这个:

消息 102,第 15 级,状态 1,第 2 行 ';' 附近的语法不正确。

然后我尝试将WITH XMLNAMESPACES 放入 CTE:

WITH CTEQuery AS
(
   WITH XMLNAMESPACES('http://schemas.myself.com/SomeSchema' as ns)
   SELECT (list of fields)
      FROM dbo.MyTable
      WHERE (conditions)
)
SELECT * FROM CTEQuery

得到了这个:

消息 156,第 15 级,状态 1,第 4 行 关键字附近的语法不正确 '与'。 消息 319,第 15 级,状态 1,第 4 行 附近的语法不正确 关键字“与”。如果这个语句是 公用表表达式,一个 xmlnamespaces 子句或更改 跟踪上下文子句,前一个 语句必须以 分号。 消息 102,第 15 级,状态 1,第 21 行 ')' 附近的语法不正确。

那么我到底该怎么做呢?

【问题讨论】:

【参考方案1】:

使用逗号代替第二个WITH,例如

WITH XMLNAMESPACES('http://schemas.myself.com/SomeSchema' as ns)
,CTEQuery AS
(
SELECT (list of fields)
    FROM dbo.MyTable
    WHERE (conditions)
)
SELECT * FROM CTEQuery

如果您想要多个 CTE 表达式,则相同。您只需指定一次WITH,然后所有其他WITH 块只需使用逗号而不是关键字。

【讨论】:

并且必须先定义XMLNAMESPACES,然后再定义任何CTEs

以上是关于sqlserver 2008 with 关键字怎么用的主要内容,如果未能解决你的问题,请参考以下文章

SqlServer2008R2在select时的with(nolock)选项说明

请教Sqlserver 2008中使用with as语句递归查询的问题。

SQLServer 2008中SQL增强之二 Top新用途

sqlserver2008 监控某个表的改动情况

怎么彻底删除SQLServer2008 卸载SQLServer2008

怎么彻底删除SQLServer2008 卸载SQLServer2008