嗨,伙计们,我想知道你们能不能帮我一下。
我想找出数据库(在sqlserver中)中的所有表,这些表的列idname具有特定值'sam',如so 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”的表的所有名称。

最佳答案

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)

10-08 08:03