SET ANSI_NULLS
SET ANSI_NULLS
表示指定在与Null
值一起使用等于=
和不等于<>
比较运算符时,是否采用符合ISO标准的行为。
当SET ANSI_NULLS
开启时ON
,即使字段column_name
中包含空值,使用WHERE column_name = NULL
的SELECT
语句仍返回0行。即使column_name
中包含非空值,使用WHERE column_name <> NULL
的SELECT
语句仍会返回0行。
当SET_NULLS
关闭时OFF
,等于=
和不等于<>
比较运算符不遵守ISO标准。使用WHERE column_name = NULL
的SELECT
语句返回column_name
中包含空值的行。使用WHERE column_name <> NULL
的SELECT
语句返回列中包含非空值的行。
SET QUOTED_IDENTIFIER
SET QUOTED_IDENTIFIER
开启时ON
,标识符可由双引号分割,而文字必须由单引号分割。
SET QUOTED_IDENTIFIER
关闭时OFF
,标识符不可以加引号,必须遵守所有Transact-SQL标识符规则。
# 方括号就是标识符
SELECT * FROM [Users]
标识符的作用就是告诉数据库引擎,此处是一个数据库对象,而非一个关键字。
SET NOCOUNT
存储过程中SET NOCOUNT
的作用是阻止在结果集中返回显示受T-SQL语句或者usp
影响的计数行数。
当SET NOCOUNT ON
时会更新@@RowCount
,将不会向客户端发送存储过程每个语句的DONE_IN_proc
消息,如果存储过程中包含一些并不返回实际数据的语句,网络通信流量便会大量减少,可以显著的提高应用程序的性能。另外SET NOCOUNT
指定的设置,在执行或运行时生效,分析时不生效。
SQL Server 2005中提供了一种解决方案,使用公用表表达式CTE,使SQL语句可维护。同时,CTE要比表变量效率高很多。
WITH AS
WITH AS
叫做子查询,如果WITH AS
短语所定义的表名被调用两次以上,优化器会自动将它查询的数据放入一个临时表TEMP
,如果只是被调用一次则不会。
子查询如果嵌套过多,会使SQL语句难以阅读和维护,虽然可以将子查询放在表变量中,但会带来性能的损失。由于表变量实际上使用了临时表,从而增加了额外的I/O开销。因此表变量的方式并不太适合数据量太大且频繁查询的情况。
-- 子查询
WITH
aa(ParentID, SociatyID, lvl) AS(
SELECT a.ID AS ParentID, b.ID AS SociatyID, 0
FROM WHWebWarehouse.dbo.BsAgent a
INNER JOIN WHTreasureDB.dbo.SociatyConfig b ON a.ID = b.AgentID
WHERE a.ID = @agentID
UNION ALL
SELECT a.ID AS ParentID, b.ID AS SociatyID, e.lvl+1
FROM WHWebWarehouse.dbo.BsAgent a
INNER JOIN WHTreasureDB.dbo.SociatyConfig b ON a.ID = b.AgentID
INNER JOIN aa e ON a.ParentID = e.ParentID
WHERE e.lvl < 2
),
aaa AS(
SELECT UserID, EndTime, Opertime, b.lvl
FROM WHTreasureDB.dbo.SociatyMember a
INNER JOIN aa b ON a.SociatyID = b.SociatyID
)
CASE WHEN THEN ELSE END
- CASE函数
CASE gender
WHEN 1 THEN 'male'
WHEN 2 THEN 'female'
ELSE 'unknown' END
- CASE搜索函数
CASE
WHEN gender = 1 THEN 'male'
WHEN gender = 2 THEN 'female'
ELSE 'unkown' END
示例
CASE WHEN c.Name='一级代理' THEN (
CASE WHEN EXISTS(SELECT 1 FROM WHWebWarehouse.dbo.AgentNoSetting WHERE AgentNo = e.AgentNo AND AgentNo <> '888888') THEN e.GradeName
ELSE c.Name END
)
ELSE
CASE WHEN e.GradeName='管理员' THEN c.Name
ELSE e.PreGardeName END
END,
CASE WHEN c.Name='一级代理' THEN (
CASE WHEN EXISTS(SELECT 1 FROM WHWebWarehouse.dbo.AgentNoSetting WHERE AgentNo = e.AgentNo AND AgentNo <> '888888') THEN e.AgentNo
ELSE a.AgentNo END
)
ELSE
CASE WHEN e.GradeName='管理员' THEN a.AgentNo
ELSE e.PreAgentNo END
END,
ROW_NUMBER() OVER(ORDER BY column_name) rownumber,
-- 先对GadeName列降序排列,再为降序后的每条记录返回一个序号。
ROW_NUMBER() OVER(ORDER BY GardeName) rownumber,
ROW_NUMBER()
从1开始为每条分组记录返回一个数字,使用它可以获得添加在结果集中增加列中的行序号。
SELECT * FROM (
SELECT
(SELECT COUNT(1) FROM aaa) AS TotalCount,
ROW_NUMBER() OVER(ORDER BY GardeName) rownumber,
*
FROM aaa
) a
WHERE rownumber BETWEEN @pageSize*(@currPage-1)+1 AND @pageSize*@currPage