T-SQL基础--chp10可编程对象学习笔记

--用DECLARE声明变量;用SET给变量赋值
--要注意,如果声明的变量类型不是SQL所属的,就会报错。
DECLARE @j AS INT;
SET @j = 10;

DECLARE @i AS float;
SET @i = 10.0;

DECLARE @m AS CHAR;
SET @m=‘M‘;

DECLARE @n AS DATETIME =‘2014-9-28 9:18:16‘;

USE TSQLFundamentals2008
DECLARE @empname AS NVARCHAR(61)
SET @empname = (SELECT firstname+N‘ ‘+lastname FROM HR.Employees WHERE empid=9)
SELECT @empname AS hah;

DECLARE @FN AS NVARCHAR(20),@LN AS NVARCHAR(40)
SET @FN = (SELECT firstname FROM HR.Employees WHERE empid = 7)
SET @LN = (SELECT lastname FROM HR.Employees WHERE empid = 7)
SELECT @FN AS 姓,@LN AS 名;

--用赋值SELECT语句赋值,结果只会输出最后一行;用SET赋值更安全
DECLARE @emp_name AS NVARCHAR(60)
SELECT @emp_name=firstname+‘ ‘+lastname FROM HR.Employees WHERE mgrid = 2
SELECT @emp_name AS 雇员名字

--批处理
PRINT ‘fb‘--显示在消息里
SELECT * FROM HR.Employees --显示在结果里
GO
PRINT ‘fb2‘
SELECT * FROM Sales.Orders
GO
PRINT ‘fb3‘
SELECT * FROM Sales.Shippers
GO
--下面的程序会报错!注意原因!其次还包括视图,rule等。。。
if OBJECT_ID(‘[dbo].[HwocaoSA]‘,‘p‘) IS NOT NULL
drop procedure [dbo].[HwocaoSA]
--GO
CREATE PROCEDURE HwocaoSA
AS
BEGIN
select * from [HR].[Employees]
END
--【有点疑问】书P324[书上说下面这段代码是不可行的,但是事实上是可行的。why?]
IF OBJECT_ID(‘Table_1‘,‘U‘) IS NOT NULL
DROP TABLE Table_1
create table Table_1(hihi int)
ALTER TABLE Table_1 ADD HEHE INT
SELECT hihi,HEHE FROM Table_1
GO 100

--流程控制元素
--IF...ELSE...
IF YEAR(CURRENT_TIMESTAMP) <> YEAR(DATEADD(day,1,CURRENT_TIMESTAMP))--<>是不等于,正式,!=不正式
PRINT ‘Today is the last day of year‘;
ELSE
PRINT ‘Today is not the last day of year‘;

--WHILE循环
DECLARE @i AS INT;
SET @i = 1;
WHILE @i <=10
BEGIN
PRINT @i;
SET @i = 1+@i;--最开始这刚没加‘SET‘ 报错。SET是赋值的意思啊亲!!
END
--跳出当前循环:BREAK
DECLARE @F AS INT;
SET @F = 10;
WHILE @F > 0
BEGIN
IF (@F < 2) BREAK;
PRINT @F;
SET @F = @F -1;
END

--if else和while结合使用
SET NOCOUNT ON;
IF OBJECT_ID(‘TABLE_1‘,‘U‘) IS NOT NULL --如果用户表TABLE_1不为空
DROP TABLE TABLE_1
CREATE TABLE TABLE_1(num1 INT NOT NULL PRIMARY KEY)
GO
DECLARE @i AS INT;
SET @i = 1;
WHILE @i < 124
BEGIN
INSERT INTO TABLE_1(num1) VALUES (@i)
SET @i = @i +1;
END
GO
SELECT * FROM TABLE_1
GO

--用游标来计算Sales.CustOrders视图中每个客户每个月的连续订货量
--如果不知道是怎么执行的,可以单步调试下
SET NOCOUNT ON;
USE TSQLFundamentals2008;

DECLARE @Result TABLE
(
  custid INT,
  ordermonth DATETIME,
  qty INT,
  runqty INT,
  PRIMARY KEY(custid,ordermonth)
);

DECLARE
  @custid AS INT,
  @prvcustid AS INT,
  @ordermonth AS DATETIME,
  @qty AS INT,
  @runqty AS INT; --runqty为客户当前连续总订货量

DECLARE C CURSOR FAST_FORWARD FOR  --基于一个查询声明了一个游标
  SELECT custid,ordermonth,qty
  FROM Sales.CustOrders
  ORDER BY custid,ordermonth;

