tSQL:Return 每个 table 包含一个特定的键值

tSQL: Return every table containing a specfic key value

标题几乎说明了一切。

我有一个大型数据库,正在尝试解决一些问题。

我想比较数据库中 'good' 记录的状态与 'bad' 记录的状态。

我能想到的最全面的方法是比较每个 table 中存在键值的每个记录的行。

只要一个查询告诉我包含每个记录键值的每个 table 就会很壮观。

提前感谢您的帮助!

PS 这就是我现在拥有的。

select 名字 来自 sys.tables 哪里存在(select <key-value> 来自 table 其中 <key-value> = '字符串')

它似乎有效,但如果有人不介意确保它确实返回我所期望的,那也很棒。

好的,现在开始使用游标、执行和打印。注意未检查可能是错字,尤其是构建 sql 以检查 table.

中的值
SET NOCOUNT ON;

Declare @table_name VarChar(255)
Declare @column_name VarChar(255)
Declare @column_value VarChar(255)

Select @column_name = 'MyColumnName'
Select @column_value = 'MyColumnValue'

DECLARE table_cursor CURSOR FOR 
SELECT t.name AS TableName
FROM sys.columns 
    JOIN sys.tables t ON c.object_id = t.object_id
WHERE c.name = @column_name

OPEN table_cursor

FETCH NEXT FROM table_cursor INTO @table_name

WHILE @@FETCH_STATUS = 0
BEGIN
  Exec('If Exists(Select 1 From ' + @table_name + 'Where ' + @column_name + '=''' + @column_value + ''' Print ' + @table_name)
  FETCH NEXT FROM vendor_cursor INTO @table_name, @vendor_name
END 
CLOSE table_cursor
DEALLOCATE table_cursor

游标和动态 sql 是处理这类事情的有用技术,但看在 Cthulhu 的份上,请不要在应用程序代码中做任何类似的事情...

@TonyHopkinson 我必须为 sys.columns 添加 'c' 别名,并将动态查询中的最后一个变量用单引号引起来。 此外,将 vendor_cursor 替换为 table_cursor 并删除变量 @vendor_name

经过这些修改后,效果非常好!谢谢,托尼!!

SET NOCOUNT ON;

Declare @table_name VarChar(255)
Declare @column_name VarChar(255)
Declare @column_value VarChar(255)

Select @column_name = 'MyColumnNam' 
Select @column_value = 'MyColumnVal'

DECLARE table_cursor CURSOR FOR 
SELECT t.name 
FROM sys.columns c
    JOIN sys.tables t ON c.object_id = t.object_id
WHERE c.name = @column_name 

OPEN table_cursor

FETCH NEXT FROM table_cursor INTO @table_name

WHILE @@FETCH_STATUS = 0
BEGIN
  Exec('If exists(Select 1 From ' + @table_name + ' t Where t.' + @column_name + '='''+ @column_value+ ''') Print '''+ @table_name+'''')
  FETCH NEXT FROM table_cursor INTO @table_name
END 
CLOSE table_cursor
DEALLOCATE table_cursor