t SQL:返回包含特定键值的每个表

时间:2015-01-23 20:51:03

标签: sql-server database tsql key-value

标题几乎说明了一切。

我有一个大型数据库&我正试图解决一些问题。

我想比较db中'good'记录的状态和'bad'记录的状态。

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

只是一个查询,告诉我每个包含每个记录键值的表都会很壮观。

提前感谢您的帮助!

PS这就是我现在所拥有的。

选择名称 来自sys.tables 存在的地方(从中选择< 键值>其中< 键值> ='字符串')

它似乎有效,但是如果有人不介意确保它确实回归了我期待的那样也会很棒。

2 个答案:

答案 0 :(得分:1)

@TonyHopkinson 我不得不为sys.columns添加'c'别名,并使用单引号将最后一个变量包装在动态查询中。 另外,用table_cursor替换vendor_cursor并删除变量@vendor_name

经过这些编辑后,它就像一个魅力!谢谢,Tony !!

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

答案 1 :(得分:0)

好的,这是开始使用游标,exec和print。注意未检查可能是拼写错误,特别是构建sql以检查表中的值。

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来说,在应用程序代码中不要做这样的事情......