1/- Khai báo biến cục bộ : Khai báo biến cục bộ là việc chỉ định cho hệ thống máy tính cấp phát một vùng nhớ bên trong bộ nhớ RAM random access memory của máy tính để chương trình có thể
Trang 1SQL Server 2000 : Biến cục bộ
Giống như ngôn ngữ lập trình khác, việc sử dụng các biến cục
bộ trong chương trình là điều tất yếu phải có bên trong các ứng dụng Nếu không có biến thì các ngôn ngữ lập trình sẽ trở nên không hiệu quả, Transaction-SQL cũng không loại trừ yếu tố này.
Biến trong chương trình dùng để lưu trữ các giá trị tạm thời trong quá trình tính toán các
xử lý bởi vì sau khi thoát khỏi chương trình hoặc tắt máy tính thì giá trị của các biến này
sẽ khôngc òn trong bộ nhớ nữa
Thông thường mỗi một biến dùng để lưu trữ duy nhất một loại dữ liệu Do đó khi một biến đã xác định để lưu trữ dữ liệu dạng ngày thì bạn không thể ép buộc biến lưu trữ các
dữ liệu dạng khác như là số hoặc chuỗi Mỗi biến cần phải có một tên biến rõ ràng và duy nhất trong một phạm vi để khi cần tham chiếu, bạn sẽ chỉ định đến tên của biến đó Trong Transaction-SQL có hai loại biến khác nhau : biến cục bộ và biến hệ thống
Khác với các ngôn ngữ lập trình, Microsoft SQL Server không có khái niệm về biến toàn cục
1/- Khai báo biến cục bộ :
Khai báo biến cục bộ là việc chỉ định cho hệ thống máy tính cấp phát một vùng nhớ bên trong bộ nhớ RAM (random access memory) của máy tính để chương trình có thể lưu trữ các giá trị tạm thời trong quá trình tính toán
Trong Transaction-SQL việc sử dụng biến cần phải được khai báo tường minh rõ ràng, có nghĩa là bắt buộc bạn cần phải khai báo biến cục bộ trước rồi sau đó mới được phép sử dụng Điều này sẽ giúp cho bạn hiểu rõ về việc khai báo và sử dụng các biến bên trong chương trình của mình
Để khai báo biến cục bộ trong Transaction-SQL, bạn sử dụng lệnh DECLARE với cú
pháp như sau :
Cú pháp :
Trong đó :
Trang 2• Tên biến : tên của biến được khai báo, tên biến luôn luôn bắt đầu bằng ký tự @ Thông
thường tên biến phải duy nhất trong một phạm vi hoạt động
• Kiểu dữ liệu : là các kiểu dữ liệu cơ bản của Microsoft SQL Server hoặc các kiểu dữ
liệu do người dùng định nghĩa, dùng để chỉ định loại dữ liệu mà biến sẽ lưu trữ Các kiểu
dữ liệu text, ntext hoặc image không được chấp nhận trong việc khai báo biến
Ví dụ :
Để khai báo các biến dùng để lưu trữ giá trị tổng số lượng đặt hàng, họ tên nhà cung cấp,
ngày xuất hàng, bạn sử dụng lệnh DECLARE như sau :
Khác với một vài ngôn ngữ lập trình, bạn không thể gán giá trị khởi tạo cho biến lúc khai báo chúng Do đó, hành động kế tiếp là gán giá trị cần lưu trữ vào bên trong biến
2/- Gán giá trị cho biến :
Để gán trị cần lưu trữ vào các biến, bạng sử dụng lệnh SET hoặc lệnh SELECT cùng với phép gán (=) Thông thường lệnh SET chỉ để gán các giá trị cụ thể hoặc các biểu thức
tính toán hoặc giá trị tính toán từ các biến khác
Ví dụ :
Để gán giá trị là ngày 25/03/2002 vào biến ngày xuất hàng đã được khai báo theo ví dụ
trên, bạn sử dụng lệnh SET như sau :
Lưu ý :
Đối với kiểu dữ liệu dạng ngày trong Microsoft SQL Server thông thường bạn sử dụng theo định dạng yyyy-mm-dd để gán giá trị vào biến hoặc vào trong cơ sở dữ liệu
Ngược lại với lệnh SET, lệnh SELECT dùng để gán các giá trị được lấy ra hoặc tính
toán từ dữ liệu của các cột bên trong các bảng dữ liệu Ngoài ra trong cùng một lệnh
SELECT cho phép cùng lúc đồng thời bạn có thể gán các giá trị khác nhau từ các cột dữ
liệu vào bên trong các biến khác nhau
Ví dụ :
Trang 3Để tính ra tồng số lượng đặt hàng mà dữ liệu của nó được lấy từ cột SLDAT (số lượng
đặt) trong bảng CTDONDH, bạn sử dụng lệnh SELECT như sau :
Ví dụ :
Để tính ra đồng thời giá trị số lượng đặt hàng thấp nhất và cao nhất, bạn chỉ cần sử dụng
duy nhất một lệnh SELECT như sau :
Cẩn thận khi sử dụng câu lệnh SELECT để gán giá trị cần lưu trữ vào các biến bởi vì trong trường hợp nếu câu lệnh SELECT trả về nhiều dòng dữ liệu thì chỉ có giá trị của
dòng dữ liệu sau cùng mới được lưu trữ vào biến Điều này làm cho bạn không hề biết bởi vì hệ thống sẽ không báo lỗi
Do đó muốn tránh những trường hợp này cách tốt nhất là bạn luôn đảm bảo dữ liệu của
mình chỉ trả về duy nhất một dòng trong câu lệnh SELECT, thông thường bạn có thể sử dụng mệnh đề WHERE để lọc dữ liệu theo đúng điều kiện mình cần hoặc kết hợp các
hàm thống kê MIN, MAX, SUM để giới hạn số dòng trả về
Ví dụ :
Để tính ra số lượng đặt hàng cao nhất của mặt hàng "Đầu DVD Hitachi 1 đĩa" có mã vật
tư là "DD01", bạn sử dụng lệnh SELECT như sau :
Hoặc
Trang 4Câu lệnh SELECT thứ hai kết hợp các mệnh đề ORDER BY DESC dùng để sắp xếp dữ liệu giảm dần theo cột số lượng đặt và sau đó kết hợp thêm mệnh đề TOP 1 để lấy ra thông tin của dòng đầu tiên Khi đó dữ liệu của lệnh SELECT sẽ trả về một dòng có giá
trị số lượng đặt hàng là lớn nhất
Mặc dù Microsoft SQL Server có cơ chế tự động chuyển đổi kiểu nhưng bạn không nên
sử dụng cách này Do vậy khi khai báo biến, bạn cần chỉ đúng kiểu dữ liệu mà biến sẽ lưu trữ
Ví dụ :
Biến @TongSoDH bên dưới có kiểu không hợp lệ, tuy nhiên hệ thống vẫn thực hiện bình thường không thông báo lỗi Biến @TongSoDH phải có kiểu là số nguyên INT
3/- Xem giá trị hiện hành của biến :
Sau khi đưa các giá trị cần lưu trữ vào bên trong các biến, bạn cũng có thể cần xem giá trị hiện hành mà biến đang lưu trữ là bao nhiêu Để làm điều này, bạn có thể sử dụng lệnh
PRINT để in nội dung mà biến hiện đang lưu trữ ra màn hình Cú pháp của lệnh PRINT
như sau :
Cú pháp :
Trong đó :
• Tên biến : tên của biến đã được khai báo trước đó mà bạn muốn xem giá trị hiện hành
đang lưu trữ Thôngt hường nếu kiểu dữ liệu của biến không phải là kiểu chuỗi (char
hoặc varchar) thì bạn nên sử dụng các hàm CAST hoặc hàm CONVERT để chuyển về
kiểu dữ liệu chuỗi tương ứng
• Biểu thức chuỗi : là một biểu thức chuỗi văn bản cần in ra Độ dài tối đa của chuỗi là
8.000 ký tự
Trang 5Ví dụ :
Để tính đồng thời giá trị số lượng đặt hàng thấp nhất và cao nhất, sau đó hiển thị kết quả
ra màn hình cho bạn biết, bạn sử dụng lệnh SELECT và PRINT như sau :
Trong ví dụ trên, sử dụng hàm CONVERT dùng để chuyển đổi kiểu dữ liệu của biến
@MaxSldat từ kiểu số nguyên (INT) sang kiểu chuỗi (VARCHAR) và toán tử (+) dùng
để nối các chuỗi lại với nhau trong câu lệnh PRINT thứ hai
4/- Phạm vi hoạt động của biến :
Trong Transaction-SQL phạm vi hoạt động của biến chỉ nằm bên trong một thủ tục nội tại (stored procedure) hoặc một lô (batch) chứa các câu lệnh mà biến đã được khai báo bên trong đó
Khái niệm về lô được xem như là một nhóm tập hợp của một hoặc nhiều câu lệnh Transaction-SQL sẽ được biênd ịch đồng thời cùng lúc tại Microsoft SQL Server và sau
đó hệ thống sẽ thực thi các câu lệnh này ngay sau khi đã biên dịch thành công Để chỉ
định một lô bạn sử dụng từ khóa GO Đây chỉ là từ khóa để chỉ định kết thúc một lô.
Ví dụ :
Bạn có một lô trong Transaction-SQL như sau :
Do các câu lệnh trong một lô sẽ được biên dịch tại Microsoft SQL Server vì thế khi có ít nhất một lệnh bên trong lô có lỗi về cú pháp lúc biên dịch thì sẽ không có câu lệnh nào được thực thi bên trong lô đó
Ví dụ :
Trang 6Như ví dụ ở trên nhưng nếu bạn có bổ sung thêm lệnh INSERT mà cú pháp lệnh này bị sai (thiếu từ khóa VALUES) thì các lệnh SELECT bên trong lô này sẽ không được thực hiện
Hệ thống sẽ xuất hiện thông báo lỗi :
Tuy nhiên đối với các lỗi khi thực hiện (run-time) bên trong một lô nếu trường hợp các lỗi vi phạm ràng buộc toàn vẹn dữ liệu thì hệ thống Microsoft SQL Server chỉ ngưng lại câu lệnh gây ra lỗi và thực hiện tiếp các lệnh kế tiếp bên trong lô
Ví dụ :
Vẫn tiếp ví dụ trên nhưng nếu bạn có bổ sung từ khóa VALUES trong lệnh INSERT thì
lần này mặc dù chỉ có mỗi lệnh INSERT vi phạm ràng buộc toàn vẹn (giả sử trùng khóa chính ở cột mã nhà cung cấp) nhưng các lệnh SELECT bên trong lô này vẫn được thực hiện bình thường
Ví dụ :
Khai báo một biến cục bộ kiểu ngày dùng để lưu ngày đặt hàng gần dây nhất dựa trên dữ liệu của bảng DONDH tại cột Ngaydh Sau cùng in giá trị đ1o ra màn hình
Trang 7Hệ thống sẽ hiển thị thông báo lỗi nếu bạn chèn thêm từ khóa GO ở giữa hai lệnh
SELECT và PRINT Bởi vì khi đó các lệnh này được chia ra làm hai lô và lô thứ hai sẽ không hiểu biến @Ngaydhgn đã được khai báo trong lô thứ nhất
Lưu ý :
Đối với các lệnh CREATE như là CREATE DEFAULT, CREATE PROCEDURE, CREATE RULE, CREATE TRIGGER, CREATE VIEW không được phép kết hợp với lệnh khác trong cùng một lô
SQL Server 2000 : Biến hệ thống
Không giống như các ngôn gnữ lập trình khác, Transaction-SQL không có khái niệm về biến toàn cục Thay vào đó hệ thống Microsoft SQL Server sẽ cung cấp cho người lập trình danh sách các biến hệ thống Các biến hệ thống bên trong Microsoft SQL Server luôn bắt đầu bằng hai chữ @@ và giá trị mà chúng đang lưu trữ là do hệ thống Microsoft SQL Server cung cấp, người lập trình không thể can thiệp trực tiếp để gán giá trị vào các biến hệ thống.
1/- Ý nghĩa sử dụng
Khi lập trình trong Transaction-SQL, bạn vẫn thường xuyên sử dụng giá trị của các biến
hệ thống để giúp kiểm tra kết quả thực hiện các lệnh trước đó Thật ra các biến hệ thống chính là các hàm đã được Microsoft SQL Server xây dựng bên trong và người lập trình chỉ việc tra cứu các giá trị hiện thời của nó để thực hiện các xử lý tiếp theo sau đó
Một vài biến hệ thống có giá trị thay đổi thường xuyên tùy thuộc vào các câu lệnh thực hiện trong Transaction-SQL, tuy nhiên bên cạnh đó cũng có một vài biến hệ thống có giá trị rất ít khi thay đổi
Trang 8Biến @ROWCOUNT trả về tổng số mẫu tin được thực hiện trong câu lệnh gần nhất Biến hệ thống này có giá trị thay đổi rất thường xuyên
Giá trị của biến hệ thống @ROWCOUNT ở lần thứ nhất sẽ trả về tổng số mẫu tin hiện đang có trong bảng NHACC, và giá trị của biến hệ thống @@ROWCOUNT ở lần thứ hai
sẽ trả về tổng số mẫu tin có các mã vật tư bắt đầu bằng chữ "TV" trong bảng VATTU
Ví dụ :
Biến @@VERSION trả về phiên bản, ngày của sản phẩm Microsoft SQL Server và loại CPU, hệ điều hành của máy chủ cài đặt Microsoft SQL Server Biến hệ thống này có giá trị rất ít thay đổi, giá trị của nó chỉ thay đổi khi nào bạn nâng cấp hệ thống Microsoft SQL Server
2/- Một số biến hệ thống thường dùng :
Ý nghĩa của một số biến hệ thống thường dùng trong Microsoft SQL Server :