Tag Archive: sql server


Câu lệnh Set RowCount trong SQL Server

Hôm nay tôi chia sẻ chút kiến thức về câu lệnh Set RowCount trong SQL Server.

Ta xem câu lệnh sau:

1
2
3
4
5
6
USE AdventureWorks;
GO
SELECT count(*) AS Count
FROM Production.ProductInventory
WHERE Quantity < 300;
GO

Đó là 1 câu lệnh hoàn toàn đơn giản, kết quả của nó là:

1
2
3
4
5
Count
 -----------
 537
(1 row(s) affected)

Bây giờ, dùng câu lệnh RowCount để update số dòng theo điều kiện của câu select ở trên, ta thấy chỉ có 4 dòng bị tác động

1
2
3
4
5
6
SET ROWCOUNT 4;
UPDATE Production.ProductInventory
SET Quantity = 400
WHERE Quantity < 300;
GO
(4 row(s) affected)

Câu lệnh RowCount có tác dụng dừng xử lý cho các câu lệnh Insert, Select, Update theo số dòng chỉ định, như ví dụ ở trên ta yêu cầu chỉ update 4 dòng, mặc dù điều kiện Where trả về nhiều kết quả hơn.

1 vấn đề đặt ra là câu lệnh Set RowCount có gì khác so với câu lệnh Select top?

Câu trả lời là việc xử lý bị dừng ngay lập tức khi số dòng trả về bằng số dòng được định nghĩa trong RowCount. Còn câu lệnh Select top thì nó vẫn trả về toàn bộ số dòng bên trong SQL Server, rồi sau đó mới lấy top n record trả về.

Set RowCount vẫn được SQL Server 2012 hỗ trợ, tuy nhiên nó sẽ bị loại bỏ ở phiên bản tiếp theo của SQL Server.

Tham khảo: http://msdn.microsoft.com/en-us/library/ms188774.aspx

Quang Vinh
mai.quangvinh@sqlvn.com

Advertisements

Stored Procedure, View, Trigger là gì?

SQL Server cho phép bạn tạo ra 4 đối tượng bằng cách lập trình: Stored Procedure, View, Trigger, Function.

>> Xem thêm: Tôi đi học bằng lái xe ôtô 

SP là gì?

SP (Stored Procedure) là tên được đặt cho một nhóm các mệnh đề SQL được tạo ra và lưu trong server database.

SP cho phép truyền tham số, và có thể được gọi bởi nhiều Client qua mạng với các tham số khác nhau. Khi SP bị thay đổi, tất cả Client sẽ tự động nhận được bản mới, vì SP được lưu ở Server, chứ không phải Client.

Lợi ích của SP:

  • Giảm lưu lượng dữ liệu được truyền qua mạng và tăng hiệu năng (Performance). Client chỉ việc truyền tên SP và tham số (nếu có) thay vì gửi những câu SQL nhiều dòng dài ngoằng.
  • Có thể được sử dụng để đảm bảo tính toàn vẹn dữ liệu của Database.
  • Đối với những ứng dụng lớn kết nối với cơ sở dữ liệu, ta nên dùng SP, tôi liệt kê một vài lợi ích cụ thể như sau:
    • Dễ bảo trì, việc thay đổi SP hoàn toàn không ảnh hưởng đến người dùng cuối, trong suốt với họ.
    • Chuyên biệt công việc, ví dụ những Developer giỏi lập trình C# thì chuyên tâm lập trình C#, còn những Developer giỏi lập trình T-SQL thì chuyên viết SQL từ căn bản đến phức tạp.
    • Tăng khả năng bảo mật. Đối với những ứng dụng mà ta không muốn cho Developer biết thông tin về nghiệp vụ bên trong thì ta viết SP, Developer chỉ gọi SP sử dụng mà không biết ta xử lý gì bên trong.
    • Tái sử dụng Code. Đối với những đoạn Code thường xuyên được sử dụng thì SP rất hữu dụng.
  • VD: sp_spaceused, sp_renameddb…

View là gì?

View có thể được xem như một Table ảo mà dữ liệu của nó được lấy ra từ một câu truy vấn, có chứa cột và dữ liệu từ một hay nhiều Table khác nhau, hay từ những View khác nhau. Ðối với lập trình viên thì View không khác chi so với Table và có thể đặt ở vị trí của Table trong các câu lệnh SQL.

