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


    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

  • 相关阅读:
    代码面试最常用的10大算法
    ant google compiler 压缩
    美工资源
    面试题
    validate表单验证插件
    laypage分页
    layer弹出框小结
    Thymeleaf
    webApp开发
    grunt自动化构建工具
  • 原文地址:https://www.cnblogs.com/wykLog/p/4280176.html
Copyright © 2020-2023  润新知