我在一家对冲基金工作,我们的数据库系统最近开始出现故障。我做了一些调查,实现了错误代码以及每个进程之间的消息框。我终于找到了问题所在:似乎是在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表格:
链接,以防很难看到:
<小时/>选择语句#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
返回:
选择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/