SQLSERVER SQL编程集合 (part 1)

原创 2007年10月01日 19:37:00
/////////////////////////////////////变量的使用

/**//*变量声明方法*/

(
1)

DECLARE @customer_count INT@total_sales REAL@best_sales DATETIME

(
2)

DECLARE @customer_count INT

 

/**//*变量赋值方法*/

(
1)

SET @customer_count = 0

(
2)

SELECT @customer_count = 0

(
3)

DECLARE @total_id  CHAR(6)

SELECT @total_id = stor_id FROM discounts

 

/////////////////////////////////////函数

CREATE FUNCTION ufn_getDiscount(@stor_id char(4))

RETURNS REAL

BEGIN

RETURN (SELECT discount FROM discounts WHERE stor_id = @stor_id)

END

 

SELECT lowqty, dbo.ufn_getDiscount(stor_id)/**//*函数返回单值时在调用是必须加拥有者名字*/

FROM discounts

WHERE dbo.ufn_getDiscount(stor_id) > 6

 

/**//*RETURNS 对返回表进行描述*/

CREATE FUNCTION ufn_getDiscountsInfo(@stor_id char(4))

RETURNS @info_table TABLE

(

info_lowqty  
INT,

highqty      
INT,

discount     
INT 

)

BEGIN

INSERT @info_table SELECT Lowqty, highqty, discOunt FROM discounts

                  
WHERE stor_id = @stor_id

RETURN

END

 

SELECT discount FROM ufn_getDiscountsInfo(8042)

 

 

 

////////////////////////////////////////存储过程

CREATE PROCEDURE usp_add_coder

@name        VARCHAR(30),

@address     VARCHAR(30),

@office      INT = 1,  /**//*初值=1*/

@manager     INT = 1

AS

INSERT INTO coder(name, address, office, manager)

VALUES (@name@address@office@manager)

 

EXECUTE usp_add_coder 'ckcs''福建'12

 

 

////////////////////////////////////////触发器

CREATE TRIGGER tri_update_order ON orders

FOR UPDATE

AS

DECLARE @rowcount int

SET @rowcount = @@rowcount

IF (UPDATE(EmployeeID) OR UPDATE(Freight))  /**//*只要有更新EmployeeID或Freight的值触发器将被触动*/

BEGIN

IF (@rowcount > 1)

BEGIN

ROLLBACK TRANSACTION

RAISERROR('每次更新只能更新一条记录'162)

END

ELSE BEGIN

UPDATE employee_2 SET salary = salary - 

  (
SELECT Freight FROM DELETED WHERE (employee_2.emp_id = (SELECT EmployeeID FROM DELETED)))

END

END

 

CREATE TRIGGER tri_delete_employee ON employee

FOR DELETE

AS

IF @@rowcount > 1  /**//*判断操作是否影响到两行*/

BEGIN 

ROLLBACK TRANSACTION

RAISERROR('你不能同时删除两个雇员'162)

END

ELSE BEGIN

UPDATE employee_1 SET NAME = 'jinlp' 

  
WHERE emp_id = (SELECT employee_id FROM DELETED)

UPDATE employee_2 SET NAME = 'jinlp2'

  
WHERE emp_id = (SELECT employee_id FROM DELETED) 

END

 

/**//*类型(1)@checking_balance和@loc_balance在存储过程里面定义*/

/**//*存储过程的定义*/

CREATE PROCEDURE usp_process_check

@account_number  INT,

@check_number    INT,

@check_amount    INT,

@checking_balance   REAL OUTPUT,

@loc_used           REAL OUTPUT,

@loc_balance        REAL OUTPUT

AS

SET @loc_used = 0  /**//*设置处始值*/

SELECT @checking_balance = check_balance FROM customers  /**//*对@checking_balance进行赋值*/

                            
WHERE account_number = @account_number

SELECT @loc_balance = (SELECT loc_balance FROM customers

                       
WHERE account_number = @account_number)

IF  @checking_balance < @check_amount

SET @loc_used = (@check_amount - @checking_balance)

SET @checking_balance = @checking_balance - @check_amount + @loc_used

INSERT INTO checks 

   
VALUES(@account_number@check_number@check_amount)

UPDATE customers SET loc_balance = @loc_balance, checking_balance = @checking_balance

   
WHERE account_number = @account_number

 

 

/////////////////////////////////建立数据库

CREATE DATABASE home_database

ON

