T-SQL

SET ANSI_NULLS

SET ANSI_NULLS 表示指定在与Null值一起使用等于=和不等于<>比较运算符时,是否采用符合ISO标准的行为。

SET ANSI_NULLS开启时ON,即使字段column_name中包含空值,使用WHERE column_name = NULLSELECT语句仍返回0行。即使column_name中包含非空值,使用WHERE column_name <> NULLSELECT语句仍会返回0行。

SET_NULLS关闭时OFF,等于=和不等于<>比较运算符不遵守ISO标准。使用WHERE column_name = NULLSELECT语句返回column_name中包含空值的行。使用WHERE column_name <> NULLSELECT语句返回列中包含非空值的行。

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

你可能感兴趣的:(T-SQL)