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
标题几乎说明了一切。
我有一个大型数据库,正在尝试解决一些问题。
我想比较数据库中 '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