sql study
阿新 • • 發佈:2017-06-15
value 刪除 class create right 輸入 prop then --
-- ============================================= -- 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, N‘IsProcedure‘) = 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, N‘IsProcedure‘) = 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