【问题标题】:Check all tables in db for value检查 db 中的所有表的值
【发布时间】:2014-06-26 11:38:55
【问题描述】:

我对四个 SQL Server 数据库具有只读访问权限。

在每个数据库中,大约一半的表都有一个名为 [DIM_1] 的列。

我对特定字符串值(例如“ABCD”)在这些列中出现的次数感兴趣。

我需要一种方法来返回一个看起来像这样的数据表

数据库名、表名、CountOfABCD

我最初尝试使用循环来执行此操作,但它非常糟糕,并且遇到了您不能使用变量作为表名的问题。

我想知道是否可以使用 sp_MSforeachtable 做任何事情,但我的数据库技能有点不足。

有人有什么建议吗?我找到了创建执行任务的存储过程的脚本(例如 http://vyaskn.tripod.com/search_all_columns_in_all_tables.htm ),但由于我的访问级别,我无法创建它们。他们还使用临时表,我也无法创建。

感谢您的任何想法。

谢谢,

汤姆

【问题讨论】:

  • 尝试full_text_search机制
  • 有实现.. 我知道的一个是 apache lucene
  • 你试过动态SQL吗?
  • 你能在 sys.columns 或 Information_schema.Columns 上执行 select 语句吗?

标签: sql sql-server


【解决方案1】:

正如你所说,你可以使用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='''+@CountOfABCD+'''
    IF @COUNT>0
    BEGIN
        PRINT PARSENAME("?",2)+''.'' + PARSENAME("?",1)+'' => ''+CONVERT(VARCHAR,@COUNT)+'' ROW(S)''
    END
'
EXEC sp_MSforeachtable @command1=@sql,@whereand='AND O.ID IN (SELECT OBJECT_ID FROM [SERVER].[DATABASE].SYS.COLUMNS C WHERE C.NAME=''DIM_1'')'

如果您能够创建表,您可以将Print 更改为Insert

另外,如果你想在多台服务器上运行它,只需创建几个副本并更改数据库和服务器。

我希望这至少会有所帮助。我在这里找到了这个答案https://stackoverflow.com/a/9680217/1692632

【讨论】:

  • 谢谢。我收到此消息:将 varchar 值 'ABCD' 转换为数据类型 smallint 时,Msg 245, Level 16, State 1, Line 3 Conversion failed。
  • 对不起,我想通了。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多