Tìm kiếm Cơ sở dữ liệu Microsoft SQL Server cho Dữ liệu được Lưu trữ
Bạn đã bao giờ phải giải mã cơ sở dữ liệu và xác định cột nào có dữ liệu bạn cần chưa?
Gần đây tôi đã phải làm việc với việc trích xuất dữ liệu từ cơ sở dữ liệu SQL để sử dụng trong Microsoft Access và Power BI, tiếc là cấu trúc đặt tên của cơ sở dữ liệu này không trực quan lắm.
Hướng dẫn duy nhất mà tôi có là một báo cáo hiển thị ví dụ về dữ liệu cần được trích xuất, với các nhãn không có tham chiếu đến tên cột. Điều này có nghĩa là hàng giờ làm việc tìm kiếm cơ sở dữ liệu và xem xét từng bảng, cơ sở dữ liệu cụ thể này có 288 bảng.
Trước đây, tôi đã sử dụng mã để tìm kiếm một cột trong bảng, nhưng trong trường hợp này, điều đó không giúp được gì cho tôi.
May mắn thay, tôi đã xem qua một bài viết rất thú vị https://stackoverflow.com/questions/15757263/find-a-string-by-searching-all-tables-in-sql-server-management-studio-2008, điều này thật hoàn hảo cho nhu cầu của tôi. Tôi chỉ cần đặt biến với văn bản mà tôi đang tìm kiếm và chạy mã. Trong vài giây, tôi đã được cung cấp danh sách các bảng và cột nơi văn bản xuất hiện. Chẳng bao lâu, tôi đã có một danh sách các bảng và cột mà tôi cần đưa vào dự án của mình.
Xin lưu ý rằng giải pháp này chỉ áp dụng cho các bảng SQL Server và được chạy trong SQL Server Management Studio. Bạn cũng cần có phiên bản SQL Server hỗ trợ các biến bảng.
USE DATABASE_NAME DECLARE @SearchStr nvarchar(100) = 'SEARCH_TEXT' DECLARE @Results TABLE (ColumnName nvarchar(370), ColumnValue nvarchar(3630)) SET NOCOUNT ON DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110) SET @TableName = '' SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''') WHILE @TableName IS NOT NULL BEGIN SET @ColumnName = '' SET @TableName = ( SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName AND OBJECTPROPERTY( OBJECT_ID( QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) ), 'IsMSShipped' ) = 0 ) WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL) BEGIN SET @ColumnName = ( SELECT MIN(QUOTENAME(COLUMN_NAME)) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = PARSENAME(@TableName, 2) AND TABLE_NAME = PARSENAME(@TableName, 1) AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar', 'int', 'decimal') AND QUOTENAME(COLUMN_NAME) > @ColumnName ) IF @ColumnName IS NOT NULL BEGIN INSERT INTO @Results EXEC ( 'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) FROM ' + @TableName + ' (NOLOCK) ' + ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2 ) END END END SELECT ColumnName, ColumnValue FROM @Results
Tôi hy vọng điều này cũng giúp bạn!