SQL Server返回一个“";执行查询时出现错误";而不是';尽管被告知,我还是没能完成任务

SQL Server返回一个“";执行查询时出现错误";而不是';尽管被告知,我还是没能完成任务,sql,sql-server,multiple-databases,Sql,Sql Server,Multiple Databases,我不是SQL Server方面的专家,这个问题可能有点复杂,但我必须尝试一些东西 我正在运行服务器上的每个数据库以收集一些统计数据。在开发正确的SQL代码时,我使用了一个相对较小的服务器(约150个数据库)。我得到的结果是查询执行时出现了错误,这很好——这是意料之中的。所有需要做的事情都完成了,我得到了结果 现在我的问题是当我使用实时服务器时。这是理所当然的,数据越多,规模就越大。我不介意我的查询运行很长时间,我的问题是当它运行时,它最终会停止(它可能在完成20个数据库后停止,也可能在30个数据

我不是SQL Server方面的专家,这个问题可能有点复杂,但我必须尝试一些东西

我正在运行服务器上的每个数据库以收集一些统计数据。在开发正确的SQL代码时,我使用了一个相对较小的服务器(约150个数据库)。我得到的结果是查询执行时出现了错误,这很好——这是意料之中的。所有需要做的事情都完成了,我得到了结果

现在我的问题是当我使用实时服务器时。这是理所当然的,数据越多,规模就越大。我不介意我的查询运行很长时间,我的问题是当它运行时,它最终会停止(它可能在完成20个数据库后停止,也可能在30个数据库后停止——这是不一样的)。它有相同的查询执行错误的东西,但正如我所提到的,这是好的-我已经很好地处理了这个错误之前(这是一个表,不是在每个数据库)。因此,基本上,尽管查询尚未完成,但仍会停止

我只是想知道,有人知道可能出了什么问题吗?我将发布我的查询,但我不确定这是否是问题所在,因为它在dev服务器上运行良好

为了弄明白这一点,我真是毛骨悚然——谷歌今天也不友好。正如我所说,我不是专家——我对现实生活中的开发相对较新,所以我可能会做一些幼稚的事情

这只是SQL Server中运行的一个查询—它不是更大项目的一部分,它是独立的

declare @name nvarchar(100)
declare @sql varchar(2000)
declare @sql2 varchar (2000)
declare @repname nvarchar (200), @time DateTime, @pos int
declare @rn nvarchar (200), @ts DateTime, @p int

DECLARE GetDatabaseName CURSOR LOCAL FOR
    SELECT Name FROM sys.sysdatabases WHERE name not in ('master', 'tempdb', etc') order by name

OPEN GetDatabaseName
FETCH NEXT FROM GetDatabaseName INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
SET NOCOUNT ON
print @name
DROP table Results
DROP table TrueResults
DROP table temp
Create table Results (Position int, Name nvarchar(200), TimeStamp DateTime)
Create table TrueResults (Position int, Name nvarchar (200), TimeStamp DateTime)
Create table temp (Position int, Name nvarchar (200), TimeStamp DateTime)

ALTER TABLE Results
ALTER COLUMN Name VARCHAR(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
set @sql2 = 'insert into Results select ROW_NUMBER()over (order by TimeStamp), Name, TimeStamp from ' + @name                 + '.dbo.MyTableName'
exec (@sql2)
Declare Curses CURSOR
FOR select Name, TimeStamp, Position from Results
    Open Curses
while @@FETCH_STATUS = 0
    BEGIN
        fetch next from Curses
        into @rname, @time, @pos
        if exists (select * from Results where @rname= 'What I'm Looking For')
        BEGIN       
            if exists (select * from Results where Position = @pos + 1 and Name != 'What I'm Looking                For')
            BEGIN
                insert into temp (Position, Name, TimeStamp)
                values (@pos, @rname, @time)
                set @pos = (select temp.Position from temp, Results where temp.Position =                       Results.Position and Results.Position = @pos)+1
                set @p = (select Position from Results where Position = @pos)
                set @rn = (select Name from Results where Position = @pos)
                set @ts = (select TimeStamp from Results where Position = @pos)
                insert into TrueResults (Position, Name, TimeStamp)
                values (@p, @rn, @ts)
            END
        END
    END
CLOSE Curses
DEALLOCATE Curses

select @name
 set @sql = 'select Name, count(Name) as RCount from TrueResults group by Name order by RCount desc'
    exec (@sql)
FETCH NEXT FROM GetDatabaseName INTO @name

END
CLOSE GetDatabaseName
DEALLOCATE GetDatabaseName
GO

我试过这里提到的东西,但没有用。不过,我添加了一个子句,只返回过去7天的结果,这使得查询运行的时间更长。改为1天,一路跑完。(该表具有时间戳属性)。所以现在我想知道这是否与返回的数据量有关?我不知道有任何限制,就其本身而言。但是,这样的事情会导致这样的问题吗?这可能是内存问题吗?

首先编辑此查询块

Declare Curses CURSOR
FOR select Name, TimeStamp, Position from Results
Open Curses
fetch next from Curses
    into @rname, @time, @pos
while @@FETCH_STATUS = 0
BEGIN
    if exists (select * from Results where @rname= 'What Im Looking For')
    BEGIN       
        if exists (select * from Results where Position = @pos + 1 and Name != 'What I'm Looking                For')
        BEGIN
            insert into temp (Position, Name, TimeStamp)
            values (@pos, @rname, @time)
            set @pos = (select temp.Position from temp, Results where temp.Position =                       Results.Position and Results.Position = @pos)+1
            set @p = (select Position from Results where Position = @pos)
            set @rn = (select Name from Results where Position = @pos)
            set @ts = (select TimeStamp from Results where Position = @pos)
            insert into TrueResults (Position, Name, TimeStamp)
            values (@p, @rn, @ts)
        END
    END
    fetch next from Curses
    into @rname, @time, @pos
END
CLOSE Curses
DEALLOCATE Curses

然后增加远程查询超时

您是说在这两种环境中都会出现错误,但在Dev中,错误发生后会继续,而在Prod中,错误发生后会立即停止?如果是这样,您是否使用相同的工具在两种环境中运行SQL脚本?您可能需要检查生产服务器上的“远程查询超时”属性。默认设置为10分钟。这取决于查询运行时服务器上的负载,这可能解释了为什么在结束查询之前会看到它所通过的数据库数量发生变化。您可以通过SQL Enterprise Manager GUI访问超时属性,选择服务器,单击鼠标右键,选择属性,然后单击“服务器属性”对话框上的“连接”。并确保两个应用程序中的SET XACT_ABORT都相同。@PM77-1我在这两个应用程序中使用的工具完全相同,afaik。不过我会再检查一遍。@tchester我会试试这个,谢谢!我能问一下为什么我需要编辑这个吗?这样做是因为这是我所知道的唯一让它发挥作用的方法。。如果这不是最好的方法,你能给我一个更好的方法吗?不过我会试试远程超时,谢谢。