【问题标题】:SQL Server - find all tables in database with unique ID valueSQL Server - 查找数据库中具有唯一 ID 值的所有表
【发布时间】:2014-10-17 14:50:12
【问题描述】:

我想找出数据库(在 SQLServer 中)中所有具有特定值 'SAM' 的列 IDName 的表,例如 IDName='SAM'。所以我最初的方法是创建一个包含所有具有“IDName”列的表的表(因为并非数据库中的所有表都有这个列。然后我想通过每个表来查看哪些表与 IDName=' SAM' - 这就是我卡住的地方。我很确定也有更快的方法可以做到这一点,但我对数据库查询编码不太熟悉。任何事情都会有所帮助谢谢!

select * into tmp from
(
SELECT SO.NAME AS TableName, SC.NAME AS ColumnName
FROM dbo.sysobjects SO INNER JOIN dbo.syscolumns SC ON SO.id = SC.id 
WHERE sc.name = 'IDName'   and SO.type = 'U'
) tablelist

所以如果我去Select * from tmp,我会得到包含“IDName”列的表的列表。现在我必须遍历该列表中的每一个,看看他们是否有“IDName = 'Sam'”,如果他们确实将它添加到输出表中。最后,我想查看数据库中 IDName 为“Sam”的所有表的名称。

【问题讨论】:

  • 如果您乐于使用官方未记录的存储过程,您可以使用sp_MSforeachtable,它可以接受@whereand 参数,您可以在其中过滤到仅选定的表。
  • 哇,这是一个方便的小存储过程。直到。
  • 对不起,我不熟悉 SQL 查询,您将如何编写代码?
  • @civic.sir - 该链接将您带到另一个显示如何使用它的问题/答案。

标签: sql-server database


【解决方案1】:
DECLARE @sql AS varchar(max) = '';
DECLARE @ColumnName AS varchar(100) = 'IDName'
DECLARE @ResultQuery AS varchar(max) =  'SELECT ''@TableName'' AS TableName ' + 
                                        '       ,@ColumnName ' +
                                        'FROM @TableName ' +
                                        'WHERE @ColumnName = ''SAM''';
SET @ResultQuery = REPLACE(@ResultQuery, '@ColumnName', QUOTENAME(@ColumnName));

WITH AllTables AS (
    SELECT SCHEMA_NAME(Tables.schema_id) AS SchemaName
          ,Tables.name AS TableName
          ,Columns.name AS ColumnName
    FROM sys.tables AS Tables
        INNER JOIN sys.columns AS Columns 
            ON Tables.object_id = Columns.object_id
    WHERE Columns.name = @ColumnName
)
SELECT @sql = @sql + ' UNION ALL ' +
       REPLACE(@ResultQuery, '@TableName', QUOTENAME(TableName)) + CHAR(13)
FROM AllTables

SET @sql = STUFF(@sql, 1, LEN(' UNION ALL'), '');

--PRINT @sql;

SET @sql = 
'WITH AllTables AS ( ' +
   @sql + 
') ' +
'SELECT DISTINCT TableName ' +
'FROM AllTables ';

EXEC (@sql)

【讨论】:

  • 超级!这就是我一直在寻找的东西,非常感谢@adrianm!
  • 很好的答案,但是如果您有 dbo 以外的架构,它将失败,最好用以下代码更改替换行:REPLACE(@ResultQuery, '@TableName', QUOTENAME(SchemaName) + '.' + QUOTENAME(TableName)) + CHAR(13)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-13
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-24
相关资源
最近更新 更多