Sql server SQL Server查询以显示所有用户表中的表名、特定列名和当前值

Sql server SQL Server查询以显示所有用户表中的表名、特定列名和当前值,sql-server,Sql Server,我们所有的用户表都有一个主键和一个rowid\u time列。我们希望开发一个SQL查询,其中列出: 表名 主键的值 rowid\u time列的值 (仅这三列,而不是表中的所有列) 用于数据库中的所有行和表 这可行吗?理想情况下,这是通过数据库视图交付的。使用动态SQL和 DECLARE @TableName sysname DECLARE @SQL nvarchar(max) DECLARE @PKColumnList nvarchar(max) DECLARE mycursor CU

我们所有的用户表都有一个主键和一个
rowid\u time
列。我们希望开发一个SQL查询,其中列出:

  • 表名
  • 主键的值
  • rowid\u time
    列的值
(仅这三列,而不是表中的所有列)

用于数据库中的所有行和表


这可行吗?理想情况下,这是通过数据库视图交付的。

使用动态SQL和

DECLARE @TableName sysname
DECLARE @SQL nvarchar(max)
DECLARE @PKColumnList nvarchar(max)

DECLARE mycursor CURSOR FAST_FORWARD
FOR
SELECT name FROM sys.tables order by Name 

OPEN mycursor

FETCH NEXT FROM mycursor INTO @TableName

WHILE @@FETCH_STATUS = 0
BEGIN
----------------
    SELECT @PKColumnList = string_agg(COLUMN_NAME, ',')
    FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE a
    WHERE
     EXISTS(
      SELECT *
      FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS b
      WHERE CONSTRAINT_TYPE = 'PRIMARY KEY'
       AND a.CONSTRAINT_NAME = b.CONSTRAINT_NAME) AND
     TABLE_NAME = @tablename

     SET @PKColumnList = concat(@PKColumnList+',','rowid_time')

    SELECT @SQL = '
;with t1 as (
    select ''' + @TableName + ''' as TableName
), t2 as (
    SELECT 
        ''' + @TableName + ''' as TableName, 
        COUNT(*) OVER (Partition By 1) as RowsCount, '
        + @PKColumnList +
'   FROM [' + @TableName + ']
)
select
    t1.TableName,
    t2.RowsCount, '
    + @PKColumnList + '
from t1
full join t2 
on t1.TableName = t2.TableName'

    EXEC SP_EXECUTESQL @SQL

-----------------
  FETCH NEXT FROM mycursor INTO @TableName
END

CLOSE mycursor
DEALLOCATE mycursor
EXEC sp_MSForEachTable 'SELECT ''?'' as TableName, ID, rowid_time FROM ?' 
如果所有表的PK列都是ID列(没有复合键,所有PK字段都被命名为所有表的ID),则可以按如下方式使用过程

DECLARE @TableName sysname
DECLARE @SQL nvarchar(max)
DECLARE @PKColumnList nvarchar(max)

DECLARE mycursor CURSOR FAST_FORWARD
FOR
SELECT name FROM sys.tables order by Name 

OPEN mycursor

FETCH NEXT FROM mycursor INTO @TableName

WHILE @@FETCH_STATUS = 0
BEGIN
----------------
    SELECT @PKColumnList = string_agg(COLUMN_NAME, ',')
    FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE a
    WHERE
     EXISTS(
      SELECT *
      FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS b
      WHERE CONSTRAINT_TYPE = 'PRIMARY KEY'
       AND a.CONSTRAINT_NAME = b.CONSTRAINT_NAME) AND
     TABLE_NAME = @tablename

     SET @PKColumnList = concat(@PKColumnList+',','rowid_time')

    SELECT @SQL = '
;with t1 as (
    select ''' + @TableName + ''' as TableName
), t2 as (
    SELECT 
        ''' + @TableName + ''' as TableName, 
        COUNT(*) OVER (Partition By 1) as RowsCount, '
        + @PKColumnList +
'   FROM [' + @TableName + ']
)
select
    t1.TableName,
    t2.RowsCount, '
    + @PKColumnList + '
from t1
full join t2 
on t1.TableName = t2.TableName'

    EXEC SP_EXECUTESQL @SQL

-----------------
  FETCH NEXT FROM mycursor INTO @TableName
END

CLOSE mycursor
DEALLOCATE mycursor
EXEC sp_MSForEachTable 'SELECT ''?'' as TableName, ID, rowid_time FROM ?' 
可能重复的