我试图运行存储过程。在SP中我创建了两个表变量(通过使用3个CTE' s)。然后连接两个表并INSERT INTO现有表。我一直得到错误无法获得锁定资源。我有什么想法可以解决这个问题吗?这是我写SP的方式吗?
ALTER PROCEDURE [dbo].[CreateDailyAttribution]
-- Add the parameters for the stored procedure here
@day1 varchar(10)
,@day2 varchar(10)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @tableUnrealized as table
(
POFFIC varchar(3)
,PACCT varchar(5)
--,PATYPE varchar(3)
,PSDSC1 varchar(100)
,ShortDesc varchar(100)
,ChangeInOTE decimal(18,0)
,tMinus1_Qty integer
,tMinus2_Qty integer
,Sector varchar(50)
);
DECLARE @tableRealized as table
(
POFFIC varchar(3)
,PACCT varchar(5)
--,PATYPE varchar(3)
,PSDSC1 varchar(100)
,ShortDesc varchar(100)
,Realized decimal(18,0)
,Sector varchar(50)
);
答案 0 :(得分:1)
您收到的错误表明服务器没有足够的内存,因为没有足够的物理内存可用,服务器没有足够的内存供其使用,或者其他进程也在使用很多内存和SQL没有足够的喘息空间。
您的查询看起来可能会占用大量内存 - 可能会调整它(一个简单的事情可能是使用#temp表而不是@table变量,看看是否可以减轻一些内存压力(#temp表)将进入tempdb并点击磁盘,而表变量可能存储在内存中。虽然不了解更多有关您的数据和更深入的查询分析,但很难说。
MSDN对此错误有一些额外的建议:
<强>解释强>
SQL Server无法获取锁资源。这可能是由以下原因之一引起的:
- SQL Server无法从操作系统分配更多内存,因为其他进程正在使用它,或者因为服务器在配置了max server memory选项的情况下运行。
- 锁管理器不会使用超过60%的SQL Server可用内存。
用户操作
如果您怀疑SQL Server无法分配足够的内存,请尝试以下操作:
- 如果SQL Server以外的应用程序正在消耗资源,请尝试停止这些应用程序或考虑在单独的服务器上运行它们。这将从SQL Server的其他进程中删除释放内存。
- 如果已配置max server memory,请增加max server memory设置。
如果您怀疑锁管理器已使用最大可用内存量,则识别持有最多锁的事务并终止它。
以下脚本将识别具有最多锁的事务:
SELECT request_session_id, COUNT (*) num_locks
FROM sys.dm_tran_locks
GROUP BY request_session_id
ORDER BY count (*) DESC
获取最高会话ID,并使用KILL命令终止它。