2014-06-26 36 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