我試圖做與C#的WinForms一個會計應用的平衡專欄,我這樣做只是爲了我自己使用,是該列的公式像這樣的:嘗試訪問以前的記錄在SQL Server
balance[i] = debit[i] - credit[i] + balance[i-1]
所以,我認爲計算列是最好的解決方案。我使用Visual Studio 2013社區和SQL Server中,我試圖做它在CREATE TABLE
腳本中的「表視圖」:
CREATE TABLE [dbo].[CONTAT1]
(
[NASIENTO] INT IDENTITY (1, 1) NOT NULL,
[FECHA] DATE NOT NULL,
[CONCEPTO] NVARCHAR (MAX) NOT NULL,
[DEBIT] INT DEFAULT ((0)) NOT NULL,
[CREDIT] INT DEFAULT ((0)) NOT NULL,
[BALANCE] AS ([DEBIT]-[CREDIT] + lag([BALANCE], 1, 0)),
[FACTURA] INT NULL,
[RECIBO] INT NULL,
PRIMARY KEY CLUSTERED ([NASIENTO] ASC)
);
我指定的默認滯後的參數,以便在第一條記錄的功能滯後剛加0(哦,我已經翻譯了所謂的行名,所以任何人都可以按照這個問題)。當我更新它不工作表,並提供了以下消息:
Dropping unnamed constraint on [dbo].[CONTAT1]...
Dropping unnamed constraint on [dbo].[CONTAT1]...
Starting rebuilding table [dbo].[CONTAT1]...
(116,1): SQL72014: .Net SqlClient Data Provider: Msg 10753, Level 15, State 1, Line 13 The function 'lag' must have an OVER clause.
(104,0): SQL72045: Script execution error. The executed script:
BEGIN TRANSACTION;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET XACT_ABORT ON;
CREATE TABLE [dbo].[tmp_ms_xx_CONTAT1] (
[NASIENTO] INT IDENTITY (1, 1) NOT NULL,
[FECHA] DATE NOT NULL,
[CONCEPTO] NVARCHAR (MAX) NOT NULL,
[DEBIT] INT DEFAULT ((0)) NOT NULL,
[CREDIT] INT DEFAULT ((0)) NOT NULL,
[BALANCE] AS ([DEBIT] - [CREDIT] + lag([BALANCE], 1, 0)),
[FACTURA] INT NULL,
[RECIBO] INT NULL,
PRIMARY KEY CLUSTERED ([NASIENTO] ASC)
);
IF EXISTS (SELECT TOP 1 1
FROM [dbo].[CONTAT1])
BEGIN
SET IDENTITY_INSERT [dbo].[tmp_ms_xx_CONTAT1] ON;
INSERT INTO [dbo].[tmp_ms_xx_CONTAT1] ([NASIENTO], [FECHA], [CONCEPTO], [DEBIT], [CREDIT], [FACTURA], [RECIBO])
SELECT [NASIENTO],
[FECHA],
[CONCEPTO],
[DEBIT],
[CREDIT],
[FACTURA],
[RECIB
An error occurred while the batch was being executed.
我用SQL就像是在2000年初的最後一次,所以我不知道爲什麼不工作?老實說,批次的事情正在殺死我。
我已經搜索了滯後函數,對我來說似乎是正確的,並且由於表有一個主鍵AND如果我只是嘗試它沒有滯後函數(只使用[BALANCE] AS ([DEBIT]-[CREDIT])
)它完美的作品,我想我沒有必要指定順序或別的東西,所以我認爲問題是滯後函數。
的問題是:
滯後功能可與CREATE TABLE
使用,對不對?如果不是,我應該只是在形式OnLoad事件中創建一個查詢來創建該列?
還有沒有其他的方式來訪問之前的紀錄?是的,我可以通過一個非常簡單的foreach通過DataSet來完成,但我不想創建...你怎麼用英文來稱呼它?差距?只是在數據庫和應用程序中的不同信息,以及重複的查詢和什麼不是......所以我認爲數據庫自動管理它會更好:P,對吧?
對不起SQL表沒有保證的自然順序。出於這個原因,您不能在計算列的定義中包含LAG或LEAD。您可以創建一個位於表格頂部的視圖,幷包含餘額計算。這是有效的,因爲您現在可以訪問ORDER BY子句,這是您可以在SQL集上強制執行命令的唯一方法。 –
您正在使用什麼**版本的SQL Server? 'LAG'和'LEAD'是SQL Server ** 2012 **中的**新特性**,如果您有更早的版本(通過運行SELECT @@ VERSION進行驗證),那麼您運氣不好...... –