[SQLSERVER] Hướng dẫn viết procedure tìm chuỗi trong tất cả các cột của table
Bài viết hôm nay, mình sẽ tiếp tục chia sẽ cho các bạn một procedure tìm kiếm chuỗi trong tất cả các cột của một table trong sqlserver. Ví dụ: Các bạn có một bảng table tbl_sinhvien(masv, tensv, diachi, ngaysinh, noisinh, tuoi). Bây giờ, nếu ...
Bài viết hôm nay, mình sẽ tiếp tục chia sẽ cho các bạn một procedure tìm kiếm chuỗi trong tất cả các cột của một table trong sqlserver.
Ví dụ: Các bạn có một bảng table tbl_sinhvien(masv, tensv, diachi, ngaysinh, noisinh, tuoi).
Bây giờ, nếu các bạn muốn tìm chuỗi "lap trinh" trong bảng tbl_sinhvien.
Các bạn sẽ thực hiện câu lệnh sql sau:
SELECT * FROM tbl_sinhvien WHERE masv like '%lap trinh%' or tensv like '%lap trinh%' or diachi like '%lap trinh%' or ngaysinh like '%lap trinh%' or noisinh like '%lap trinh%' or tuoi like '%lap trinh%'
Cách 1: Sử dụng Cursor
USE master GO CREATE PROCEDURE dbo.sp_FindStringInTable @stringToFind VARCHAR(100), @schema sysname, @table sysname AS DECLARE @sqlCommand VARCHAR(8000) DECLARE @where VARCHAR(8000) DECLARE @columnName sysname DECLARE @cursor VARCHAR(8000) BEGIN TRY SET @sqlCommand = 'SELECT * FROM [' + @schema + '].[' + @table + '] WHERE' SET @where = ' SET @cursor = 'DECLARE col_cursor CURSOR FOR SELECT COLUMN_NAME FROM ' + DB_NAME() + '.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = ' + @schema + ' AND TABLE_NAME = ' + @table + ' AND DATA_TYPE IN ('char','nchar','ntext','nvarchar','text','varchar')' EXEC (@cursor) OPEN col_cursor FETCH NEXT FROM col_cursor INTO @columnName WHILE @@FETCH_STATUS = 0 BEGIN IF @where <> ' SET @where = @where + ' OR' SET @where = @where + ' [' + @columnName + '] LIKE ' + @stringToFind + ' FETCH NEXT FROM col_cursor INTO @columnName END CLOSE col_cursor DEALLOCATE col_cursor SET @sqlCommand = @sqlCommand + @where PRINT @sqlCommand EXEC (@sqlCommand) END TRY BEGIN CATCH PRINT 'There was an error. Check to make sure object exists.' PRINT error_message() IF CURSOR_STATUS('variable', 'col_cursor') <> -3 BEGIN CLOSE col_cursor DEALLOCATE col_cursor END END CATCH
Cách 2: không sử dụng cursor
USE master GO CREATE PROCEDURE dbo.sp_FindStringInTable @stringToFind VARCHAR(100), @schema sysname, @table sysname AS BEGIN TRY DECLARE @sqlCommand varchar(max) = 'SELECT * FROM [' + @schema + '].[' + @table + '] WHERE ' SELECT @sqlCommand = @sqlCommand + '[' + COLUMN_NAME + '] LIKE ' + @stringToFind + ' OR ' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @schema AND TABLE_NAME = @table AND DATA_TYPE IN ('char','nchar','ntext','nvarchar','text','varchar') SET @sqlCommand = left(@sqlCommand,len(@sqlCommand)-3) EXEC (@sqlCommand) PRINT @sqlCommand END TRY BEGIN CATCH PRINT 'There was an error. Check to make sure object exists.' PRINT error_message() END CATCH
* Bây giờ, mình sẽ thực hiện câu lệnh ví dụ như sau:
USE AdventureWorks GO EXEC sp_FindStringInTable '%land%', 'Person', 'Address'
==> Kết quả trả về
HAVE FUN :)