這幾天有業務部門需要使用一個SAP B1老系統 中的報表,但是由於此報表沒有加時間條件,導致一旦開始查詢 就會導致B1系統異常退出。由於報表對應的SQL 是存在資料庫中,所以想通過查找到這個報表的SQL,然後給SQL加時間條件的方式來處理(多年前的一個報表,不知道內部邏輯,很難重寫)。 但是苦於不清 ...
這幾天有業務部門需要使用一個SAP B1老系統 中的報表,但是由於此報表沒有加時間條件,導致一旦開始查詢 就會導致B1系統異常退出。由於報表對應的SQL 是存在資料庫中,所以想通過查找到這個報表的SQL,然後給SQL加時間條件的方式來處理(多年前的一個報表,不知道內部邏輯,很難重寫)。
但是苦於不清楚報表相關的表結構,不知道報表的存儲位置,但只知道報表的名稱 又陷入了不知道下一步該怎麼處理的窘境。於是又開始大膽猜想,是不是有什麼方法 可以根據數據的關鍵詞 查詢數據所在的表名呢?於是開始百度各種資料,證明 思路是可以行得通的,大致思路就是遍歷每一個表的每一個欄位 查詢此欄位是否包含關鍵詞 。最終查到這篇文章寫的方法 很不錯,和大家分享下,同時也感謝博主的分享。https://blog.csdn.net/zengcong2013/article/details/55264202
CREATE PROCEDURE [dbo].[SP_FindValueInDB] ( @value VARCHAR(1024) ) AS BEGIN SET NOCOUNT ON; DECLARE @sql VARCHAR(1024) DECLARE @table VARCHAR(64) DECLARE @column VARCHAR(64) CREATE TABLE #t ( tablename VARCHAR(64), columnname VARCHAR(64) ) DECLARE TABLES CURSOR FOR SELECT o.name, c.name FROM syscolumns c INNER JOIN sysobjects o ON c.id = o.id WHERE o.type = 'U' AND c.xtype IN (167, 175, 231, 239) ORDER BY o.name, c.name OPEN TABLES FETCH NEXT FROM TABLES INTO @table, @column WHILE @@FETCH_STATUS = 0 BEGIN SET @sql = 'IF EXISTS(SELECT NULL FROM [' + @table + '] ' SET @sql = @sql + 'WHERE RTRIM(LTRIM([' + @column + '])) LIKE ''%' + @value + '%'') ' SET @sql = @sql + 'INSERT INTO #t VALUES (''' + @table + ''', ''' SET @sql = @sql + @column + ''')' EXEC(@sql) FETCH NEXT FROM TABLES INTO @table, @column END CLOSE TABLES DEALLOCATE TABLES SELECT * FROM #t DROP TABLE #t End
只需要傳入一個想要查找的值,即可查詢出這個值所在的表和欄位名。
exec [SP_FindValueInDB] '倉庫轉儲申請單'
查詢出來的結果如下:
完美解決我的問題,再次感謝博主的分享 踏雪無痕