标题几乎说明了一切。
我有一个大型数据库&我正试图解决一些问题。
我想比较db中'good'记录的状态和'bad'记录的状态。
我能想到的最全面的方法是比较每个表中存在键值的每个记录的行。
只是一个查询,告诉我每个包含每个记录键值的表都会很壮观。
提前感谢您的帮助!
PS这就是我现在所拥有的。
选择名称 来自sys.tables 存在的地方(从表中选择< 键值>其中< 键值> ='字符串')
它似乎有效,但是如果有人不介意确保它确实回归了我期待的那样也会很棒。
答案 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来说,在应用程序代码中不要做这样的事情......