首页 > 代码库 > sql study

sql study

-- =============================================
-- Author:  lifu
-- Create date: 2017-06-14
-- Description:  sql study
-- =============================================
use db_study;

--判断是否存在表
IF EXISTS (
    SELECT  * 
    FROM dbo.SysObjects 
    WHERE ID = object_id(N[usertbl]) 
    AND OBJECTPROPERTY(ID, IsTable) = 1
) 
print usertbl exists
else
BEGIN
CREATE TABLE usertbl (
    id INT identity(1,1) primary key,
    name NVARCHAR(20) DEFAULT NULL,
    age INT DEFAULT NULL
)
END

IF EXISTS (
    SELECT  * 
    FROM dbo.SysObjects 
    WHERE ID = object_id(N[stutbl]) 
    AND OBJECTPROPERTY(ID, IsTable) = 1
) 
print stutbl exists
else
BEGIN
CREATE TABLE stutbl(
    id INT identity(1,1) primary key,
    name NVARCHAR(20) DEFAULT NULL,
    age INT DEFAULT NULL,
    stuID INT DEFAULT NULL
)
END

--插入数据
--INSERT INTO usertbl(name,age)VALUES(‘lee‘,28)
--INSERT INTO usertbl(name,age)VALUES(‘kite‘,32)
--INSERT INTO stutbl(name,age,stuID)VALUES(‘lee‘,28,07110511)
--INSERT INTO stutbl(name,age,stuID)VALUES(‘tom‘,19,07110512)


--判断存储过程是否存在
if exists (
    select * 
    from dbo.sysobjects 
    where id = object_id(N[listUser]) 
    and OBJECTPROPERTY(id, NIsProcedure) = 1
)
DROP PROCEDURE listUser
ELSE
--有输入参数的存储过程
create PROCEDURE listUser
@name VARCHAR(20)
AS
DECLARE @age INT
SET @age = 28
SELECT * 
FROM usertbl 
WHERE name=@name
AND age=@age

--执行存储过程
EXECUTE listUser @name = lee

--有输入输出参数的存储过程
CREATE PROCEDURE isListUser
@age INT,
@name VARCHAR(20),
@isRight INT OUTPUT
AS
if exists (
    select * 
    from dbo.sysobjects 
    where id = object_id(N[listUser]) 
    and OBJECTPROPERTY(id, NIsProcedure) = 1
)
SET @isRight = @age
ELSE
SET @isRight = 0

DECLARE @isRight INT
EXECUTE isListUser 28,lee,@isRight OUTPUT
SELECT @isRight

DROP PROCEDURE isListUser

--select 赋值
CREATE PROCEDURE getUser
AS
DECLARE @resultSet VARCHAR(20)
SET @resultSet = (
    SELECT name 
    FROM usertbl 
    WHERE age = 28
)
SELECT @resultSet

EXECUTE getUser

DROP PROCEDURE getUser


--查看表索引
EXECUTE sp_helpindex @objname=usertbl

--update 赋值
CREATE PROCEDURE testUpdate
AS
DECLARE @nage INT
DECLARE @nname VARCHAR(20)
UPDATE usertbl SET @nage = age WHERE id=1
SELECT @nname = name FROM usertbl where id=1
PRINT @nage
PRINT @nname

EXECUTE testUpdate


--while
DECLARE @a INT
SET @a = 1
WHILE @a<10
BEGIN
    SET @a = @a + 1
END
PRINT @a
END 

--if
IF (1+1=2)
BEGIN
    PRINT right
END 
ELSE
BEGIN
    PRINT wrong
END 

--when then
DECLARE @today INT
DECLARE @theWeek NVARCHAR
SET @today = 3
SET @theWeek = CASE
    WHEN @today = 1 THEN 星期一
    WHEN @today = 2 THEN 星期二
    WHEN @today = 3 THEN 星期三
    WHEN @today = 4 THEN 星期四
    WHEN @today = 5 THEN 星期五
    WHEN @today = 6 THEN 星期六
    WHEN @today = 7 THEN 星期日
END
PRINT @theWeek

--游标       类似将数据一条一条读取出来 形成类似栈的结构
DECLARE @name NVARCHAR(20)
DECLARE @age INT
DECLARE @resultSet NVARCHAR(20)
--定义一个游标
DECLARE myCursor CURSOR FOR 
SELECT name,age 
FROM usertbl 
WHERE id=1
--打开游标   指针指向第一条数据
OPEN myCursor
WHILE @@fetch_status=0
BEGIN
--读取游标  指针向前推进
    FETCH NEXT from usertbl INTO @name,@age
    SELECT @resultSet = name FROM usertbl WHERE name=@name
    PRINT @resultSet
END 
--关闭游标
CLOSE myCursor
--摧毁游标
DEALLOCATE myCursor

--return   procedure
CREATE PROCEDURE testReturn
@a INT,
@b INT
AS
BEGIN
    RETURN @a + @b
END 

DECLARE @c INT
EXECUTE  @c = testReturn 1,2
SELECT @c


--触发器
CREATE TRIGGER User_onUpdate
    ON usertbl
    FOR UPDATE
AS
    DECLARE @msg NVARCHAR(50)
    --@msg 记录修改情况
    SELECT @msg = N姓名从“ + Deleted.Name + N”修改为“ + Inserted.Name +  from Inserted,Deleted 
    PRINT @msg
    
--删除触发器 
DROP TRIGGER User_OnUpdate
--测试触发器
UPDATE usertbl SET name = biglee WHERE id = 1


--函数
--函数的分类:
--
--    1)标量值函数
--
--    2)表值函数
--
--        a:内联表值函数
--
--        b:多语句表值函数
--
--    3)系统函数


--标量值函数 
CREATE FUNCTION FUNC_sum
(
    @a INT,
    @b INT
)
RETURNS INT
AS
BEGIN
    RETURN @a + @b
END 
--调用标量值函数
DECLARE @r INT
SET @r = dbo.FUNC_sum(100,50)
PRINT @r

--内联表值函数
CREATE FUNCTION FUNC_usertbl
(
    @age INT
)
RETURNS TABLE
AS
RETURN (SELECT * FROM usertbl WHERE age<@age)
--删除函数
DROP FUNCTION FUNC_usertbl
--调用内敛表值函数
SELECT * FROM dbo.FUNC_usertbl(30)

--多语句表值函数(可以将查询的数据集放在局部临时表中)
CREATE FUNCTION FUNC_UserTbl2
(
    @myId INT
)
RETURNS @t TABLE
(
    id INT PRIMARY KEY,
    name NVARCHAR(20) DEFAULT NULL,
    age INT DEFAULT NULL
)
AS
BEGIN
    INSERT INTO @t SELECT * FROM usertbl WHERE id = @myId
    RETURN
END 

--调用多语句表值函数
SELECT * FROM dbo.FUNC_UserTbl2(1)




--一、自定义函数:
--
--  1. 可以返回表变量
--
--  2. 限制颇多,包括
--
--    不能使用output参数;
--
--    不能用临时表;
--
--    函数内部的操作不能影响到外部环境;
--
--    不能通过select返回结果集;
--
--    不能update,delete,数据库表;
--
--  3. 必须return 一个标量值或表变量
--
--  自定义函数一般用在复用度高,功能简单单一,争对性强的地方。
--
--二、存储过程
--
--  1. 不能返回表变量
--
--  2. 限制少,可以执行对数据库表的操作,可以返回数据集
--
--  3. 可以return一个标量值,也可以省略return
--
--   存储过程一般用在实现复杂的功能,数据操纵方面。

 

sql study