Sql server SQL Server:无限期执行更新查询
目前我正在使用SQLServer2005。我得到了一个触发事件,它是在datetime列更改时创建csv文件。当我尝试更新数据库中记录的日期时间时,它会一直执行查询,直到我强制停止它。我可以知道可能导致这种情况的问题是什么吗?感谢您的帮助。提前谢谢 这是我的更新查询Sql server SQL Server:无限期执行更新查询,sql-server,datetime,Sql Server,Datetime,目前我正在使用SQLServer2005。我得到了一个触发事件,它是在datetime列更改时创建csv文件。当我尝试更新数据库中记录的日期时间时,它会一直执行查询,直到我强制停止它。我可以知道可能导致这种情况的问题是什么吗?感谢您的帮助。提前谢谢 这是我的更新查询 UPDATE S_xxx SET DatePosted = CAST('2015-08-26 15:49:16.000' AS datetime) WHERE TrxNo = 'RCACP1000000420' 这是触发事件的代码
UPDATE S_xxx
SET DatePosted = CAST('2015-08-26 15:49:16.000' AS datetime)
WHERE TrxNo = 'RCACP1000000420'
这是触发事件的代码
ALTER TRIGGER [dbo].[tr_S_xxx_ForUpdate]
ON [dbo].[S_xxx]
AFTER UPDATE
AS
BEGIN
IF Update(DatePosted) --AND DatePosted NOT NULL
BEGIN
DECLARE @pSQL as VARCHAR(500)
DECLARE @pdate as datetime
DECLARE @ptime as varchar(30)
DECLARE @pFileName as VARCHAR(100)
DECLARE @pBizDate as varchar (30)
DECLARE @pLocationCode as varchar (50)
DECLARE @nNewValue as DATETIME
DECLARE @pFilePath as varchar (50)
DECLARE @pLogMsgString as varchar (500)
DECLARE @pBatch as varchar (100)
DECLARE @pLogName as varchar (100)
DECLARE @pExecBatch as varchar (100)
SELECT @nNewValue=a.DatePosted -- Get the Old and New values
FROM inserted a
SET @pdate = @nNewValue
SET @pBizDate = convert(varchar(30),@pdate,103)
SET @ptime = convert(varchar(30),@pdate,101)
SELECT @pLocationCode = memCtlCharCode
FROM JTBCtlTab
WHERE strCtlCode = 'POS2icms_LOCATIONCODE';
SELECT @pFilePath = memCtlCharCode
FROM JTBCtlTab
WHERE strCtlCode = 'POS2icms_TARGETFOLDER';
SET @pFileName = @pFilePath + convert(varchar(30),@pdate,112) + '_' + REPLACE(CONVERT(varchar, GETDATE(), 108), ':','') + '.csv'
SET @pBatch = convert(varchar(30),@pdate,112) + '_' + REPLACE(CONVERT(varchar, GETDATE(), 108), ':','') + '.bat'
SET @pLogName = convert(varchar(30),@pdate,112) + '_' + REPLACE(CONVERT(varchar, GETDATE(), 108), ':','') + '.log'
SET @pExecBatch = '''' + @pFilePath + @pBatch + ''''
SET @pSQL = 'sqlcmd -S DEV-WEB-PC01 -d POSJDB -E ' +
'-Q "set nocount on; SELECT ' + '''' + @pLocationCode + '''' + ',' + '''' + @pBizDate + '''' + ',' +
'SUM(COALESCE(S.Amount, 0) + COALESCE(N.Amount, 0) + COALESCE(R.Amount, 0))' +
'From dbo.S_xxx AS H LEFT JOIN dbo.SER_TRX_CASHSALES AS S ON H.TrxNo = S.TrxNo ' +
'LEFT JOIN dbo.SER_TRX_SPORDER_NEWITEM AS N ON H.TrxNo = N.TrxNo ' +
'LEFT JOIN dbo.SER_TRX_SPORDER_REPAIR AS R ON H.TrxNo = R.TrxNo ' +
'Where convert(varchar(30),H.DatePosted,101) = ' + '''' + @ptime + '''' +
-- 'and S.is_void = 0' +
'" -h-1 -s "," -W -o "' + @pFileName + '"';
set @pLogMsgString = @pSQL
exec spWriteStringToFile @pLogMsgString , @pFilePath, @pLogName
exec spWriteStringToFile @pLogMsgString , @pFilePath, @pBatch
Print @pExecBatch
EXEC xp_cmdshell @pExecBatch
END
我的建议是死锁。触发器正在事务中运行,您运行外部工具sqlcmd,该工具使用另一个事务并等待表上的锁。但是表已经被锁定,您的事务正在等待外部工具
尝试直接从触发器创建和导出CSV,而不使用外部工具。或者执行外部工具,但不要等到进程退出。可能会被另一个查询/事务阻塞。请注意:您的触发器严重损坏<代码>插入的是一个可以包含0、1或多行的表。因此,
SELECT@nNewValue=a.datepostedfrom inserted a
将从其中一行中获取一个值,并忽略所有其他行。您正试图在另一个连接上运行另一段SQL,该连接正试图从同一个表中读取数据-当然它会阻塞,因为您仍然在原始事务中,该事务在该表上持有独占锁。您的数据集有多大?可能是SQLCMD
需要很长时间才能导出?您需要检查数据库活动以确保?文件是否已创建?SQLCMD正在运行吗?无论如何,这是一个非常糟糕的想法,注定是不可靠的