首页 > 数据库技术 > 详细

T-SQL应用,视图、存储过程、触发器、游标、临时表等

时间:2015-02-08 18:03:33      阅读:331      评论:0      收藏:0      [点我收藏+]

sqlserver常用操作:

视图、存储过程、触发器、函数

--*********************批处理*********************
--[在一个批处理中存有一个语法错误,则所有的语句都无法通过编译]
USE flowershopdb
SELECT * FROM tb_category
SELECT * FROM tb_detailed
SELECT * FROM tb_product
SELECT * FROM tb_shopping
SELECT * FROM tb_user
INSERT tb_user(u_name,u_pass) VALUES(user3,12)
DELETE tb_user WHERE u_id=4
UPDATE tb_user SET u_name=sa,u_pass=11 WHERE u_id=2
GO

--*********************视图*********************
CREATE VIEW v_cd
AS
--内连接[不建议使用联合查询]
SELECT c.c_id,d.d_id,c.c_name,d.d_name,d.d_remark FROM tb_category c 
INNER JOIN tb_detailed d
ON c.c_id=d.c_id
GO

SELECT * FROM v_cd


--*********************变量*********************
--局部变量
--如果事先不对变量赋值,变量将保持NULL的状态

--声明
DECLARE @name nvarchar(10)
DECLARE @age int
DECLARE @num int
--或者
DECLARE @name nvarchar(10),
        @age int,
        @num int

--赋值
--1 set
SET @name = 哈哈
--2 select
SELECT @age = 5
SELECT @num=c_id FROM tb_category WHERE c_id=1000

--打印
PRINT @name
PRINT @age
PRINT @num

--变量作为条件
SELECT * FROM tb_category WHERE c_id>@num
GO

--全局变量
PRINT  SQLServer的版本+@@VERSION 
PRINT  服务器名称: +@@SERVERNAME
PRINT 最后一次放生的错误号+CONVERT(varchar(5),@@ERROR)
GO



--*********************结构语句*********************
--IF ELSE语句
DECLARE @price MONEY 
SELECT  @price=AVG(p_price) FROM tb_product
IF (SELECT  p_price FROM tb_product WHERE p_id=3000)>@price
    BEGIN
        SELECT 高价
        SELECT p_name,p_price FROM tb_product WHERE p_id=3000
    END
ELSE
    BEGIN
        SELECT 低价
        SELECT p_name,p_price FROM tb_product WHERE p_id=3000
    END
GO

--IF EXISTS()语句 --条件
IF EXISTS(SELECT AVG(p_price) FROM tb_product)
PRINT haha

IF EXISTS(SELECT p_price FROM tb_product WHERE p_price>100)
PRINT haha


DECLARE @price MONEY 
SELECT  @price=AVG(p_price) FROM tb_product
IF EXISTS(SELECT  p_name,p_price FROM tb_product WHERE p_price>@price)
    BEGIN
        SELECT 高价,p_name,p_price FROM tb_product WHERE p_price>@price
    END
ELSE
    BEGIN
        SELECT 低价,p_name,p_price FROM tb_product WHERE p_price<@price
    END
GO

--WHILE()语句 [WHILE(1=1)条件永远为真]


--*********************事务*********************
BEGIN TRANSACTION 
/*--定义变量,用于累计事务执行过程中的错误--*/
DECLARE @errorSum INT 
SET @errorSum=0  --初始化为0,即无错误
/*--转账product:百合花多10支,剑兰少10支*/
UPDATE tb_product SET p_number=p_number+10
   WHERE p_name LIKE 百合%
SET @errorSum=@errorSum+@@error
UPDATE tb_product SET p_number=p_number-10
   WHERE p_name LIKE 剑兰%
SET @errorSum=@errorSum+tb_product  --累计是否有错误
IF @errorSum>0
BEGIN
    ROLLBACK TRANSACTION
    SELECT 失败
END
ELSE
BEGIN
    COMMIT TRANSACTION
    SELECT 成功
End

--*********************分页语句*********************
DECLARE @pageSize int,
        @pageIndex int
SELECT  @pageSize=3,
        @pageIndex=1
BEGIN
SELECT TOP (@pageSize) p_id,p_price,p_name FROM tb_product 
WHERE p_id NOT IN
    (
    SELECT TOP ((@pageIndex-1)*@pageSize) p_id FROM tb_product ORDER BY p_id DESC 
    ) 
ORDER BY p_id DESC
END

--*********************存储过程*********************
--PROCEDURE 简写 PROC
--EXECUTE 简写 EXEC

--系统存储过程
--列出服务器上的所有数据库。
EXEC sp_databases
--显示默认值、未加密的存储过程、用户定义的存储过程、触发器或视图的实际文本
EXEC sp_helptext v_cd          --视图
EXEC sp_helptext proGetPageData--存储过程
EXEC sp_helptext f             --触发器
--查看某个表的所有信息
EXEC sp_help tb_product


