Archive for the ‘Tip & Trick’ Category

 

Ghép Nối Nhiều Bản Ghi Vào Một Dòng

Ví dụ bạn có bảng:
ProductID CustomerName
---------- -------------
1          Tuấn
1          Minh
1          Linh
2          Ngọc
2          Hiền

Bạn muốn kết quả ra như sau:
ProductID CustomerName
---------- -------------
1          Tuấn, Minh, Linh
2          Ngọc, Hiền

Bạn có thể dùng câu lệnh này:

SELECT DISTINCT C2.ProductID, 
    SUBSTRING(
        (
            SELECT ','+C1.CustomerName  AS [TEXT()]
            FROM dbo.Customer C1
            WHERE C1.ProductID = C2.ProductID
            ORDER BY C1.ProductID
            FOR XML PATH ('')
        ), 2, 1000) CustomerList
FROM dbo.Customer C2

Trường hợp bạn không cần group by ProductID mà chỉ cần một danh sách khách hàng nối với nhau, bạn có thể dùng câu lệnh đơn giản hơn sau:

DECLARE @NAMES NVARCHAR(4000) 
SELECT @NAMES = COALESCE(@NAMES + ', ', '') + CustomerName 
FROM dbo.Customer
SELECT @NAMES
Posted on 18/12/2014 by Vũ Huy Tâm | Categories: SQL Server Programming, Tip & Trick

Thứ Tự Xử Lý Điều Kiện Ở Mệnh Đề WHERE

Theo bạn các điều kiện trong mệnh đề WHERE được xử lý theo thứ tự nào, từ phải sang trái hay từ trái sang phải? Thực tế là, chúng không phải luôn luôn được xử lý theo một thứ tự nhất định như các ngôn ngữ khác. Chúng được xử lý theo cách SQL Server đánh giá là đạt hiệu quả cao nhất với từng câu lệnh. Nếu bạn viết code các điều kiện của mệnh đề WHERE dựa trên giả định chúng được xử lý theo thứ tự nào đó, bạn sẽ gặp tình huống câu lệnh bị lỗi khi thứ tự xử lý bị đảo ngược (ví dụ khi lượng dữ liệu thay đổi và/hoặc có thêm index mới được tạo…).
Ta hãy thực hiện thí nghiệm sau: … đọc tiếp »

Posted on 31/10/2012 by Vũ Huy Tâm | Categories: SQL Server Programming, Tip & Trick

Tìm Xem File Thuộc Database Nào

Đôi khi bạn gặp phải tình huống, có rất nhiều file database (.mdf hoặc .ndf) trong ổ cứng mà không biết chúng thuộc về các database nào. Các file mà dựa vào tên có thể đoán được, như BanHang.mdf thì còn dễ dàng. Nhưng nếu bạn gặp toàn các file như F158.ndf, D9343A2.ndf… thì không dễ gì suy đoán được. Khi đó bạn có thể truy vấn view hệ thống sys.master_files. View hệ thống này được cài đặt sẵn vào từng database, nhưng trả về file của toàn bộ các database trong server:

SELECT DB_NAME(database_id) AS DatabaseName, name AS LogicalFileName, physical_name AS PhysicalFileName
FROM  SYS.master_files
Posted on 1/3/2012 by Vũ Huy Tâm | Categories: Database Administration, Tip & Trick

Xem Thông Tin File Backup

Khi có 1 file database file backup mà bạn muốn xem thông tin file đó chứa nội dung gì, backup của database nào, ngày giờ nào… bạn có thể dùng một số option của lệnh RESTORE mà không cần phải restore toàn bộ database.
1. FILELISTONLY: trả về thông tin các file bao gồm data file và log file của database.

RESTORE FILELISTONLY
FROM  DISK = N'D:\Backup\SomeDB.bak'

Thông thường nếu bạn tạo database mà không có thêm filegroup nào thì database chỉ gồm có 1 data file và 1 log file. Khi bạn tạo thêm filegroup và thêm file vào từng filegroup thì database sẽ xuất hiện thêm nhiều data file.
Các thông tin chính mà lệnh trên trả về bao gồm:
LogicalName: tên logic của file
PhysicalName: tên đầy đủ kèm theo đường dẫn của từng file
Type: loại file, D là Data, L là Log
FileGroupName: tên filegroup mà mỗi file thuộc vào
Size: kích thước của file tại thời điểm được backup

