我看到另一个海报(WolfiG)提出了一个非常类似的问题,但我没有找到答案。
(我理解该错误消息,而不是在寻找解决错误的方法,我正在尝试确定是否存在用于其他错误的任何类型的错误检查(或调试技术)。

我发现了类似的代码并将其添加到其中,以获取服务器上每个数据库中的每个表……并显示PK和行数。 (先处理 list ,然后处理数据字典-但这不是问题,我只是在解释代码的产生方式。)

因此,在这种情况下,我已经缩小了数据范围(这意味着我知道我要查询的数据库并遇到了错误),因此“只有” 81个表(行)可能出现了错误。但是当然,这将需要太多的手动检查才能发现问题,所以我希望当子查询出现错误时,有一种方法可以查看正在读取哪个“t.name”。 (我通过一次注释掉一行来缩小了第一个子查询的范围(共有10条,而我并没有在此处全部复制。)

同样,问题是(而且看来我不是唯一提出此类问题的人)-
是否可以确定哪个行(数据)在查询中导致错误?

在下面的示例中,
是否有办法在发生错误时显示t.name(或其他列的数据)是最新的?

在大型机上工作过-您可以查看转储或缓冲区。但是我想我并不想期望太多,因为我一直看到隐秘的消息,很明显,系统中有信息但不显示它。

消息512,级别16,状态1,第1行
子查询返回了1个以上的值。当子查询遵循=,!=,,> =或将子查询用作表达式时,不允许这样做。

use [DBName]
SELECT '[DBName]' as DBName, t.NAME, it.xtype,i.rowcnt,
   (select c.name from syscolumns c inner join sysindexkeys k on k.indid=i.indid and c.colid = k.colid and c.id=t.id and k.keyno=1 and k.id=t.id)as 'column1',
   (select c.name from syscolumns c inner join sysindexkeys k on k.indid=i.indid and c.colid = k.colid and c.id=t.id and k.keyno=2 and k.id=t.id)as 'column2'
  from sysobjects t inner join sysindexes i on i.id=t.id
    LEFT OUTER JOIN   sysobjects it on it.parent_obj=t.id and it.name = i.name
 WHERE  i.indid < 2 AND OBJECTPROPERTY(t.ID, 'IsMSShipped') = 0

谢谢!

顺便说一句,我如何找到导致此错误的行(以防其他人帮助)是将第一个子查询更改为“从syscolumns中选择 count(c.name)”,然后进行查找对于数字大于1的任何行。

塞巴斯蒂安·梅恩(Sebastian Meine)谢谢,但是现在我遇到了另一个问题。 (我不得不说,我很难过地反驳了您的评论,即字典比其他DB更胜一筹。GRRRR)

我使用的是“i.indid ,因为-首先,我最初尝试获取rowcnt,而老实说,所有示例都使用了它。但是我看到您粘贴的查询的如何获得更多的行,而原始的却丢失了-显然是由于检查:i.indid
但是,通过您的查询,我现在在同一张表上出现了很多次,而且我看不到如何在我键入此内容时“汇总”/ARGHHH ,我发现COLS不仅是主键并且显示相同的表名(并且行数不同,并且在许多情况下,表中的每一列似乎都有一行-在其他情况下则没有)。因此,在寻找一种模式时,我发现MAYBE sysindexes.status =可能会限制我的结果-但尽管如此,但仍然存在重复的行。再次ARGGGH

最佳答案

SQL Server不提供进行逐行调试的功能。一切都作为一个集合来处理。如果一个元素不符合规则,则整个查询将失败。

因此,要查找有问题的行,您需要像已经做的那样编写一个单独的查询。

SQL 2000中的目录竞争不是很好,但是自从有了很大改进以来,它比那里的大多数其他RDBMS都提供了更多详细信息。但是,由于您似乎需要编写一个可以在所有查询上运行的查询,因此请尝试以下操作:

 SELECT DB_ID() AS DBName,
        o.name,
        i.rowcnt,
        i.keycnt,
        cols.column1,
        cols.column2,
        cols.column3,
        cols.column4
 FROM   sysobjects o
 JOIN   sysindexes i
        ON o.id = i.id
 JOIN   (
          SELECT  k.id,
                  k.indid,
                  MAX(CASE WHEN k.keyno = 1 THEN c.name END) AS column1,
                  MAX(CASE WHEN k.keyno = 2 THEN c.name END) AS column2,
                  MAX(CASE WHEN k.keyno = 3 THEN c.name END) AS column3,
                  MAX(CASE WHEN k.keyno = 4 THEN c.name END) AS column4
          FROM    sysindexkeys k
          JOIN    syscolumns c
                  ON k.id = c.id
                  AND k.colid = c.colid
          GROUP BY k.id, k.indid
        ) cols
        ON i.id = cols.id
        AND i.indid = cols.indid

我没有再运行SQL 2000版本来尝试此操作,但是我相信它将运行。

需要注意的两件事:
  • sysindexes.rowcnt值在SQL 2000中非常不可靠。在更高版本的sys.indexes中找到的值可靠,但不符合ACID。
  • 索引中最多可以包含16个列。我在查询中添加了4,还添加了keycnt列,因此您知道丢失了多少。
  • 关于sql-server - 如何确定哪一行导致了错误-错误检查,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15014306/

    10-11 02:58