Hướng Dẫn Lập Trình SQL Server Transact-SQL - Openplanning
- Tất cả tài liệu
- Java
- Java Basic
- Java Collections Framework
- Java IO
- Java New IO
- Java Date Time
- Servlet/JSP
- Eclipse Tech
- SWT
- RCP
- RAP
- Eclipse Plugin Tools
- XML & HTML
- Java Opensource
- Java Application Servers
- Maven
- Gradle
- Servlet/Jsp
- Thymeleaf
- Spring
- Spring Boot
- Spring Cloud
- Struts2
- Hibernate
- Java Web Service
- JavaFX
- SWT
- Oracle ADF
- Android
- iOS
- Python
- Swift
- C#
- C/C++
- Ruby
- Dart
- Batch
- Database
- Oracle
- MySQL
- SQL Server
- PostGres
- Other Database
- Oracle APEX
- Report
- Client
- ECMAScript / Javascript
- TypeScript
- NodeJS
- ReactJS
- Flutter
- AngularJS
- HTML
- CSS
- Bootstrap
- OS
- Ubuntu
- Solaris
- Mac OS
- VPS
- Git
- SAP
- Amazon AWS
- Khác
- Chưa phân loại
- Phần mềm & ứng dụng tiện ích
- VirtualBox
- VmWare
- Transact-SQL là gì
- Tổng quan về Transact-SQL
- Bắt đầu với SQL Server Management Studio
- Các lệnh Transact-SQL cơ bản
- Gán dữ liệu truy vấn được vào biến
- Các kiểu dữ liệu đặc biệt trong T-SQL
- Con trỏ (Cursor)
- Điều khiển ngoại lệ
- Hàm (Function)
- Thủ tục (Procedure)
- Xử lý giao dịch (Transaction)
- Trigger
1. Transact-SQL là gì
Transact-SQL (còn gọi là T-SQL) là một ngôn ngữ lập trình database hướng thủ tục độc quyền của Microsoft sử dụng trong SQL Server. Ngôn ngữ thủ tục được thiết kế để mở rộng khả năng của SQL trong khi có khả năng tích hợp tốt với SQL. Một số tính năng như các biến địa phương và xử lý chuỗi/dữ liệu được thêm vào. Các tính năng này làm cho ngôn ngữ Transact-SQL là Turing-complete (**). Chúng cũng được sử dụng để viết các thủ tục lưu trữ: Một đoạn code nằm trên máy chủ để quản lý các quy tắc kinh doanh phức tạp mà khó hoặc không thể làm nổi với các thao tác tập hợp thuần thúy (pure set-based operations).Một hệ thống Turing-Complete có nghĩa là một hệ thống trong đó một chương trình có thể được viết ra và sẽ tìm thấy câu trả lời (mặc dù không có sự bảo đảm về thời gian chạy hoặc bộ nhớ).
2. Tổng quan về Transact-SQL
T-SQL tổ chức theo từng khối lệnh, một khối lệnh có thể lồng bên trong một khối lệnh khác, một khối lệnh bắt đầu bởi BEGIN và kết thúc bởi END, bên trong khối lệnh có nhiều lệnh, và các lệnh ngăn cách nhau bởi dấu chấm phẩy.Cấu trúc khối lệnh:BEGIN -- Khai báo biến -- Các câu lệnh T-SQL END;3. Bắt đầu với SQL Server Management Studio
Trong tài liệu này tôi sẽ hướng dẫn bạn lập trình SQL Server, trên công cụ trực quan SQL Server Management Studio.Đây là hình ảnh SQL Server Management Studio trong khi bạn mới mở nó. Có một số database ví dụ có sẵn khi bạn cài đầy đủ SQLServer.Hoặc bạn có thể tạo learningsql, một cơ sở dữ liệu nhỏ được sử dụng trong một vài tài liệu hướng dẫn SQLServer trên o7planning.org.- Cơ sở dữ liệu SQL Server mẫu để học SQL
4. Các lệnh Transact-SQL cơ bản
Ở đây tôi giới thiệu tổng quan về các lệnh cơ bản của T-SQL. Bạn sẽ hiểu hơn về nó thông qua các ví dụ ở các phần tiếp theo.Câu Lệnh rẽ nhánh If-elsif-elseCú pháp:IF <điều kiện 1> Khối lệnh 1; [ELSE IF <điều kiện 2> Khối lệnh 2; ] .... [ELSE Khối lệnh n + 1; ]Ví dụ:Else_If_ExampleBEGIN -- Khai báo một biến DECLARE @v_Option integer; DECLARE @v_Action varchar(30); SET @v_Option = 2; IF @v_Option = 1 SET @v_Action = 'Run'; ELSE IF @v_Option = 2 BEGIN PRINT 'In block else if @v_Option = 2'; SET @v_Action = 'Backup'; END; ELSE IF @v_Option = 3 SET @v_Action = 'Stop'; ELSE SET @v_Action = 'Invalid'; -- Ghi ra log PRINT '@v_Action= ' + @v_Action; END;Kết quả chạy ví dụ:Vòng lặp WHILECú pháp:WHILE condition BEGIN -- ...statements... END;Trong vòng lặp WHILE bạn có thể sử dụng BREAK để thoát ra khỏi vòng lặp. Sử dụng lệnh CONTINUE để bỏ qua các dòng lệnh trong khối WHILE và ở bên dưới nó, để tiếp tục một vòng lặp mới.While_Example1BEGIN -- Khai báo 2 biến x và y. DECLARE @x integer = 0; DECLARE @y integer = 10; -- Bước DECLARE @step integer = 0; -- Trong khi @x < @y WHILE (@x < @y) BEGIN SET @step = @step + 1; -- Mỗi lần vòng lặp chạy giá trị của x tăng lên 1 SET @x = @x + 1; -- Mỗi lần vòng lặp chạy giá trị của y giảm đi 2 SET @y = @y - 2; PRINT 'Step =' + CAST(@step AS varchar(10)); PRINT '@x =' + CAST(@x AS varchar(10)) + ' / @y = ' + CAST(@y AS varchar(10)); END; -- Ghi ra log PRINT 'x,y = ' + CAST(@x AS varchar(10)) + ', ' + CAST(@y AS varchar(10)); END;Kết quả chạy ví dụ:BREAK là lệnh cho phép thoát ra khỏi vòng lặp, dưới đây là ví dụ:While_Example2BEGIN -- Khai báo 2 biến x và y. DECLARE @x integer = 0; DECLARE @y integer = 10; -- Bước DECLARE @step integer = 0; -- Trong khi @x < @y WHILE (@x < @y) BEGIN SET @step = @step + 1; -- Mỗi lần vòng lặp chạy giá trị của x tăng lên 1 SET @x = @x + 1; -- Mỗi lần vòng lặp chạy giá trị của y giảm đi 2 SET @y = @y - 2; PRINT 'Step =' + CAST(@step AS varchar(10)); PRINT '@x =' + CAST(@x AS varchar(10)) + ' / @y = ' + CAST(@y AS varchar(10)); -- Nếu @x > 2 thì thoát ra khỏi vòng lặp -- (Mặc dù điều kiện trong WHILE vẫn đúng). IF @x > 2 BREAK; END; -- Ghi ra log PRINT 'x,y = ' + CAST(@x AS varchar(10)) + ', ' + CAST(@y AS varchar(10)); END;Kết quả chạy ví dụ:Lệnh CONTINUE cho phép bỏ qua các câu lệnh bên dưới nó (vẫn trong vòng lặp) để tiếp tục vòng lặp mới.While_Example3BEGIN -- Khai báo 2 biến x và y. DECLARE @x integer = 0; DECLARE @y integer = 10; -- Bước DECLARE @step integer = 0; -- Trong khi @x < @y WHILE (@x < @y) BEGIN SET @step = @step + 1; -- Mỗi lần vòng lặp chạy giá trị của x tăng lên 1 SET @x = @x + 1; -- Mỗi lần vòng lặp chạy giá trị của y giảm đi 2 SET @y = @y - 2; -- Nếu @x < 3 thì bỏ qua các dòng lệnh bên dưới -- Tiếp tục vòng lặp mới. IF @x < 3 CONTINUE; -- Nếu @x < 3 các dòng lệnh bên dưới CONTINUE sẽ không được chạy. PRINT 'Step =' + CAST(@step AS varchar(10)); PRINT '@x =' + CAST(@x AS varchar(10)) + ' / @y = ' + CAST(@y AS varchar(10)); END; -- Ghi ra log PRINT 'x,y = ' + CAST(@x AS varchar(10)) + ', ' + CAST(@y AS varchar(10)); END;5. Gán dữ liệu truy vấn được vào biến
Các biến có thể được gán giá trị từ một câu truy vấn. Dưới đây là một ví dụ minh họa:Assign_Value_ExampleBEGIN -- Khai báo một biến @v_Emp_ID DECLARE @v_Emp_ID integer = 1; DECLARE @v_First_Name varchar(30); DECLARE @v_Last_Name varchar(30); DECLARE @v_Dept_ID integer; -- Gán giá trị cho các biến lấy từ câu lệnh Select. SELECT @v_First_Name = emp.First_Name, @v_Last_Name = emp.Last_Name, @v_Dept_Id = emp.Dept_Id FROM Employee Emp WHERE Emp.Emp_ID = @v_Emp_Id; -- In ra các giá trị: PRINT '@v_First_Name = ' + @v_First_Name; PRINT '@v_Last_Name = ' + @v_Last_Name; PRINT '@v_Dept_Id = ' + CAST(@v_Dept_ID AS varchar(15)); END;Kết quả chạy ví dụ:6. Các kiểu dữ liệu đặc biệt trong T-SQL
Kiểu dữ liệu TABLE (Dạng tường minh)T-SQL cho phép bạn khai báo một biến có kiểu dữ liệu TABLE.Cú pháp:-- Định nghĩa một biến có kiểu TABLE. -- Chú ý: Các giàng buộc cũng có thể tham gia vào khai báo biến kiểu TABLE (Xem trong ví dụ). Declare @v_variable_name TABLE ( Column1 DataType1, Column2 DataType2 );Ví dụ:-- Ví dụ khai báo một biến có kiểu TABLE. Declare @v_Table TABLE ( First_Name Varchar(30), Last_Name Varchar(30), Dept_ID Integer, Salary Float ); -- Các giàng buộc cũng có thể tham gia vào trong định nghĩa biến kiểu TABLE: -- Ví dụ: Declare @v_table TABLE ( Product_ID Integer IDENTITY(1,1) PRIMARY KEY, Product_Name DataType2 NOT NULL Default ('Unknown'), Price Money CHECK (Price < 10.0) );Ví dụ: Insert dữ liệu vào biến có kiểu TABLE.Insert Into @v_Table (First_Name, Last_Name, Dept_ID, Salary) Select Emp.First_Name, Emp.Last_Name, Emp.Dept_Id, 1000 From Employee Emp Where Emp.Emp_ID < 4;Bạn cũng có thể Update trên biến có kiểu TABLE:Update @v_Table Set Salary = Salary + 100 Where Dept_Id = 10;Delete trên biến có kiểu TABLE:Delete From @v_Table Where Dept_ID = 10;Query dữ liệu trên biến có kiểu TABLE:Select * from @v_Table Where Dept_ID = 10 Order by First_Name;Ví dụ:BEGIN DECLARE @v_Emp_ID integer = 1; -- Khai báo một biến kiểu TABLE. DECLARE @v_Table TABLE ( First_Name varchar(30), Last_Name varchar(30), Dept_Id integer, Salary float DEFAULT 1000 ); -- Sử dụng INSERT INTO để trèn dữ liệu vào @v_Table. INSERT INTO @v_Table (First_name, Last_Name, Dept_ID) SELECT emp.First_Name, emp.Last_Name, emp.Dept_Id FROM Employee Emp WHERE Emp.Emp_ID < 4; -- Update @v_Table UPDATE @v_Table SET Salary = Salary + 100 WHERE First_name = 'Susan'; -- Duyệt các giá trị trên @v_Table. SELECT * FROM @v_Table; END;Kết quả chạy ví dụ:Kiểu dữ liệu TABLE (Dạng không tường minh)T-SQL cho phép bạn khai báo một biến kiểu TABLE không tường minh. Tên biến bắt đầu bởi #.Table_ExampleBEGIN -- Sử dụng SELECT INTO để trèn dữ liệu vào #v_My_Table. SELECT emp.First_Name, emp.Last_Name, emp.Dept_Id, 1000 Salary INTO #v_My_Table FROM Employee Emp WHERE Emp.Emp_ID < 4; -- Update #v_My_Table UPDATE #v_My_Table SET Salary = Salary + 100 WHERE First_name = 'Susan'; -- Duyệt các giá trị trên #v_My_Table. SELECT * FROM #v_My_Table; END;Kết quả chạy ví dụ:7. Con trỏ (Cursor)
Con trỏ là gì?Cursor là kiểu biến có cấu trúc, cho phép bạn xử lý dữ liệu gồm nhiều dòng. Số dòng phụ thuộc vào câu lệnh truy vấn dữ liệu. Trong quá trình xử lý, bạn có thể thao tác với cursor thông qua từng dòng dữ liệu. Dòng dữ liệu này được định vị bởi một con trỏ. Với việc dịch chuyển con trỏ, bạn có thể truy cập tất cả các dòng dữ liệu.Khai báo con trỏCú pháp:-- ISO Syntax DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR FOR select_statement [ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ] [;] -- Transact-SQL Extended Syntax DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ] [ FORWARD_ONLY | SCROLL ] [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] [ TYPE_WARNING ] FOR select_statement [ FOR UPDATE [ OF column_name [ ,...n ] ] ] [;]Ví dụ với Con trỏCursor_ExampleUSE learningsql; BEGIN -- -- Khai báo biến: DECLARE @v_Emp_ID integer; DECLARE @v_First_Name varchar(50); DECLARE @v_Last_Name varchar(50); DECLARE @v_Count integer; -- Khai báo một con trỏ (CURSOR). DECLARE My_Cursor CURSOR FOR SELECT Emp.EMP_ID, Emp.FIRST_NAME, Emp.LAST_NAME FROM Employee Emp WHERE Emp.EMP_ID < 3; -- Mở Cursor OPEN My_Cursor; -- Di chuyển con trỏ từ đến dòng đầu tiên. -- Và gán các giá trị cột vào các biến. FETCH NEXT FROM My_Cursor INTO @v_Emp_ID, @v_First_Name, @v_Last_Name; -- Trong trường hợp còn bản ghi @@FETCH_STATUS = 0. WHILE @@FETCH_STATUS = 0 BEGIN PRINT 'First Name = '+ @v_First_Name+' / Last Name = '+ @v_Last_Name; -- Di chuyển đến bản ghi tiếp theo. -- Và gán các giá trị cột vào các biến. FETCH NEXT FROM My_Cursor INTO @v_Emp_ID, @v_First_Name, @v_Last_Name; END -- Đóng Cursor. CLOSE My_Cursor; DEALLOCATE My_Cursor; END;Kết quả chạy ví dụ:Ví dụ sử dụng Con trỏ (Khai báo dạng biến)Cursor_Example2USE learningsql; BEGIN -- -- Khai báo biến: DECLARE @v_Emp_ID integer; DECLARE @v_First_Name varchar(50); DECLARE @v_Last_Name varchar(50); -- Khai báo một biến kiểu con trỏ. DECLARE @My_Cursor CURSOR; -- Sét câu lệnh truy vấn cho con trỏ. Set @My_Cursor = CURSOR FOR SELECT Emp.EMP_ID, Emp.FIRST_NAME, Emp.LAST_NAME FROM Employee Emp WHERE Emp.EMP_ID < 3; -- Mở Cursor OPEN @My_Cursor; -- Di chuyển con trỏ đến dòng đầu tiên. -- Và gán các giá trị cột vào các biến. FETCH NEXT FROM @My_Cursor INTO @v_Emp_ID, @v_First_Name, @v_Last_Name; -- Trong trường hợp có bản ghi @@FETCH_STATUS = 0. WHILE @@FETCH_STATUS = 0 BEGIN PRINT 'First Name = '+ @v_First_Name+' / Last Name = '+ @v_Last_Name; -- Di chuyển đến bản ghi tiếp theo. -- Và gán các giá trị cột vào các biến. FETCH NEXT FROM @My_Cursor INTO @v_Emp_ID, @v_First_Name, @v_Last_Name; END -- Đóng Cursor. CLOSE @My_Cursor; DEALLOCATE @My_Cursor; END;Kết quả chạy ví dụ:8. Điều khiển ngoại lệ
Khi lập trình T-SQL có thể có những lỗi xuất hiện trong Code của bạn, chẳng hạn như lỗi chia cho 0. Hoặc lỗi khi bạn trèn một bản ghi trùng lặp khóa chính, ... Bạn cần phải xử lý các tình huống này.Hãy xem một ví dụ đơn giản, xử lý lỗi chia cho 0.TryCatch_ExampleUSE learningsql; BEGIN -- -- Khai báo biến: DECLARE @v_a float = 20; DECLARE @v_b float = 0; DECLARE @v_c float; DECLARE @v_Error_Number integer; -- Sử dụng BEGIN TRY .. END TRY để bẫy lỗi. -- Nếu lỗi xẩy ra trong khối này -- nó sẽ nhẩy vào khối BEGIN CATCH .. END CATCH. BEGIN TRY --- PRINT '@v_a = ' + CAST(@v_a AS varchar(15)); PRINT '@v_b = ' + CAST(@v_b AS varchar(15)); --Lỗi chia cho 0 xẩy ra tại đây. SET @v_c = @v_a / @v_b; -- Dòng bên dưới này sẽ không được chạy. -- Chương trình nhẩy vào khối BEGIN CATCH .. END CATCH PRINT '@v_c= ' + CAST(@v_c AS varchar(15)); END TRY -- BEGIN CATCH .. END CATCH phải được đặt ngay -- phía sau của khối BEGIN TRY .. END TRY. BEGIN CATCH -- Mã lỗi. SET @v_Error_Number = ERROR_NUMBER(); -- In ra mã lỗi: PRINT 'Error Number: ' + CAST(@v_Error_Number AS varchar(15)); -- Nguyên nhân lỗi: PRINT 'Error Message: ' + ERROR_MESSAGE(); -- Mức độ nghiêm trọng của lỗi: PRINT 'Error Severity: ' + CAST(ERROR_SEVERITY() AS varchar(15)); -- Mã trạng thái: PRINT 'Error State: ' + CAST(ERROR_STATE() AS varchar(15)); -- Dòng bị lỗi: PRINT 'Error Line: ' + CAST(ERROR_LINE() AS varchar(15)); -- Tên của thủ tục (hoặc function) hoặc trigger, có code gây ra lỗi này. PRINT 'Error Procedure: ' + ERROR_PROCEDURE(); END CATCH; END;Kết quả chạy ví dụ:Thông tin lỗi:Hàm | Mô tả |
ERROR_NUMBER() | Trả về mã lỗi. |
ERROR_MESSAGE() | Trả về văn bản đầy đủ của các thông báo lỗi. Các văn bản bao gồm các giá trị đã cung cấp cho các tham số, chẳng hạn như độ dài, tên đối tượng, hoặc thời gian. |
ERROR_SEVERITY() | Trả về mức độ nghiêm trọng của lỗi. |
ERROR_STATE() | Trả về trạng thái lỗi |
ERROR_LINE() | Trả về số vị trí dòng code gây lỗi. |
ERROR_PROCEDURE() | Trả về tên của stored procedure hoặc trigger nơi mà lỗi phát ra. |
9. Hàm (Function)
Giống như procedure (thủ tục), function (hàm ) là nhóm các lệnh T-SQL thực hiện chức năng nào đó. Khác với thủ tục, các hàm sẽ trả về một giá trị ngay tại lời gọi nó. Hàm cũng có thể được lưu giữ ngay trên database dưới dạng Store procedure.Cú pháp tạo function (Hàm).-- function_name: Tên hàm -- argument: Tên tham số -- mode: INPUT, OUTPUT, hoặc không cần viết. -- datatype: Kiểu dữ liệu của tham số CREATE FUNCTION <function_name> ( [ @argument1 datatype1 [mode1] , @argument2 datatype2 [mode2], ... ] ) RETURNS datatype AS BEGIN -- Khai báo biến sử dụng -- Code nội dung của hàm -- Trả về giá trị của hàm. END;Ví dụ:-- Một hàm có tham số: CREATE FUNCTION Sum_Ab(a Integer, b Integer) RETURNS Integer AS Begin return a + b; End; -- Một hàm không tham số: CREATE FUNCTION Get_Current_Datetime() RETURNS Date AS Begin return CURRENT_TIMESTAMP; End;Hủy Function (Drop function):-- Hủy Function DROP FUNCTION <function_name>; -- Ví dụ: DROP FUNCTION My_Function;Ví dụ tạo một hàm.Đây là một ví dụ tạo một function (hàm) đầu tiên của bạn với SQL Server:- Tạo một hàm (Function)
- Biên dịch hàm này
- Chạy hàm
- Script function as -> SELECT to -> New Query Editor Window
10. Thủ tục (Procedure)
Một nhóm các lệnh T-SQL thực hiện chức năng nào đó có thể được gom lại trong một thủ tục (procedure) nhằm làm tăng khả năng xử lý,khả năng sử dụng chung, tăng tính bảo mật và an toàn dữ liệu, tiện ích trong phát triển. Thủ tục có thể được lưu giữ ngay trong database như một đối tượng của database, sẵn sàng cho việc tái sử dụng. Thủ tục lúc này được gọi là Store procedure. Với các Store procedure, ngay khi lưu giữ Store procedure, chúng đã được biên dịch thành dạng p-code vì thế có thể nâng cao khả năng thực hiện.Thủ tục không trả về giá trị trực tiếp như hàm (function). Tuy nhiên nó có thể có 0 hoặc nhiều tham số đầu ra.Cú pháp tạo một thủ tục:-- procedure_name: Tên thủ tục -- argument: Tên tham số -- mode: Loại tham số: INPUT hoặc OUTPUT, mặc định là INPUT -- datatype: Kiểu dữ liệu của tham số -- Chú ý: Với thủ tục các tham số có thể đặt trong dấu () hoặc không cần thiết. CREATE PROCEDURE <procedure_name> [ argument1 datatype1 [mode1] , argument2 datatype2 [mode2] , ... ] AS BEGIN -- Khai báo biến sử dụng -- Nội dung của thủ tục. END; -- Hoặc: CREATE PROCEDURE <procedure_name> ( [ argument1 datatype1 [mode1] , argument2 datatype2 [mode2] , ... ] ) AS BEGIN -- Khai báo biến sử dụng -- Nội dung của thủ tục. END;Ví dụ:-- Ví dụ một thủ tục không tham số. CREATE Procedure Do_Something AS Begin -- Khai báo biến tại đây. Declare @v_a Integer; -- Làm gì đó tại đây. -- .... End; -- Ví dụ một thủ tục có tham số -- Có một tham số đầu vào và một tham số đầu ra. CREATE Procedure Do_Something (@p_Param1 Varchar(20), @v_Param2 Varchar(50) OUTPUT ) AS Begin -- Khai báo biến tại đây. Declare @v_a Integer; -- Làm gì đó tại đây. -- ... End;Hủy thủ tục (Drop procedure):-- Hủy một thủ tục: DROP PROCEDURE <Procedure_Name>Các bước thực hiện một thủ tục:Ví dụ tạo một thủ tục:Ở đây tôi tạo một thủ tục đơn giản, với tham số truyền vào là @p_Emp_ID và có 3 tham số đầu ra, @v_First_Name, @v_Last_Name, @v_Dep_ID.Get_Employee_Infos-- Huỷ procedure Get_Employee_Infos nếu nó đã tồn tại. -- (Để cho phép tạo lại) IF OBJECT_ID(N'dbo.Get_Employee_Infos', N'P') IS NOT NULL DROP PROCEDURE Get_Employee_Infos; GO -- Thủ tục truyền vào p_Emp_Id -- Và trả về v_First_Name, v_Last_Name, v_Dept_Id. CREATE PROCEDURE Get_Employee_Infos (@p_Emp_Id integer , @v_First_Name varchar(50) OUTPUT , @v_Last_Name varchar(50) OUTPUT , @v_Dept_Id integer OUTPUT) AS BEGIN -- Sử dụng lệnh Print để in ra một chuỗi (Dành cho lập trình viên). -- Sử dụng Cast để ép kiểu số Integer về dạng chuỗi (Varchar). -- Sử dụng toán tử + để nối hai chuỗi. PRINT 'Parameter @p_Emp_Id = ' + CAST(@p_Emp_ID AS varchar(15)); -- -- Query dữ liệu từ bảng và gán giá trị vào các biến. -- SELECT @v_First_Name = Emp.First_Name, @v_Last_Name = Emp.Last_Name, @v_Dept_Id = Emp.Dept_Id FROM Employee Emp WHERE Emp.Emp_Id = @p_Emp_Id; -- -- Log dành cho người lập trình -- PRINT 'Found Record!'; PRINT ' @v_First_Name= ' + @v_First_Name; PRINT ' @v_Last_Name= ' + @v_Last_Name; PRINT ' @v_Dept_Id= ' + CAST(@v_Dept_Id AS varchar(15)); END;Nhấn vào biểu tượng để biên dịch thủ tục.Thủ tục đã được tạo ra, bạn có thể nhìn thấy trên SQL Server Management Studio:Test thủ tụcTrong lập trình việc test một thủ tục và dò tìm lỗi là vấn đề rất quan trọng. Nhấn phải chuột vào thủ tục muốn test, chọn:- Script stored Procedure as -> EXECUTE to -> New Query Editor Window
11. Xử lý giao dịch (Transaction)
Tại sao cần xử lý giao dịch?Giao dịch (Transaction) là một khái niệm quan trọng trong SQL. Hãy xem một tình huống: Một giao dịch trong ngân hàng, người A chuyển cho người B một khoản tiền 100$, khi đó trong Database xẩy ra 2 thao tác:- Trừ tiền của người A đi 100$
- Cộng tiền vào cho người B 100$.
- Bắt đầu transaction:
- begin tran / begin transaction
- Hoàn tất transaction:
- commit/ commit tran / commit transaction
- Quay lui transaction (Rollback transaction):
- rollback / rollback tran / rollback transaction
- Đánh dấu một savepoint trong transaction: save transaction tên_của_savepoint
- Biến @@trancount: cho biết số transaction hiện đang thực hiện (chưa được kết thúc với rollback hay commit) trong connection hiện hành.
- Lệnh rollback tran + tên_của_savepoint có tác dụng quay lui (rollback) giao dịch đến vị trí đặt savepoint tương ứng (không có tác dụng kết thúc transaction), các khóa (locks) đã được thiết lập khi thực hiện các thao tác nằm trong phần bị rollback sẽ được mở ra (unlock).
- Khi khai báo transaction tường minh, phải đảm bảo rằng sau đó nó được rollback hoặc commit tường minh, nếu không, transaction sẽ tiếp tục tồn tại và chiếm giữ tài nguyên, ngăn trở sự thực hiện của các transaction khác.
- Lệnh rollback chỉ có tác dụng quay lui các giao dịch trên cơ sở dữ liệu (insert, delete, update). Các câu lệnh khác, chẳng hạn lệnh gán, sẽ không bị ảnh hưởng bởi lệnh rollback.
12. Trigger
Tài liệu về Trigger được tách riêng, bạn có thể xem hướng dẫn tại:- SQL Server Trigger
Các hướng dẫn về cơ sở dữ liệu SQL Server
- Cài đặt SQL Server Express 2008 trên Windows
- Cài đặt SQL Server Express 2012 trên Windows
- Cài đặt SQL Server Express 2014 trên Windows
- Cơ sở dữ liệu SQL Server mẫu để học SQL
- Hướng dẫn lập trình SQL Server Transact-SQL
- Hướng dẫn học SQL cho người mới bắt đầu với SQL Server
Các hướng dẫn về cơ sở dữ liệu SQL Server
- Cài đặt SQL Server Express 2008 trên Windows
- Cài đặt SQL Server Express 2012 trên Windows
- Cài đặt SQL Server Express 2014 trên Windows
- Cơ sở dữ liệu SQL Server mẫu để học SQL
- Hướng dẫn lập trình SQL Server Transact-SQL
- Hướng dẫn học SQL cho người mới bắt đầu với SQL Server
Các bài viết mới nhất
- Xử lý lỗi 404 trong Flutter GetX
- Ví dụ đăng nhập và đăng xuất với Flutter Getx
- Hướng dẫn và ví dụ Flutter NumberTextInputFormatter
- Hướng dẫn và ví dụ Flutter multi_dropdown
- Hướng dẫn và ví dụ Flutter flutter_form_builder
- Hướng dẫn và ví dụ Flutter GetX obs Obx
- Hướng dẫn và ví dụ Flutter GetX GetBuilder
- Từ khoá part và part of trong Dart
- Hướng dẫn và ví dụ Flutter InkWell
- Bài thực hành Flutter SharedPreferences
- Hướng dẫn và ví dụ Flutter Radio
- Hướng dẫn và ví dụ Flutter Slider
- Hướng dẫn và ví dụ Flutter SkeletonLoader
- Chỉ định cổng cố định cho Flutter Web trên Android Studio
- Hướng dẫn và ví dụ Flutter SharedPreferences
- Tạo Module trong Flutter
- Flutter upload ảnh sử dụng http và ImagePicker
- Bài thực hành Dart http CRUD
- Hướng dẫn và ví dụ Flutter image_picker
- Flutter GridView với SliverGridDelegate tuỳ biến
- Các hướng dẫn về cơ sở dữ liệu SQL Server
Từ khóa » T-sql Là Gì
-
Sự Khác Biệt Giữa SQL, PL/SQL Và T-SQL
-
Ngôn Ngữ Truy Vấn T-SQL
-
Transact-SQL (T-SQL) Là Gì? - Blog
-
T-SQL Là Gì ? Cú Pháp Của T-SQL được Sử Dụng Như Thế Nào ?
-
T-Sql Là Gì - Hướng Dẫn Lập Trình Sql Server Transact - Asiana
-
T-Sql Là Gì - Hướng Dẫn Lập Trình Sql Server Transact
-
Sự Khác Biệt Giữa SQL Và T-SQL - Sawakinome
-
Định Nghĩa Transact-SQL (T-SQL) Là Gì?
-
Transact-SQL (T-SQL) Là Gì? Đây Là Một Thuật Ngữ Kỹ Thuật Và Công ...
-
[PDF] NGÔN NGỮ T-SQL
-
Sự Khác Biệt Giữa SQL, PL/SQL Và T-SQL - Trùm Tin Tức
-
Sự Khác Biệt Giữa SQL, PL/SQL Và T-SQL ... - Sen Tây Hồ
-
T-Sql Là Gì - Hướng Dẫn Lập Trình Sql Server Transact - TTMN
-
T-Sql Là Gì - Sự Khác Biệt Giữa Sql Và Tsql Là Gì