Sybase

搜尋 Sybase 數據庫中每個表中的每一列

  • January 30, 2021

我的任務是創建一個從我們的 Micros 銷售點系統中提取數據的應用程序。POS 使用在我們其中一台伺服器上執行的 Sybase 數據庫。數據庫模式非常複雜。我已經能夠找出大部分模式來訪問我需要的數據,但是,還有一些東西需要找到。我知道它們在實際 POS 中的名稱,但我似乎無法在數據庫中的任何地方找到它們(儘管我實際上並沒有查看所有 200 多個表)。

我想知道是否有任何方法可以執行查詢以在所有表​​的所有列中搜尋特定字元串。順便說一句,我正在使用 Sybase 數據庫客戶端軟體附帶的“Interactive SQL”應用程序連接到數據庫。

我最近被要求做類似的任務。這在 SybaseASE 中尤其不容易。

選項1 :

您可以編寫自定義工具以 BCP 輸出文件中的數據,然後 grep 這些文件以搜尋您要查找的特定文本。您也可以使用 PERL 正則表達式或使用本機 Unix/Linux 命令來解析這些文件並找到您想要查找的所需文本。

選項 2:

另一個對我有用的選項(使用 TSQL 不是那麼好——快速而骯髒的方式)。

注意:這將需要很長時間(緩慢且未優化),具體取決於您的數據庫大小、硬體、伺服器上執行的工作負載以及數據庫佈局。

測試,測試並在手前測試!

--- run below script and copy the output and run it in another query window.
set nocount on
declare @searchvalue varchar(255)
select @searchvalue = 'test string to search'---- replace this .. !!
print 'set nocount on'
print 'go'
print 'create table #results (table_name sysname, column_name sysname)'
print 'go"

select
  'insert #results select distinct '''
  + object_name(c.id)
  + ''' as table_name, '''
  + c.name
  + ''' as column_name from '
  + object_name(c.id)
  + ' where '
  + c.name
  + ' LIKE ''%'
  + @searchvalue
  + '%'''
  + char(10)
from
  syscolumns c, sysobjects o
where
  c.usertype in (
-- only look for char, varchar, text etc datatypes as we are not interested in int, datetime etc....
   1
   ,2
   ,18
   ,19
   ,24
   ,25
   ,42
   )
and o.type ='U' -- only user tables we are interested in
and c.id = o.id
and c.length>=datalength(@searchvalue )
--and object_name(c.id) = 'some table if you want to filter'

print 'select * from #results'
print 'go"
go

你可以做這樣的查詢:

Select o.name as table, c.name as column from syscolumns c, sysobjects o
Where c.id = o.id and
c.name like "stringImLookingFor"

第一個名稱是表名,第二個名稱是列名。如果您不知道要查找的確切名稱,可以使用 ‘%’ 作為萬用字元。

引用自:https://dba.stackexchange.com/questions/36295