OPEN C   --打开游标

FETCH NEXT FROM C INTO @custid,@ordermonth,@qty;--将游标移到下一条并相应操作

SELECT @prvcustid = @custid,@runqty=0;

WHILE @@FETCH_STATUS = 0  --当还没有超出游标的最后一行时,通过循环来遍历每个记录
BEGIN
  IF @custid <> @prvcustid
    SELECT @prvcustid = @custid,@runqty = 0;

  SET @runqty = @runqty + @qty;

  INSERT INTO @Result VALUES(@custid, @ordermonth, @qty, @runqty);

  FETCH NEXT FROM C INTO @custid,@ordermonth,@qty;
END

CLOSE C;

DEALLOCATE C;

SELECT
  custid,
  CONVERT(VARCHAR(7), ordermonth, 121) AS ordermonth,
  qty,
  runqty
FROM @Result
ORDER BY custid, ordermonth;

--局部临时表
USE TSQLFundamentals2008;
IF OBJECT_ID(‘tempdb.dbo.#MyOrderTotalsYear‘) IS NOT NULL
  DROP TABLE dbo.#MyOrderTotalsYear;
GO

SELECT
  YEAR(O.orderdate) AS orderyear,
  SUM(OD.qty) AS qty
INTO dbo.#MyOrderTotalsByYear
FROM Sales.Orders AS O
  JOIN Sales.OrderDetails AS OD
    ON OD.orderid = O.orderid
GROUP BY YEAR(orderdate);

SELECT Cur.orderyear,Cur.qty AS curyearqty,Prv.qty AS prvyearqty
FROM dbo.#MyOrderTotalsByYear AS Cur
  LEFT OUTER JOIN dbo.#MyOrderTotalsByYear AS Prv
    ON Cur.orderyear = Prv.orderyear + 1;

--全局临时表
CREATE TABLE dbo.##Globals--创建一个全局临时表
(
  id sysname NOT NULL PRIMARY KEY,--SQL SERVER在内部用这个类型来代表标识符
  val SQL_VARIANT NOT NULL --一种通用的数据类型,差不多可以保存任何基础类型的值
)
--任何人都可以向全局临时表中插入数据行
INSERT INTO dbo.##Globals(id,val)VALUES(N‘i‘,CAST(10 AS INT));

--表变量[只对当前批处理可见]
DECLARE @MyOrderTotalsByYear TABLE
(
  orderyear INT NOT NULL PRIMARY KEY,
  qty INT NOT NULL
);

INSERT INTO @MyOrderTotalsByYear(orderyear, qty)
  SELECT
    YEAR(O.orderdate) AS orderyear,
    SUM(OD.qty) AS qty
  FROM Sales.Orders AS O
    JOIN Sales.OrderDetails AS OD
      ON OD.orderid = O.orderid
  GROUP BY YEAR(orderdate);

SELECT Cur.orderyear,Cur.qty AS curyearqty, Prv.qty AS prvyearqty
FROM @MyOrderTotalsByYear AS Cur
  LEFT OUTER JOIN @MyOrderTotalsByYear AS Prv
    ON Cur.orderyear = Prv.orderyear +1;

--表类型【额,原样复制代码,但是竟然报错了……】
USE TSQLFundamentals2008;
IF TYPE_ID(‘dbo.OrderTotalsByYear‘) IS NOT NULL
  DROP TYPE dbo.OrderTotalsByYear;

CREATE TYPE dbo.OrderTotalsByYear AS TABLE
(
  orderyear INT NOT NULL PRIMARY KEY,
  qty INT NOT NULL
);

DECLARE @MyOrderTotalsByYears AS dbo.OrderTotalsByYear;

INSERT INTO @MyOrderTotalsByYears(orderyear, qty)
  SELECT
    YEAR(O.orderdate) AS orderyear,
    SUM(OD.qty) AS qty
  FROM Sales.Orders AS O
    JOIN Sales.OrderDetails AS OD
      ON O.orderid = OD.orderid
  GROUP BY YEAR(orderdate);

SELECT orderyear,qty FROM @MyOrderTotalsByYears;

--P338动态SQL待续。。。
时间: 2024-08-05 15:31:21

T-SQL基础--chp10可编程对象学习笔记的相关文章

T-SQL基础--chp10可编程对象学习笔记[下]

--2014年9月29日9:15:29 --P338 --两种执行动态SQL的方法 --EXEC命令 DECLARE @sql AS VARCHAR(100); SET @sql = 'PRINT ''This message was printed by a dynamic SQL batch'';';--注意,对于字符串中的字符串,需要用两个单引号(不是双引号!)来代表一个单引号 EXEC(@sql); --sp_executesql存储过程[两个输入参数和一个参数赋值部分] DECLARE

sql server查询可编程对象定义的方式对比以及整合

本文目录列表: 1.sql server查看可编程对象定义的方式对比 2.整合实现所有可编程对象定义的查看功能的存储dbo.usp_helptext2 3.dbo.helptext2的选择性测试 4.总结语 5.参考清单列表 1.sql server查看可编程对象定义的方式对比   上一篇博文重构sql server的sys.helptext存储中写了sys.helptext的限制和输出格式每行自带char(13)和char(10)这两个字符.为了将可编程对象定义查询方式研究透彻,以下表格列出了

JAVA之GUI编程概述学习笔记(22)

      下列内容为本人看毕向东老师java视频教程学习笔记! JAVA GUI图形用户界面编程: Windows 操作系统提供两种操作方式:                                 1.GUI                2.CLI; GUI:Grahi User Interface ,图形用户界面.                       特点:用图形的方式,来显示计算机操作的界面,这样更方便更直观. CLI: Command line User Interf

(转)【D3D11游戏编程】学习笔记二十三:Cube Mapping进阶之动态环境图

(注:[D3D11游戏编程]学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 在前面两篇介绍Cube Mapping的文章中,我们所使用到的Cube Map都是事先制作好的,这样的一个好处就是运行时效率很高,适合于大多数情形.但如果对于即时动态变化的场景来说,依靠静态图来实现反射效果就不再适用了.因为在不同时刻,一个物体周围的场景是不断变化的,想要把这些变化在物表的反射中体现出来,就需要一张动态的环境图. 1.C

《SQL必知必会》学习笔记(一)

<SQL必知必会>学习笔记(一) 下面变列出我新学到的知识. 这个是数据库的全部记录 1.order by   语句: select * from Scores order by name , Score desc 执行结果: ①order by在执行排序功能时,会先对排序字段按abcd这样的顺序进行,汉字的话是按拼音的首字母,默认是正序. ②例子中先按name字段进行正序排序,当name相同时,又按score倒叙排,例如拜仁两条数据,胜的开头字母是s,负的是f,因为是倒叙,所以胜的那条数据排

《SQL必知必会》学习笔记二)

<SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语句,但是实际应用中的业务逻辑往往会非常复杂,所以会用到一些比较复杂的查询,如子查询,联合查询. 1.子查询 当一个查询是另一个查询的条件时,称为子查询.但是说到子查询又不的不说它与嵌套查询两者的区别,下面一张图来说明 下面再用一条sql语句来说明他们的关系. 其中在查询中又分为嵌套子查询和相关子查询,他们之间

(转)【D3D11游戏编程】学习笔记二:XNAMath之XMVECTOR

(注:[D3D11游戏编程]学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 一.XNA Math简介 在D3D10及之前的版本中,3D数学库是伴随在D3DX库中的.在D3D11版中,3D数学库被单独隔离出来,为XNA Math库,功能和之前基本一样,但是建立在SIMD指令上,以更好地利用Windows及XBox360上特殊的硬件寄存器(128位,可以同时操作4个32位数). 二.向量类型 在XNA数学库中,核心

(转)【D3D11游戏编程】学习笔记二十四:切线空间(Tangent Space)

(注:[D3D11游戏编程]学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 切换空间,同局部空间.世界空间等一样,是3D图形学中众多的坐标系之一.切换空间最重要的用途之一,即法线映射(Normal Mapping).关于法线映射的细节,将在下一篇文章中详细介绍.但在学习法线映射之前,深刻地理解切换空间非常重要.因此借这一篇文章来学习下它,以为后面学习法线映射.视差映射(Parallax Mapping).Dis

(转)【D3D11游戏编程】学习笔记二十一:Cube Mapping及其应用之一:天空盒的实现

(注:[D3D11游戏编程]学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 这一节讨论有关纹理映射的进阶内容:Cube Mapping. 1. 简介 单从名字上,就大概可以看出点端倪了,翻译成中文为立方体映射,因此肯定跟立方体有关系.确实,Cube Mapping就是使用六张正方形的图片来进行纹理映射的.这六张图片分别对应了一个立方体中的六个面.由于这个立方体是轴对齐的,因此每个面可以用坐标系中的六个轴方向来惟