--自定义存储过程

--编写分页存储过程[采用子查询]
--@pageSize 页容量[一页显示几条数据]
--@pageIndex 第几页
ALTER PROCEDURE proGetPageData
@pageSize int=3,   
@pageIndex int=1
AS
DECLARE @sqlStr varchar(300)
SET @sqlStr=select top +
str(@pageSize)+ * from tb_product where p_id not in(select top +
str((@pageIndex-1)*@pageSize)+
p_id from tb_product order by p_id)order by p_id PRINT @sqlStr EXEC(@sqlStr) --调用存储过程[三种方式] EXEC proGetPageData --调用含有默认参数的 EXECUTE proGetPageData 3,1 --调用传参的 EXEC proGetPageData @pageSize=3,@pageIndex=2 --调用传值的 EXEC proGetPageData @pageSize=10 --pageSize自定义,pageIndex采用默认值 --采用输出参数的存储过程 --@pageCount 总页数 @rowCount 总行数 ALTER PROC [dbo].[proGetPageData2] @pageIndex int=1, @pageSize int=3, @pageCount int OUTPUT, @rowCount int OUTPUT AS BEGIN DECLARE @sqlStr nvarchar(300),@sqlCount nvarchar(300) SET @sqlCount = SELECT @rowCount=COUNT(p_id),@pageCount=CEILING((COUNT(p_id)+0.0)/+ CAST(@pageSize AS VARCHAR)+) FROM tb_product PRINT @sqlCount EXEC SP_EXECUTESQL @sqlCount,N@rowCount INT OUTPUT,@pageCount INT OUTPUT,@rowCount OUTPUT,@pageCount OUTPUT SET @sqlStr=select top +
str(@pageSize)+ * from tb_product where p_id not in(select top +
str((@pageIndex-1)*@pageSize)+
p_id from tb_product order by p_id)order by p_id PRINT @sqlStr EXEC(@sqlStr) END DECLARE @pc int DECLARE @rc int EXEC [proGetPageData2] 1,3,@pc OUTPUT,@rc OUTPUT SELECT @pc,@rc --简单查询语句存储过程 CREATE PROCEDURE proGetPageData_user @u_id int AS BEGIN SELECT * FROM tb_user WHERE u_id=@u_id END EXEC proGetPageData_user 1 --*********************函数********************* --系统函数 SELECT LEN(111) SELECT DATALENGTH(111) SELECT GETDATE() --自定义函数 --分页函数[子查询] --内联表值函数[返回值为表格] CREATE FUNCTION funGetPageData(@pageSize int,@pageIndex int) RETURNS TABLE AS RETURN ( SELECT TOP (@pageSize) p_id,p_price,p_name FROM tb_product WHERE p_id NOT IN(SELECT TOP ((@pageIndex-1)*@pageSize) p_id FROM tb_product ORDER BY p_id DESC ) ORDER BY p_id DESC ) --标量值函数[返回值为int] CREATE FUNCTION demo(@a int,@b int) RETURNS int AS BEGIN RETURN (@a+@b) END --调用函数 SELECT * FROM dbo.funGetPageData(3,1) PRINT dbo.demo(1,2) --*********************触发器********************* --tb_product表更新触发器 --IF UPDATE(列名)检查是否更新了某一列,用于 insert 或 update,不能用于 delete。例: CREATE TRIGGER f ON tb_product FOR UPDATE AS IF UPDATE(p_name) or UPDATE(p_remark) PRINT tb_product表name和remark更新了

游标、临时表:

--游标
declare @d_name varchar(max)
declare @d_remark varchar(max)
declare @d_price varchar(20)
declare @d_number varchar(4)
declare @count int
set @count = 0
declare yb cursor 
for(select p_name,p_remark,p_price,p_number from tb_product)
open yb
fetch next from yb into @d_name,@d_remark,@d_price,@d_number
while (@@FETCH_STATUS = 0)
begin
    print 花名: +@d_name
    print 备注: +@d_remark
    print 价格: +@d_price
    print 编号: +@d_number
    print --------------------------
    set @count = @count + 1
    fetch next from yb into @d_name,@d_remark,@d_price,@d_number
end
close yb
deallocate yb
print 总数:+cast(@count as varchar)

select count(*) from tb_product

--临时表
select * from tb_product
create table #wyk(pname varchar(200))
insert into #wyk values(啊啊)
select * from #wyk
drop table #wyk

临时表与表变量:

                       http://www.cnblogs.com/zhuawang/archive/2008/05/31/1211196.html
                       http://www.cnblogs.com/freshman0216/archive/2010/11/14/1868672.html

游标:

                       http://www.cnblogs.com/moss_tan_jun/archive/2011/11/26/2263988.html

详情:http://www.cnblogs.com/hoojo/category/276251.html

T-SQL应用,视图、存储过程、触发器、游标、临时表等

原文:http://www.cnblogs.com/wykLog/p/4280176.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!