2014-06-26 38 views
0

我對四個SQL Server數據庫擁有隻讀訪問權限。檢查數據庫中的所有表的值爲

在每個數據庫中,大約一半的表格都有一個名爲[DIM_1]的列。

我對每個列中出現特定字符串值(例如'ABCD')的次數感興趣。

我需要一種方式來返回,看起來數據表像

數據庫名,表名,CountOfABCD

我想最初的循環要做到這一點,但是這是非常可怕的,我遇到了這個問題你不能使用變量作爲表名。

我想知道是否有什麼我可以用sp_MSforeachtable做但我的數據庫技能有點短。

有沒有人有任何建議?我發現創建腳本來創建執行任務的存儲過程(例如http://vyaskn.tripod.com/search_all_columns_in_all_tables.htm),但由於我的訪問級別,我無法創建它們。他們也使用臨時表,我也不能創建。

任何想法感激地收到。

感謝,

湯姆

+0

嘗試full_text_search機制 –

+0

有一些實現..我知道的一個是apache lucene –

+0

您是否嘗試過使用動態SQL? – user1429899

回答

0

正如你所說,你可以使用sp_MSforeachtable,但在你的情況,我不知道你是否可以給結果表,因爲你不能創建任何。

在這裏,我會瀏覽所有請求列的表。

DECLARE @CountOfABCD AS VARCHAR(20) 
SET @CountOfABCD='ABCD' 

DECLARE @sql nvarchar(2000) 
SET @sql = ' 
    DECLARE @COUNT AS INT 
    SELECT @COUNT=COUNT(*) FROM [SERVER].[DATABASE].? WHERE DIM_1='''[email protected]+''' 
    IF @COUNT>0 
    BEGIN 
     PRINT PARSENAME("?",2)+''.'' + PARSENAME("?",1)+'' => ''+CONVERT(VARCHAR,@COUNT)+'' ROW(S)'' 
    END 
' 
EXEC sp_MSforeachtable @[email protected],@whereand='AND O.ID IN (SELECT OBJECT_ID FROM [SERVER].[DATABASE].SYS.COLUMNS C WHERE C.NAME=''DIM_1'')' 

如果您將能夠創建表,您可以更改PrintInsert

另外,如果你想在多臺服務器上運行這個,只需創建幾個副本並更改數據庫和服務器。

我希望這個幫助至少有一點。我在這裏找到了這個答案https://stackoverflow.com/a/9680217/1692632

+0

謝謝。我收到以下消息:消息245,級別16,狀態1,行3 將varchar值「ABCD」轉換爲數據類型smallint時轉換失敗。 – Cleland

+0

對不起,我已經想通了。謝謝你的幫助! – Cleland