2. HEADERONLY

RESTORE HEADERONLY
FROM  DISK = N'D:\Backup\SomeDB.bak'

Lựa chọn này trả về thông tin ở trong phần header của file backup. Các thông tin chính bao gồm:
DatabaseName: tên của database được tạo từ file backup
BackupStartDate: thời điểm chạy backup
BackupTypeDescription: Kiểu backup (database, differential hay log backup)
ServerName: tên của server mà database được backup

Posted on 28/2/2012 by Vũ Huy Tâm | Categories: Database Administration, Tip & Trick

Tránh Dùng COUNT(DISTINCT)

Hàm COUNT(DISTINCT) rất hữu ích, tuy nhiên cũng khá tốn kém. Giống như COUNT(), nó lấy tất cả các phần tử, nhưng không dừng lại ở đó nó còn phải sắp xếp và đếm các phần tử không trùng lặp. Trong một số trường hợp bạn có thể tránh dùng hàm này mà vẫn đạt được mục đích. Ví dụ bạn cần tìm tất cả các khách hàng đã từng mua ít nhất hai loại sản phẩm khác nhau, câu lệnh dùng COUNT(DISTINCT) sẽ như thế này:

SELECT KhachHang_ID
FROM dbo.BanHang
GROUP BY KhachHang_ID
HAVING COUNT(DISTINCT SanPham_ID) > 1

Bạn có thể dùng cách khác, hiệu quả hơn, như sau:

SELECT KhachHang_ID
FROM dbo.BanHang
GROUP BY KhachHang_ID
HAVING MIN(SanPham_ID) < MAX(SanPham_ID)

Khi khách hàng mua hai loại sản phẩm khác nhau, SanPham_ID phải khác nhau, do đó MIN(SanPham_ID) phải khác với MAX(SanPham_ID). Và việc tìm ra MIN và MAX của SanPham_ID đơn giản hơn nhiều so với việc phải đếm tất cả các sản phẩm khác nhau.

Posted on 14/12/2011 by Vũ Huy Tâm | Categories: SQL Server Programming, Tip & Trick

Lấy Ngày Cuối Của Tháng

Để tìm ra ngày cuối cùng của tháng hiện tại, bạn chỉ việc lấy ngày đầu tiên của tháng sau rồi bớt đi 1 ngày:

SELECT DATEADD(d,-1, DATEADD(mm, DATEDIFF(mm, 0 ,GETDATE())+1, 0))

Giải thích:
- Lệnh DATEDIFF trong cùng tính số tháng tính từ thời điểm bắt đầu (01/01/1900) và tăng lên 1:

DATEDIFF(mm, 0 ,GETDATE())+1)

- Tới lệnh DATEADD cộng số tháng đó vào thời điểm 01/01/1900, sẽ được ngày đầu của tháng sau:

DATEADD(mm, DATEDIFF(mm, 0, GETDATE())+1,0))

- Và lệnh DATEADD ngoài cùng trừ thời điểm đó đi 1 ngày.

Posted on 7/12/2011 by Vũ Huy Tâm | Categories: SQL Server Programming, Tip & Trick

Tìm Xem Cột Nằm Trong Bảng Nào

Đôi khi bạn có một tên cột và muốn tìm xem cột đó nằm trong bảng hoặc những bảng nào. Trong Management studio bạn có thể mở rộng node “Tables” và mở rộng đến từng bảng/column để tìm, nhưng việc này hẳn không dễ chịu. Cách làm đơn giản hơn nhiều là truy vấn vào information schema view:

SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME = 'smthing'
 
--hoặc nếu không biết tên cột chính xác
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%smthing%'
Posted on 1/11/2011 by Vũ Huy Tâm | Categories: Database Administration, Tip & Trick

Tìm Thời Điểm SQL Server Start Gần Đây Nhất

Mỗi khi SQL Server khởi động, tempdb lại được tạo lập lại. Vì thế để biết SQL Server khởi động lần gần đây nhất là khi nào, bạn chỉ việc tìm thời điểm tạo lập của tempdb:

USE master
go
SELECT crdate
FROM SYSDATABASES 
WHERE name = 'tempdb'
Posted on 19/10/2011 by Vũ Huy Tâm | Categories: Database Administration, Tip & Trick