02/10/2018, 00:30

[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ề

find all string columns table sqlserver

HAVE FUN :)

Tags: store procedurestring
0