Categories

  • Programming
  • Web application

Blog Archive

Stored Procedure in SQL Server

Stored Procedure គឺជាបណ្តុំនៃ SQL Statement ដែលធ្វើការងារពិសេសណាមួយ ហើយវាអាចធ្វើការ Request ទៅកាន់ Server ម្តងមួយ Block នៃ Statement តែម្តង ឬ ក៏អាចបង្កើតជាសំណុំការគណនាណាមួយដែលគោលការណ៍នៃក្រុមហ៊ុន ដែលប្រើនូវ T SQL ឬ Built-in Function របស់ SQL Server តែម្តង ។

1. បង្កើត Stored Procedure

ការបង្កើត Stored Procedure មានរូបមន្តដូចខាងក្រោម៖
Syntax:
 Create proc[edure] procedure_name @parameternamedatatype=[default]
 As 
  T-sql statement(s)
ឧទាហរណ៍ ៖ 
 Create Proc[edure] prostu
 As 
 Select * from tblstudent;
ការដំណើរការ Stored Procedure ដែលបានបង្កើតរួច
Execute:  Exec[ute] prostu;;

2. Parameter នៅក្នុង Stored Procedure

នៅក្នុងការបង្កើត Stored Procedure ជាទូទៅយើងការប្រើ Paremeter ដើម្បីធ្វើការទៅតាមការងារដែលយើងបង្កើត Procedure នោះ តែនៅក្នុង Pararmeter យើងក៏មានច្រើនប្រភេទសម្រាប់ធ្វើការទទួលតម្លៃដូចនេះយើងត្រូវកំណត់ Parameter ឱ្យបានច្បាស់នៅពេលបង្កើតនោះ។
ខាងក្រោមនេះជា Parameter ធម្មតានៅក្នុង Procedure តែប្រសិនបើយើងចង់កំណត់ Default ទៅឱ្យ Parameter  ឬ តម្លៃទទេរ
CREATE PROCEDURE GetTaskEvents @TaskName varchar(50), @ID int = NULL
AS
BEGIN
-- SP Logic
END;

នៅក្នុង Stored Procedure មាន Parameter ចំនួន ៣ ប្រភេទ គឺ ៖ Input, Output និង Optional 
CREATE PROCEDURE [Sales].[udpGetSalesByTerritory] 
                      @TerritoryID int, 
                      @SumTotalSubTotal money = 10000 OUTPUT, 
                      @SumTotalDue money OUTPUT 
AS 
SELECT
        @SumTotalSubTotal = SUM(SubTotal), 
        @SumTotalDue = SUM(TotalDue) 
FROM                   Sales.SalesOrderHeader 
WHERE          TerritoryID = @TerritoryID) AND 
                               (SubTotal > @SumTotalSubTotal)

បង្កើត Stored Procedure នៅក្នុង SQL Server
Create Proc [SP_Subject] @FacID int,@Years int,@Semester nvarchar(50),@AcademicYear nvarchar(50)
as
If @Semester='second session'
Select SubID,SubName from tblSubjects Where FacID=@FacID and Years=@Years and AcademicYear=@AcademicYear
Else
Select SubID,SubName from tblSubjects Where FacID=@FacID and Years=@Years and Semester in(@Semester) and AcademicYear=@AcademicYear