(

NAME 
= 'MYhome_data',

FILENAME 
= 'e:database backupMYhome_data.mdf',

SIZE 
= 10MB,

MAXSIZE 
= 15MB, /**//*或是使用unlimited*/

FILEGROWTH 
= 1MB 

)

LOG ON

(

NAME 
= 'MYhome_log',

FILENAME 
= 'e:database backupMYhome_log.log',

SIZE 
= 3MB,

MAXSIZE 
= 6MB,

FILEGROWTH 
= 1MB

)

 

//////////////////////////////////游标

 

DECLARE cur_payroll_work_3 SCROLL CURSOR

FOR SELECT * FROM orders  -- MS-SQL强制把 SCROLL 游标设为 READONLY

 

OPEN cur_payroll_work_3  -- 使用数据填充游标

 

FETCH NEXT FROM cur_payroll_work_3 -- 下一行

 

FETCH PRIOR FROM cur_payroll_work_3  -- 上一行

 

FETCH FIRST FROM cur_payroll_work_3 -- 第一行

 

FETCH LAST FROM cur_payroll_work_3 -- 最后一行

 

FETCH RELATIVE 1 FROM cur_payroll_work_3

 

FETCH RELATIVE -1 FROM cur_payroll_work_3

 

FETCH ABSOLUTE 1 FROM cur_payroll_work_3  --第1行

 

FETCH ABSOLUTE -1 FROM cur_payroll_work_3  --倒数第一行

 

--CLOSE 将释放游标占有的资源,但是游标在当前会话中仍然存在。

CLOSE cur_payroll_work_3

 

--deallocate会消毁游标,执行它后游标不再存在。

DEALLOCATE cur_payroll_work_3

 

-- MS-SQL强制把 SCROLL 游标设为 READONLY 可使用DYNAMIC游标实现可更改的游-- 标

DECLARE  cur_orders_4  CURSOR DYNAMIC 

FOR SELECT * FROM orders

FOR UPDATE OF ShipAddress, ShipVia

OPEN cur_orders_4

 

FETCH RELATIVE 1 FROM cur_orders_4  --可回滚

 

DELETE FROM orders WHERE CURRENT OF cur_orders_4  --可更新

 

UPDATE orders SET ShipAddress = '福建' WHERE CURRENT OF cur_orders_4  --可更新

这是我在学习SQL编程时对一些常见的SQL语句的摘录和总结,希望对你有些帮助,主要是针对MS SQLSERVER编程.

源码-PL/SQL从入门到精通-第十七章-面向对象编程-Part 1

原来PL/SQL也支持面向对象编程,有了Java基础,这章不难理解。 有个问题:对象定义真不支持布尔类型? 我的Java程序中布尔型可是很常用的啊。不过肯定有其他的替代解决方案吧 --第17章开始...

源码-Oracle数据库管理-第十四章-记录与集合-Part 1(使用PL/SQL记录)

记录:单行多列 集合:多行单列 这样说,确实简单明了啊 --第14章 记录与集合 --14.1 使用PL/SQL记录 --代码14.1 使用记录的PL/SQL语句块示例 DECLARE -...

源码-PL/SQL从入门到精通-第八章-记录与集合-Part 1

--第8章开始 --代码8.1 不使用记录的PL/SQL语句块示例 DECLARE --定义保存字段值的变量 v_empno NUMBER; v_ename VARCHAR2...

精通Oracle.10g.Pl.SQL编程 part(3-1)

  • 2014年11月23日 16:33
  • 4.77MB
  • 下载

SQL编程实用大全精华版part1

  • 2011年04月01日 22:55
  • 14.53MB
  • 下载

MyEclipse(Java)连接SQLServer 2008 part1

MyEclipse(Java)连接SQLServer 2008 R2 失败n次的经验    历时不下于十二个小时的探索检查,终于连接成功了,又想哭,又想笑。没办法,老师让自己搞;师兄又不给力;网上百...

SQL编程实用大全(精华版).part1

  • 2008年07月18日 14:19
  • 34MB
  • 下载

SQL Server 2000编程员指南.part1

  • 2008年06月16日 17:12
  • 5MB
  • 下载

源码-PL/SQL从入门到精通-第十七章-面向对象编程-Part 2

--代码17.14 定义地址对象类型 --定义地址对象类型规范 CREATE OR REPLACE TYPE address_type AS OBJECT (street_addr1 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQLSERVER SQL编程集合 (part 1)
举报原因:
原因补充:

(最多只允许输入30个字)