Ðặc điểm của View là ta có thể join dữ liệu từ nhiều Table và trả về một tập kết quả đơn. Ngoài ra ta có thể thao tác dữ liệu trước khi trả về cho user bằng cách dùng các lệnh SQL như where, case…

Lưu ý: View đơn giản là 1 Table ảo, nó không được lưu trữ lễn đĩa về mặt vật lý như Table thông thường.

Lợi ích của View.

  • Có khả năng tăng tính bảo mật. View giúp ta che giấu cấu trúc của câu truy vấn bên trong. Sau khi tạo xong View ta có thể Insert, Delete, Update như 1 Table bình thường.
  • Giảm độ phức tạp. Ví dụ như User chỉ muốn xem thông tin của một vài cột với một điều kiện nào đó, View cung cấp đúng dữ liệu họ muốn mà không có dữ liệu thừa.

Trigger là gì?

Trigger có thể hiểu đơn giản là một thủ tục SQL được thực thi ở phía Server khi có một sự kiện xảy ra như Insert, Delete, hay Update. Tuy nhiên khác với Stored Procedure, Trigger hoàn toàn không có tham số. Chúng ta không thể gọi thực hiện trực tiếp Trigger bằng lệnh EXECUTE như Stored Procedure hoặc bằng bất kỳ một lệnh nào khác, Thay vào đó trigger sẽ được thực hiện một cách tự động.

Trigger cũng có thể gọi thực thi Stored Procedure.

Trigger được lưu trữ và quản lý trong Server Database.

Trigger được dùng trong trường hợp ta muốn kiểm tra các ràng buộc toàn vẹn trong Database.

Function là gì?

Function có thể hiểu đơn giản là hàm trong ngôn ngữ lập trình để thực hiện một phép tính hay một xử lý nào đó

Tổng hợp các thủ thuật lập trình SQL server

1. Sử dụng hàm Isnull

Giá trị là null trong SQL đôi khi khiến kết quả tính toán của ta không thể thực hiện được. Để đảm bảo giá trị truy vấn hoặc truyền vào biến luôn có giá trị (Không phải null) bạn sử dụng hàm isnull như ví dụ:

DECLARE @count int
SELECT @count=isnull(Count(*),0) FROM TB_News tn WHERE tn.idNews=10

Ở ví dụ này nếu bảng TB_News của bạn không có idNews=10 thì sẽ trả về null nhưng nếu bạn sử dụng isnull thì biến @count của bạn sẽ là 0. Nếu không sử dụng isnull bạn thường phải làm như sau:

	
DECLARE @count int
ELECT @count =Count(*) FROM TB_News tn WHERE tn.idNews=10
IF @count IS NULL SET @count =0

Bạn có thể so sánh 2 cách và lựa chọn

 

2. Cập nhật số lần xem bài viết

Khi người dùng truy cập website của bạn và chọn một bài viết để đọc bạn muốn theo dõi số lượt bài viết đó được xem bao nhiêu lần thì trong bảng TB_News (lưu các bài viết của bạn) cần có thêm trường NumRead (int), Khi bài viết được xem bạn cần viết thủ tục như sau để vừa truy vấn vừa cập nhật số lần xem

CREATE PROCEDURE sTB_News_SelectByID
@idNews int
AS
BEGIN
	--Cập nhật số lần xem trước khi hiển thị
	DECLARE @numread int
	SELECT @numread=isnull(tn.NumRead,0) FROM TB_News tn WHERE tn.idNews=@idNews
	UPDATE TB_News SET NumRead = @numread+1 WHERE idNews=@idNews
	-- Truy vấn hiển thị
	SELECT tn.idNews, tn.CateID, tn.LanguageCode, tn.UserName, tn.Title,
	       tn.Description, tn.Content, tn.Keyword, tn.Author, tn.CreateDate,tn.NumRead,
	       tn.Status
	  FROM TB_News tn WHERE tn.idNews=@idNews
END

Chú ý là các trường và tên bảng trong CSDL của bạn sẽ khác, Và ở ví dụ này mình sẽ cập nhật số lần xem trước khi truy vấn dữ liệu

3. Hàm Trim trong SQL

Trong SQL không có hàm trim nhưng lại có các hàm RTRIM và LTRIM vậy ta có thể kết hợp hai hàm này để có hàm Trim

Create Function fTrim
(
	@str nvarchar(500)
)
Returns nvarchar(500)
As
BEGIN
	Return RTRIM(LTRIM(@str))
End