sql - 存储过程在 7 年后随机停止工作

标签 sql sql-server vb.net stored-procedures

我在一家对冲基金工作,我们的数据库系统最近开始出现故障。我做了一些调查,实现了错误代码以及每个进程之间的消息框。我终于找到了问题所在:似乎是在SQL的存储过程中。

我们在 Windows XP SP3 上使用 VB 2005、Access for SQL TableView 和 Microsoft Server Management Studio Express。

所有其他进程都在运行。其工作原理如下:

我们填写了来自 Bloomberg 的交易,该交易创建了一个 .csv 文件。该 .csv 文件被放入名为 BBGT_Transactions 的 SQL 表中。这是直接复制的。这个过程非常完美。每次流程运行时(每 30 分钟)交易都会在那里。接下来,同一流程获取 BBGT_Transactions 中的交易并将其复制到 Transactions。来自 VB 的调用如下所示:

 Public Sub CopyNewEMSTransactions()

        Log.Info("Copying new transactions from BBGTransactions to Transactions")
        DAL.sqlcmd("CopyNewEMSTransactions")

End Sub

CopyNewEMSTransactions 是一个存储过程,如下所示:

USE [IPAS]
GO
/****** Object:  StoredProcedure [dbo].[CopyNewEMSTransactions]    Script Date: 10/28/2013 13:34:15 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      Name
-- Create date: 
-- Description: 
-- =============================================
ALTER PROCEDURE [dbo].[CopyNewEMSTransactions] 
    -- Add the parameters for the stored procedure here
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here

--New Code: Accounts for option trades through bloomberg terminal
INSERT INTO Transactions (Account, TDate, [Time], SDate, Class,
                              [Type], Ticker, Quantity, Price, SEDOL,
                              CUSIP, Comments, OrderNumber, ISIN)
    SELECT TranAccount AS Account,
           (SELECT CAST(FLOOR(CAST(ExecDate AS float)) AS datetime)) AS TDate,
           ExecDate + ExecTime - '1899-12-30' AS [Time],
           ExecDate + 3 AS SDate, CASE EMS.Broker
                                    WHEN 'CIBC' THEN 'Equity'
                                    WHEN 'CIBO' THEN 'Option' END AS Class,
          CASE Side
            WHEN 'SS' THEN 'SHORT'
            WHEN 'B' THEN 'BUY'
            WHEN 'S' THEN 'SELL'
            WHEN 'BS' THEN 'BUY'
            ELSE 'UNKNOWN' 
          END AS Type, EMS.Ticker,
          CASE Side
            WHEN 'SS' THEN -1
            WHEN 'S' THEN -1
            WHEN 'B' THEN 1
            WHEN 'BS' THEN 1
          END * FillAmount AS Quantity, 
          AveragePrice AS Price,
          SEDOL, CUSIP,
          Comments = 'Bloomberg data',
          LatestRows.OrderNumber, ISIN
    FROM    
        (SELECT Ticker, OrderNumber, MAX(ExecSeqNumber) AS LastExecSeqNumber
        FROM BBGTransactions
        WHERE OrderNumber NOT IN (SELECT OrderNumber FROM Transactions 
                                  WHERE Comments = 'Bloomberg data')

        GROUP BY OrderNumber, Ticker) LatestRows
    LEFT JOIN
        --Changed from "SELECT * From BBGTransactions" to add the ' Equity'
        (SELECT BBG_ID, ExecDate, ExecTime, TranAccount, 
            CASE Broker
                WHEN 'CIBC' THEN Ticker
                WHEN 'CIBO' THEN Ticker + ' Equity' END AS Ticker,
        --With option trades, SEDOL is not used anywhere. It used to be used for the Reconciliation report
        --but that report has been changed to look at option ticker instead.
        CASE Broker
            WHEN 'CIBC' THEN SEDOL
            WHEN 'CIBO' THEN NULL END AS SEDOL, 
        CUSIP, OrderNumber, Side, FillAmount, AveragePrice, ExecLastFillPX, Broker, Currency, OrderType, 
        LimitPrice, DayFillAmount, DayAvgPrice, ISIN, Amount, ExecType, ExecSeqNumber, ExecPrevSeqNumber FROM BBGTransactions) EMS
    ON LatestRows.LastExecSeqNUmber = EMS.ExecSeqNumber
       AND LatestRows.OrderNumber = EMS.OrderNumber
    WHERE LatestRows.OrderNumber NOT IN (SELECT OrderNumber FROM Transactions 
                              WHERE Comments = 'Bloomberg data')

END

它没有返回错误并显示“正在将 BBGT 复制到事务表”,然后显示“完成”,但不复制!它工作了 7 年,大约 3 周前停止工作。

注意事项:

  • 上个月我们的互联网非常不稳定
  • 我怀疑 Windows 更新已运行,但在此之前大约 3 年多时间没有更新 Windows。我上次检查时有 70 条更新,现在没有了。
  • 回到幽灵是我最后的手段,因为这需要我做大量的工作来实现
  • 代码从未更改!
  • 我尝试仅运行存储过程,但正如怀疑的那样,它什么也没做。

编辑 得到了跟踪日志,仅运行该过程。但它没有返回任何错误?

SELECT SYSTEM_USER
go
SET ROWCOUNT 0 SET TEXTSIZE 2147483647 SET NOCOUNT OFF SET CONCAT_NULL_YIELDS_NULL ON SET ARITHABORT ON SET LOCK_TIMEOUT -1 SET QUERY_GOVERNOR_COST_LIMIT 0 SET DEADLOCK_PRIORITY NORMAL SET TRANSACTION ISOLATION LEVEL READ COMMITTED SET ANSI_NULLS ON SET ANSI_NULL_DFLT_ON ON SET ANSI_PADDING ON SET ANSI_WARNINGS ON SET CURSOR_CLOSE_ON_COMMIT OFF SET IMPLICIT_TRANSACTIONS OFF SET QUOTED_IDENTIFIER ON
go
select @@spid select SERVERPROPERTY('ProductLevel')
go
USE [IPAS]

go

DECLARE @return_value int

EXEC    @return_value = [dbo].[CopyNewEMSTransactions]

SELECT  'Return Value' = @return_value


go
exec sp_execute 18,5930,5924,5925,5926,5927,5928,5929,5923,5921,5922
go
exec sp_execute 16,59826,59827,59756,59757,59758,59716,59715,59700,59701,59702
go

还有对应的excel表格:

http://i.imgur.com/Ce76EHd.png

链接,以防很难看到:

/image/iJFRo.png

<小时/>

选择语句#1(似乎有效):

SELECT Ticker, OrderNumber, MAX(ExecSeqNumber) AS LastExecSeqNumber
FROM BBGTransactions
WHERE OrderNumber NOT IN (SELECT OrderNumber FROM Transactions
                          WHERE Comments = 'Bloomberg data')
GROUP BY OrderNumber, Ticker

返回: /image/r6z0T.jpg

链接:/image/r6z0T.jpg

选择2:

代码:

SELECT BBG_ID, ExecDate, ExecTime, TranAccount,
    CASE Broker
        WHEN 'CIBC' THEN Ticker
        WHEN 'CIBO' THEN Ticker + ' Equity' END AS Ticker,
    --With option trades, SEDOL is not used anywhere. It used to be used for the Reconciliation report
    --but that report has been changed to look at option ticker instead.
    CASE Broker
        WHEN 'CIBC' THEN SEDOL
        WHEN 'CIBO' THEN NULL END AS SEDOL,
    CUSIP, OrderNumber, Side, FillAmount, AveragePrice, ExecLastFillPX, Broker, Currency, OrderType,
    LimitPrice, DayFillAmount, DayAvgPrice, ISIN, Amount, ExecType, ExecSeqNumber, ExecPrevSeqNumber 
    FROM BBGTransactions
    WHERE LatestRows.OrderNumber NOT IN (SELECT OrderNumber FROM Transactions
                                         WHERE Comments = 'Bloomberg data')

错误 服务器:消息 4104,级别 16,状态 1,第 1 行 无法绑定(bind)多部分标识符“LatestRows.OrderNumber”。

最佳答案

您为一家对冲基金工作,获得标准许可证并且不使用免费赠品。

您似乎没有发布实际的存储过程,而是发布了一个“清理”版本来显示它的工作原理。这实际上是一种障碍,而不是帮助。

在这个删除过程中很难说,但我想说你要么有数据问题(查询完全像往常一样运行,但你拥有的数据没有返回任何结果),或者你最终超过了Express 版本内置的限制。

忘记运行 SP,提取查询并直接运行它们,感受一下数据的实际情况。如果选择有效但插入无效,则可能超出了 Express 版本的限制。如果选择未返回预期的行,则存在数据问题。

关于sql - 存储过程在 7 年后随机停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19641297/

相关文章:

mysql有条件地选择前N条记录

.net - 在 Visual Studio 中检索使用临时表的存储过程的字段架构

vb.net - AxShockwaveFlash.CallFunction() 帮助 (VB 2008)

vb.net - 通过 VB.NET 检查我的笔记本电脑电池生命周期

mysql - vb.net mysql 连接下一条记录的代码?

mysql - 为什么将字段用引号引起来比不用引号花费更长的时间?

sql - 如何从变量运行超过 8000 个字符的 SQL 语句?

mysql - 从链接列可以为空的两个表中选择

sql - SQL Server 中的 "PARALLEL"等效项是什么

mysql - 查询问题从一个表选择结果到另一个表