ហៅ Stored Procedure ប្រើជាមួយនឹង Class SQLCommand នៅក្នុង  VB.NET
 Dim cmd As New SqlCommand(“SP_Subject", con)
   con.Open()
   cmd.CommandType = CommandType.StoredProcedure
   cmd.Parameters.Add("@FacID", SqlDbType.Int).Value = cmbFaculty.SelectedValue
   cmd.Parameters.Add("@Years", SqlDbType.Int).Value =cmbYear.SelectedValue
   cmd.Parameters.Add("@Semester", SqlDbType.Int).Value = cmbSemester.SelectedValue
   cmd.Parameters.Add("@AcademicYear", SqlDbType.NVarChar, 50).Value = cmbAcademicYear.SelectedValue
   Dim dtSubject As New DataTable
   dtSubject.Load(cmd.ExecuteReader())
   con.Close()
   gvSubject.DataSource = dtSubject

ហៅ Stored Procedure ប្រើជាមួយនឹង Class SQLDataAdapter នៅក្នុង  VB.NET
 Dim da As New SqlDataAdapter(“SP_Subject", con)
 da.SelectCommand.CommandType=CommandType.StoredProcedure
 da.SelectCommand.Parameters.Add("@FacID", SqlDbType.Int).Value =      cmbFaculty.SelectedValue
  da.SelectCommand.Parameters.Add("@Years", SqlDbType.Int).Value =      cmbYear.SelectedValue
 da.SelectCommand.Parameters.Add("@Semester", SqlDbType.Int).Value =     cmbSemester.SelectedValue
  da.SelectCommand.Parameters.Add("@AcademicYear", SqlDbType.NVarChar, 50).Value =   cmbAcademicYear.SelectedValue
    Dim dtSubject As New DataTable
 Da.Fill(dtSubject)
    gvSubject.DataSource = dtSubject

ខាងក្រោមនេះជាការបង្កើត OUTPUT Parameter នៅក្នុង Procedure
ALTER Proc [dbo].[sp_output] @Name nvarchar(50),@ID nvarchar(50) OUTPUT
as
   SELECT @ID = names 
   FROM tblinfo Where Names=@Name
តើយើងត្រូវប្រើយ៉ាងមិចនៅក្នុងការសរសេរ Code នៅក្នុង VB.NET ឬ C#?
គឺយើងត្រូវកំណត់ Property Direction ទៅឱ្យ Parameter នោះស្មើនឹង ParameterDirection.Output

Dim cmd As New SqlCommand("sp_output", con)
            cmd.CommandType = CommandType.StoredProcedure
            cmd.Parameters.Add("@Name", SqlDbType.NVarChar, 50).Value = "sok"
            cmd.Parameters.Add("@ID", SqlDbType.NVarChar, 50)
            cmd.Parameters("@ID").Direction = ParameterDirection.Output
            con.Open()
            cmd.ExecuteReader()
            con.Close()
            MessageBox.Show(cmd.Parameters("@ID").Value)

ចូលបង្កើត Procedure ដែលធ្វើការ Insert Delete និង Update ទៅកាន់ Table student.
ឧទាហរណ៍ ៖
Insert ទិន្នន័យចូលទៅកាន់ Table info
Create Proc SP_InsertData 
  @Name nvarchar(50),@Phone nvarchar(50),@email nvarchar(255)
As
 Insert into tblinfo(Names,Phone,Email) Values(@Name,@Phone,@Email)
Delete ទិន្នន័យចេញពី Table info
    Create Proc SP_DeleteData @ID int
As
 Delete From tblinfo Where ID=@ID;

Update ទិន្នន័យចេញពី Table info
Create Proc SP_UpdateData @ID int,@name nvarchar(50),@phone nvarchar(50),@email nvarchar(255)
As
Update tblinfo SET Names=@name,Phone=@phone,Email=@Email
Where ID=@ID
 
លំហាត់
 ចូរធ្វើការបង្កើត Stored Procedure មួយដែលធ្វើការ Insert ទិន្នន័យចូលក្នុង Table Order និង Update ទិន្នន័យនៅក្នុង Table Stock_Out ។ 

Exercise

1. ចូរធ្វើការបង្កើត Sequence នៅក្នុង SQL Server ដែលមានទម្រង់ដូចខាងក្រោម៖ Pro001, Cus001, Stu001 ដែលបី Character ខាងមុខជាអក្សរហើយបីលេខខាងក្រោយ Auto Number 14070001, 14070002, 14070003, 14071001, 14071002, 14071003, 14072001 ធ្វើការបង្កើត Sequence ដែលកើតឡើងតាមថ្ងៃ និងឆ្នាំ Function ដែលត្រូវប្រើ - GetDate() សម្រាប់ទាញយកថ្ងៃ ខែ បច្ចុប្បន្ន - Year(GetDate()) សម្រាប់ទាញយកឆ្នាំបច្ចុប្បន្ន - Left(Expression,Count) សម្រាប់ចាប់យកផ្នែកណាមួយនៃ Expression ទៅតាមចំនួន Character នៅខាងឆ្វេង ។ 2. ចូរបង្កើត Procedure ដែលអាចធ្វើការ Insert, Update ទៅលើ Table ណាមួយ ដោយប្រើ SQLCommand និង SQLDataAdapter ព្រមទាំង OutPut Parameter ផងដែរ ។

T-SQL In SQL Server

1. Variable Declaration

អញ្ញាត្តិនៅក្នុង SQL Server ក៏មិនមានអីខុសពីភាសា Programming ផ្សេងៗដែរ គឺយើងត្រូវមាន Keyword ឬ Syntax សម្រាប់បង្កើត ។
Syntax: Declare @Var_Name [as] DataType=Value;
ឧទាហរណ៍
DECLARE @iVariable INT, @vVariable VARCHAR(100), @dDateTime DATETIME
SET @iVariable = 1
SET @vVariable = 'myvar'
SET @dDateTime = GETDATE()
SELECT @iVariable iVar, @vVariable vVar, @dDateTime dDT
GO
ឬ
DECLARE @iVariable INT = 1, @vVariable VARCHAR(100) = 'myvar', @dDateTime DATETIME = GETDATE()
SELECT @iVariable iVar, @vVariable vVar, @dDateTime dDT
GO

2. Operator នៅក្នុង SQL Server

 
Arithmetic Operator
+ បូក
- ដក
* គុណ
/ ចែក
% ចែកយកសំណល់
Assignment Operator (=)
DECLARE @MyCounter INT;
SET @MyCounter = 1; 

Comparison Operator 
 = ស្មើនឹង
 > ធំជាង
 < តូចជាង
 >= ធំជាងឬស្មើ
 <= តូចជាងឬស្មើ
 <> មិនស្មើនឹង
 != មិនស្មើនឹង (not ISO standard)
 !< មិនតូចជាង (not ISO Standard)
 !> មិនធំជាង (not ISO Standard)

Compound Operator
 += សម្រាប់បូកបន្ថែមនឹងខ្លួនឯង
 -= សម្រាប់ដកខ្លួនឯងនឹងតម្លៃផ្សេងទៀត
 *= សម្រាប់គុណបន្ថែមនឹងខ្លួនឯង
 /= សម្រាប់ខ្លួនឯងចែកនឹងតម្លៃផ្សេងទៀត
 %= សម្រាប់ខ្លួនឯងចែកយកសំណល់នឹងតម្លៃផ្សេងទៀត

Logical Operators
 AND សម្រាប់ភ្ជាប់លក្ខខណ្ឌពីរ ឬ ច្រើនបញ្ចូលគ្នា ។
 ANY ៖ ប្រសិនបើ subquery របស់អ្នកផ្តល់មកវិញនូវ Scalar Value, អ្នកប្រើ comparison operator ។
  SELECT e.ID,e.name FROM Employee e
  WHERE e.salary > ANY (SELECT average Salary FROM job)
 BETWEEN .. and ..  សម្រាប់កំណត់ចន្លោះតម្លៃណាមួយ ។
 IN សម្រាប់ប្រៀបធៀបតម្លៃច្រើនវាប្រហាក់ប្រហែលនឹង Or ដែរ ។
 LIKE  សម្រាប់ប្រៀបធៀបទិន្នន័យដែលមានលក្ខខណ្ឌស្រដៀងហើយវាអាស្រ័យទៅតាម Wild Cart Operator ។
 NOT សម្រាប់កំណត់ឱ្យវាផ្ទុយពីលក្ខខណ្ឌដែលយើងចង់ប្រៀបធៀប ។
 OR សម្រាប់ជម្រើសក្នុងការប្រៀបធៀប ។



3. Control Structure 3.1 If Statement ខាងក្រោមនេះជា Syntax របស់ IF Statement IF Boolean_expression { sql_statement | statement_block } [ ELSE { sql_statement | statement_block } ] ឧទាហរណ៍៖ Declare @Result float=67 If @Result>=50 Print 'Passed' Else Print 'Fail' 3.2 Case When គេប្រើ Case When សម្រាប់សិក្សាលក្ខខណ្ឌដែរតែវាអាចផ្តល់មកវិញនូវតម្លៃមួយក្នុងចំណោមតម្លៃជាច្រើនដែលយើងបានដាក់លក្ខខណ្ឌ ។ Syntax: - Simple CASE expression:  CASE input_expression      WHEN when_expression THEN result_expression [ ...n ]      [ ELSE else_result_expression ] END - Searched CASE expression: CASE      WHEN Boolean_expression THEN result_expression [ ...n ]      [ ELSE else_result_expression ] END ឧទាហរណ៍ ៖ ប្រើជាមួយ Select Statement SELECT ProductNumber, Name, "Price Range" = CASE WHEN ListPrice = 0 THEN 'Mfg item - not for resale' WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Under $250' WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000' ELSE 'Over $1000' END FROM Production.Product ORDER BY ProductNumber ; ប្រើជាមួយ Order By SELECT BusinessEntityID, SalariedFlag FROM Employee ORDER BY CASE SalariedFlag WHEN 1 THEN BusinessEntityID END DESC ,CASE WHEN SalariedFlag = 0 THEN BusinessEntityID END; 3.3 While Statement នៅក្នុង SQL Server គេប្រើ Loop ដើម្បីឱ្យសកម្មភាពមួយ ឬ Statement មួយធ្វើការដដែល ទៅតាមលក្ខខណ្ឌដែលយើងចង់បាន ។ Syntax: WHILE Boolean_expression       {sql_statement | statement_block | BREAK | CONTINUE} ឧទាហរណ៍ WHILE (SELECT AVG(ListPrice) FROM Production.Product) < $300 BEGIN UPDATE Production.Product SET ListPrice = ListPrice * 2 SELECT MAX(ListPrice) FROM Production.Product IF (SELECT MAX(ListPrice) FROM Production.Product) > $500 BREAK ELSE CONTINUE END PRINT 'Too much for the market to bear'; 4. Try … Catch យើងប្រើ Try Catch ដើម្បីធ្វើបង្ហាញការ Error ជា Message ឬ លេខនៃការ Error ហើយទប់ស្កាត់នូវការបង្ហាញនូវ Message ដែលមានភាពរញ៉េរញ៉ៃ ។ Try … Catch BEGIN TRY { sql_statement | statement_block } END TRY BEGIN CATCH [ { sql_statement | statement_block } ] END CATCH [ ; ] ERROR_NUMBER() Returns លេខដែលតំនាងឱ្យការ Error នោះ។ ERROR_SEVERITY() Returns The Severity. ERROR_STATE() Returns លេខដែលតំនាងឱ្យការ Error នោះ។ ERROR_PROCEDURE() Returns ឈ្មោះ Stored Procedure ឬ Trigger ពេលដែលមាន Error ។ ERROR_LINE() Returns ទីតាំងនៃ Line ដែលបណ្តាលឱ្យ Error នោះ។ ERROR_MESSAGE() Returns អត្ថន័យដែល Error នោះ ព្រមទាំងតម្លៃលេខនៃការ Error នោះដែរ ។ 5. Wait For ឧទាហរណ៍៖ ខាងក្រោមនេះជាឧទាហរណ៍ដែលកំណត់ឱ្យ Stored Procedure ធ្វើការនៅម៉ៅង ២២:២០ នាទី ។ USE msdb; EXECUTE sp_add_job @job_name = 'TestJob'; BEGIN WAITFOR TIME '22:20'; EXECUTE sp_update_job @job_name = 'TestJob', @new_name = 'UpdatedJob'; END; ខាងក្រោមនេះជាឧទាហរណ៍ដែលកំនត់ឱ្យ Stored Procedure ធ្វើការនៅ ២ ម៉ោងក្រោយ ។ BEGIN WAITFOR DELAY '02:00'; EXECUTE sp_helpdb; END; 6. Sequence Sequence ជាលក្ខណៈថ្មីមួយរបស់ SQL Server ដែលមាននាទីសម្រាប់ធ្វើការកំណត់នូវ Auto Number ណាមួយដែលអ្នកចង់បាន នៅក្នុង SQL server 2012 អ្នកអាចធ្វើការបង្កើត Sequence បាន តាមទម្រង់ដូចខាងក្រោម ៖ Syntax: CREATE SEQUENCE sequence_name START With -- ជាចំណុចចាប់ផ្តើមរបស់ Sequence INCREMENT by -- សម្រាប់កំណត់ចំនួននៃការកើន MINVALUE -- តម្លៃតូចបំផុតនៃ Sequence MAXVALUE -- តម្លៃធំបំផុតនៃ Sequence CYCLE -- សម្រាប់កំណត់ឱ្យវាត្រឡប់មកសារដើមវិញនៅពេលតម្លៃ នៃ Sequence កើនដល់ Maxvalue CACHE; ឧទាហរណ៍ ៖ ខាងក្រោមនេះជាបង្កើត Sequence ដែលមានឈ្មោះថា CountBy1 ដែលចាប់ផ្តើមពីលេខ 1 និង កើនឡើងម្តងមួយ ។ CREATE SEQUENCE CountBy1 START WITH 1 INCREMENT BY 1 ; ប្រសិនបើអ្នកចង់បង្ហាញព័ត៌មានរបស់ Sequence តាមរយៈ Query ដូចខាងក្រោម SELECT * FROM sys.sequences WHERE name = 'CountBy1‘
ប្រសិនបើអ្នកបង្កើត Sequence ដោយយក Default Value នោះអ្នកនឹងបាន ប្រសិនបើអ្នកបង្កើត Sequence ដោយយក Default Value នោះអ្នកនឹងបាន CREATE SEQUENCE Test.TestSequence ;
សម្រាប់ការហៅ Sequence ដែលយើងបានបង្កើតមកប្រើនៅក្នុង SQL Statement Alter Sequence CountBy1 Restart with 1 DECLARE @myvar1 bigint = NEXT VALUE FOR CountBy1 DECLARE @myvar2 bigint ; DECLARE @myvar3 bigint ; SET @myvar2 = NEXT VALUE FOR CountBy1 ; SELECT @myvar3 = NEXT VALUE FOR CountBy1 ; SELECT @myvar1 AS myvar1, @myvar2 AS myvar2, @myvar3 AS myvar3 ;
ការហៅ Sequence ប្រើនៅក្នុង Table និងបង្កើត Auto Number ជាមួយអក្សរនៅក្នុង SQL Server - បង្កើត Table មួយដែលមាន 2 Fields CREATE TABLE MyTable ( IDColumn nvarchar(25) PRIMARY KEY,name varchar(25) NOT NULL) ; - បង្កើត Seuqence មួយឈ្មោះ CounterSeq CREATE SEQUENCE CounterSeq AS int START WITH 1 INCREMENT BY 1 ; - ធ្វើការកែប្រែ Table ដែលបានបង្កើតខាងលើដោយបន្ថែម Auto Number ទៅលើ Fields IDColumn ។ ALTER TABLE MyTable ADD DEFAULT N'AdvWorks_' + CAST(NEXT VALUE FOR CounterSeq AS NVARCHAR(20)) FOR IDColumn; - ធ្វើការបញ្ចូលទិន្នន័យទៅក្នុង Table MyTable INSERT MyTable (name) VALUES ('Larry') ; - ទាញទិន្នន័យមកបង្ហាញ SELECT * FROM MyTable;
7. OFFSET និង FETCH សម្រាប់ទាញទិន្នន័យចេញពី Database និងបង្ហាញនៅលើ GridView ទៅតាម Current Page ។ OFFSET មាននាទីសម្រាប់កំណត់ចំណុចចាប់ផ្តើមនៃ Record ដែលយើងចង់បង្ហាញ ។ FECTH មាននាទីសម្រាប់កំណត់ចំនួន Records ដែលយើងត្រូវយកមកបង្ហាញ ។ Syntax: SELECT * FROM TableName ORDER BY ID OFFSET Start ROWS FETCH NEXT Count ROWS ONLY; ឧទារហណ៍ ៖ SELECT * FROM tblBodyCompares ORDER BY BodyID OFFSET 0 ROWS FETCH NEXT 15 ROWS ONLY; ខាងក្រោមនេះយើងធ្វើការបង្កើត Variable ចំនួនពីរសម្រាប់ បោះតម្លៃទៅឱ្យ OFFSET និង Fetch Next DECLARE @OffsetRows tinyint = 0, @FetchRows tinyint = 20; SELECT TransactionID, ProductID, TransactionDate, Quantity, ActualCost FROM TransactionHistory ORDER BY TransactionDate DESC OFFSET @OffsetRows ROWS FETCH NEXT @FetchRows ROWS ONLY; 8. ROW_NUMBER() សម្រាប់ធ្វើការ Order នៅលេខរៀងសារជាថ្មីដែល Order ទៅតាម Field ណាមួយ Select ROW_NUMBER() Over(Order by BodyID) as [No],* From tblBodyCompares
សម្រាប់ធ្វើការទាញទិន្នន័យចេញពី Database ទៅតាម Limit Row ដែល User បានកំណត់នៅក្នុងចន្លោះណាមួយ ។ SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY BodyID) AS sequencenumber, * FROM tblBodyCompares) AS TempTable WHERE sequencenumber > 0 and sequencenumber <= 10

- Copyright © Khmer Knowledge - Skyblue - Powered by Blogger - Designed by Johanes Djogan -