Sql 如何从表名查询中获取选择计数(x)

Sql 如何从表名查询中获取选择计数(x),sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个查询,返回一个表列表和这些表的计数 select * from error 由于 tablename | errorcnt ----------+--------- table1 | 5 table2 | 256 等等。 我需要做一个连接,这样我就可以从每个表中得到另一个计数,作为已更正的记录的例子 select count(fixed) from table1 所以我的新结果是 tablename | errorcnt | fixed ----

我有一个查询,返回一个表列表和这些表的计数

select *
from error
由于

tablename | errorcnt
----------+---------
table1    |        5
table2    |      256
等等。 我需要做一个连接,这样我就可以从每个表中得到另一个计数,作为已更正的记录的例子

select count(fixed)
from table1
所以我的新结果是

tablename | errorcnt | fixed
----------+----------+------
table1    |        5 |     3
table2    |      256 |   239
等等。 没有光标我怎么办?我猜是一个使用“tablename”的子查询。

您的评论:


这就是我如何填充我的errortable SELECT T.name TableName,i.Rows的方法 sys.tables T中的NumberOfRows在T.OBJECT\u ID上连接sys.sysindex I= I.ID,其中按I.Rows DESC,T.name以0,1顺序indid

这意味着您正在为堆(即没有索引或具有聚集索引)的表查找表及其各自的索引。我不知道为什么这会被归类为错误。我希望你只想寻找堆。i、 e.在indid=0的情况下。不管怎样,我认为修复的方法是返回表,例如,没有聚集索引的表,而现在有聚集索引。在这种情况下,我不理解模式,并且认为您已经问了一个问题

话虽如此,基于其他注释,您可以使用派生表并根据error.tablename的文本值进行连接,以防止使用游标

select 
   error.tablename
   ,error.errorcnt
   ,fixed = coalesce(t1.ct, t2.ct) --add in for each join. 
from 
    error
left join (select count(fixed) as ct from table1 where fixed = 'Y') as t1 on error.tablename = 'table1'
left join (select count(fixed) as ct from table2 where fixed = 'Y') as t2 on error.tablename = 'table2'
--continue the joins for all values in error.tablename

游标的代码更少,而且是动态的,但您需要一种没有游标的方法。

您可以使用临时表和while循环来避免游标

select 
   error.tablename
   ,error.errorcnt
   ,fixed = coalesce(t1.ct, t2.ct) --add in for each join. 
from 
    error
left join (select count(fixed) as ct from table1 where fixed = 'Y') as t1 on error.tablename = 'table1'
left join (select count(fixed) as ct from table2 where fixed = 'Y') as t2 on error.tablename = 'table2'
--continue the joins for all values in error.tablename
DECLARE
    @SQLQuery   NVARCHAR(100),
    @Tablename  VARCHAR(100)

CREATE TABLE
    #error
(
    tablename   VARCHAR(100),
    errorcnt    INT
)

CREATE TABLE
    #Table1
(
    fixed       INT
)

CREATE TABLE
    #Table2
(
    fixed       INT
)

CREATE TABLE
    #Temp_fixed
(
    fixed       INT
)

INSERT INTO
    #error
VALUES
(
    '#Table1',
    5
),
(
    '#Table2',
    256
)

INSERT INTO
    #Table1
VALUES
(
    3
)

INSERT INTO
    #Table2
VALUES
(
    239
)

SELECT
    tablename,
    errorcnt,
    -1 AS fixed
INTO
    #Temp_error
FROM
    #error

WHILE EXISTS(SELECT TOP 1 1 FROM #Temp_error WHERE fixed = -1)
    BEGIN

        SET
            @Tablename = (SELECT TOP 1 tablename FROM #Temp_error WHERE fixed = -1)
        SET
            -- @SQLQuery = 'SELECT COUNT(fixed) FROM ' + @Tablename
            @SQLQuery = 'SELECT SUM(fixed) FROM ' + @Tablename

        INSERT INTO
            #Temp_fixed
        (
            fixed
        )
        EXECUTE
            sp_executesql
                @SQLQuery

        UPDATE
            #Temp_error
        SET
            fixed = ISNULL((SELECT TOP 1 fixed FROM #Temp_fixed), 0)
        WHERE
            tablename = @Tablename

        TRUNCATE TABLE #Temp_fixed

    END

SELECT
    tablename,
    errorcnt,
    fixed
FROM
    #Temp_error


DROP TABLE #error
DROP TABLE #Table1
DROP TABLE #Table2
DROP TABLE #Temp_error
DROP TABLE #Temp_fixed

您使用的是什么SQL语言?另外:在表1中,您是否已经有了“fixed”列的公式?Tsql,没有,这就是我试图执行子查询的问题。选择*,选择countfixed from tablename,其中fixed='T'from errorcountsCan请发布表格结构?是否存在指定是否存在错误或是否已修复错误的特定列?错误计数的表结构如上所述。Tablename,ErrorCnt要重新查询的每个表的固定计数的结构是Col1,Col2,col3…fixed我需要在“Y”的位置获取固定计数这是我填充errortable的方式选择T.name Tablename,i、 Rows NUMBOROFROWS FROM sys.tables T在T.OBJECT_ID=i.ID上连接sys.SYSINDEX i,其中indid按i.Rows DESC,T.NAME的0,1顺序排列。它从中提取的表仅是有错误的行。因此,我可以使用rowcount作为errorcoung值。好的,我知道你要去哪里,但是表的数量会随着位置的变化而变化,位置1可能有40个表,位置2可能有23个表,位置3可能有145个表…所以我认为光标可能是我唯一的方法?很可能,根据我能收集到的信息。一般来说,您需要一些动态方式,而游标似乎是这里唯一的解决方案,因为您很可能会将表名传递给动态sql。您找到@LeeHopkins了吗