我不是SQL Server的专家,这个问题可能有点令人费解,但我必须尝试一下!
我正在运行服务器上的每个数据库以收集一些统计信息。在开发正确的SQL代码时,我使用的服务器相对较小(约150个数据库)。我得到的结果是查询执行时出错,这很好 - 这是预期的。所有需要完成的事情都已完成,我得到了我的结果。
现在我的问题是当我使用实时服务器时。这被授予,更多的数据更大。我不介意我的查询需要很长时间才能运行,我的问题是,当它运行时,最终会停止(它可能在20个数据库完成后停止,它可能在30之后停止 - 它永远不会相同)。它具有相同的Query执行错误的东西,但正如我所提到的,这很好 - 我之前已经很好地处理了这个错误(它是一个不在每个数据库中的表)。所以基本上,查询虽然没有完成但仍然会停止。
我只是想知道,有谁知道可能出错了什么?我将发布我的查询,但我不确定这是否是问题,因为它在开发服务器上正常工作..
我正试图弄清楚我的头发 - 谷歌今天也不友好。正如我所说,我不是专家 - 我对现实生活的发展相对较新,所以我可以做一些天真的事情。
这只是在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天,它一直在运行。 (该表具有时间戳属性)。所以现在我想知道是否与返回的大量数据有关?我不知道有任何限制,因此。这样的事情可能导致这样的问题吗?这可能是一个记忆问题吗?
答案 0 :(得分:2)
首先编辑这个查询块
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
然后增加远程查询超时