Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 基于sys.tables的子查询表_Sql Server_Tsql - Fatal编程技术网

Sql server 基于sys.tables的子查询表

Sql server 基于sys.tables的子查询表,sql-server,tsql,Sql Server,Tsql,我试图检索一个事实表中的所有主键,然后计算该事实表中按该id分组的记录数,但是到目前为止,我似乎只能得到所有主键及其可能的值。我想我需要做一些子查询 SELECT tab1.name AS [FactTable], col1.name AS [PrimaryKey] FROM sys.indexes ind1 INNER JOIN sys.tables tab1 ON tab1.object_id = ind1.object_id INNER JOIN sys.schemas sch1

我试图检索一个事实表中的所有主键,然后计算该事实表中按该id分组的记录数,但是到目前为止,我似乎只能得到所有主键及其可能的值。我想我需要做一些子查询

SELECT
tab1.name AS [FactTable],
col1.name AS [PrimaryKey]
FROM sys.indexes ind1
INNER JOIN sys.tables tab1
    ON tab1.object_id = ind1.object_id
INNER JOIN sys.schemas sch1
    ON tab1.schema_id = sch1.schema_id
INNER JOIN sys.columns col1
    ON col1.object_id = tab1.object_id AND col1.name like '%Id'     
WHERE tab1.name like 'Fact%' AND ind1.is_primary_key = 1
样本输出

primaryKey    countRecordsGroupedByPrimaryKey
2             4000
3             8343
4             203
1             4023

如果我理解正确的话,您希望根据某些标准计算某些表中的所有行。我不太清楚您为什么关心主键部分,因为根据定义,主键必须是唯一的,所以这仍然可以简化为不检查主键,而不管是什么

我确实删除了与sys.columns的连接,因为除非您只需要名为Fact%的表和名为%Id的列,否则为什么列的名称很重要

据我所知,这会让你非常接近

declare @SQL nvarchar(max) = ''

select @SQL = @SQL + 'select TableName = ''' + tab1.name + ''', NumRows = count(*)  from ' + QUOTENAME(sch1.name) + '.' + QUOTENAME(tab1.name) + ' UNION ALL '
FROM sys.indexes ind1
INNER JOIN sys.tables tab1
    ON tab1.object_id = ind1.object_id
INNER JOIN sys.schemas sch1
    ON tab1.schema_id = sch1.schema_id
--INNER JOIN sys.columns col1
--    ON col1.object_id = tab1.object_id AND col1.name like '%Id'     
WHERE tab1.name like 'Fact%' 
    AND ind1.is_primary_key = 1


select @SQL = LEFT(@SQL, LEN(@SQL) - 10) + ' ORDER BY TableName'
select @SQL --uncomment the exec line below once you are comfortable that the dynamic sql is what you want.

--exec sp_executesql @SQL

我想你可能想数一数事实表中使用的每个维度的数量。如果事实表引用了两个不同的维度,则需要两个不同的语句按该维度统计使用情况

对于下面的查询,请提供事实表名称和架构,它应该生成一个计数语句,将事实和dim连接起来,并按连接键进行分组。
-如果事实表有两个不同的FK关系,则会得到两个不同的语句。
-如果表使用复合主键,则两个键列都将包含在联接中

这是复杂的,我没有任何带有多个FK的表来测试它,所以请让我知道它是否符合您的要求

DECLARE @NameOfTableWithFKs sysname = 'your fact table name',
        @SchemaOfTableWithFKs sysname = 'dbo';

WITH JoinColumns
AS (SELECT  QUOTENAME(OBJECT_SCHEMA_NAME(parent.object_id)) + '.' + QUOTENAME(OBJECT_NAME(parent.object_id)) AS ParentTableName,
            QUOTENAME(OBJECT_SCHEMA_NAME(referenced.object_id)) + '.' + QUOTENAME(OBJECT_NAME(referenced.object_id)) AS ReferencedTableName,
            QUOTENAME(OBJECT_NAME(parent.object_id)) + '.' + QUOTENAME(parent.name) + ' = ' + QUOTENAME(OBJECT_NAME(referenced.object_id)) + '.'
            + QUOTENAME(referenced.name) AS JoinColumn,
            QUOTENAME(OBJECT_NAME(referenced.object_id)) + '.' + QUOTENAME(referenced.name) AS GroupingColumn
    FROM    sys.foreign_key_columns AS fkc
      INNER JOIN sys.columns AS parent
        ON parent.object_id = fkc.parent_object_id
           AND  parent.column_id = fkc.parent_column_id
      INNER JOIN sys.columns AS referenced
        ON referenced.object_id = fkc.referenced_object_id
           AND  referenced.column_id = fkc.referenced_column_id
    WHERE   OBJECT_NAME(parent.object_id) = @NameOfTableWithFKs
            AND OBJECT_SCHEMA_NAME(parent.object_id) = @SchemaOfTableWithFKs
   ),
     JoinTables
AS (SELECT  QUOTENAME(OBJECT_SCHEMA_NAME(tbl.object_id)) + '.' + QUOTENAME(OBJECT_NAME(tbl.object_id)) AS ParentTableName,
            QUOTENAME(OBJECT_SCHEMA_NAME(rtbl.object_id)) + '.' + QUOTENAME(OBJECT_NAME(rtbl.object_id)) AS ReferencedTableName
    FROM    sys.tables AS tbl
      INNER JOIN sys.foreign_keys AS cstr
        ON cstr.parent_object_id = tbl.object_id
      INNER JOIN sys.tables AS rtbl
        ON rtbl.object_id = cstr.referenced_object_id
    WHERE   OBJECT_NAME(tbl.object_id) = @NameOfTableWithFKs
            AND OBJECT_SCHEMA_NAME(tbl.object_id) = @SchemaOfTableWithFKs
   )
SELECT  'SELECT Count(*)' + ( SELECT    ', ' + JC.GroupingColumn
                              FROM  JoinColumns AS JC
                              WHERE JC.ParentTableName = jt.ParentTableName
                                    AND JC.ReferencedTableName = jt.ReferencedTableName
                              FOR XML PATH('')
                            ) + ' FROM ' + JT.ParentTableName + ' INNER JOIN ' + JT.ReferencedTableName + ' ON'
        + SUBSTRING(( SELECT    ' AND ' + JC.JoinColumn
                      FROM  JoinColumns AS JC
                      WHERE   JC.ParentTableName = JT.ParentTableName
                              AND JC.ReferencedTableName = JT.ReferencedTableName
                      FOR XML PATH('')
                    ), 5, 8000
                   ) + ' GROUP BY ' + SUBSTRING(( SELECT    ', ' + JC.GroupingColumn
                                                  FROM      JoinColumns AS JC
                                                  WHERE  JC.ParentTableName = JT.ParentTableName
                                                         AND JC.ReferencedTableName = JT.ReferencedTableName
                                                  FOR XML PATH('')
                                                ), 2, 8000
                                               )
FROM    JoinTables AS JT;

如果要计算表中的记录(即访问数据,而不是仅仅读取表结构),则必须使用动态sql。在这种情况下,您是否有任何示例或良好的链接,我不太熟悉sql server语法,如果您真正指的是事实表的PK,对PK分组的事实表记录进行计数将返回每一行,计数一次。PK在表中必须是唯一的。你能发布一个你期望看到的示例输出吗?您是否试图确定每个事实表引用了多少个维度?我已经用输出示例进行了更新