Sql server SQL Server:无限期执行更新查询

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' 这是触发事件的代码

目前我正在使用SQLServer2005。我得到了一个触发事件,它是在datetime列更改时创建csv文件。当我尝试更新数据库中记录的日期时间时,它会一直执行查询,直到我强制停止它。我可以知道可能导致这种情况的问题是什么吗?感谢您的帮助。提前谢谢

这是我的更新查询

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正在运行吗?无论如何,这是一个非常糟糕的想法,注定是不可靠的