【问题标题】:tSQL: Return every table containing a specfic key valuet SQL:返回每个包含特定键值的表
【发布时间】:2015-01-24 07:36:52
【问题描述】:

标题几乎说明了一切。

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

我想将数据库中“好”记录的状态与“坏”记录的状态进行比较。

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

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

提前感谢您的帮助!

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

选择名称 来自 sys.tables where exists (select key-value> from table where key-value> = 'string')

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

【问题讨论】:

  • 所以你想找到所有的表,其中有一个名为 MyColumn 且值为 'myValue' 的列?
  • 正确,托尼。所有具有键值列并包含一组特定键值的表

标签: sql-server database tsql key-value


【解决方案1】:

@托尼霍普金森 我必须为 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

【讨论】:

    【解决方案2】:

    好的,这是使用游标、执行和打印的开始。注意未选中可能是一个错字,尤其是构建 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 的份上,不要在应用程序代码中做这样的事情......

    【讨论】:

    • 我收到错误:在此上下文中不允许使用名称“”。有效表达式是常量、常量表达式和(在某些情况下)变量。不允许使用列名。
    • 复制、粘贴和编辑失败,以前从未发生过。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 2021-07-18
    • 1970-01-01
    • 2022-07-23
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    相关资源
    最近更新 更多