正在尝试访问 SQL 服务器中的先前记录

Trying to access previous record in SQL Server

我正在尝试使用 c# winforms 在会计应用程序中做一个余额列,我这样做只是为了自己使用,就像这个列的公式:

balance[i] = debit[i] - credit[i] + balance[i-1]

所以,我认为计算列是最佳解决方案。我正在使用 Visual Studio 2013 社区和 SQL 服务器,我尝试在 CREATE TABLE 脚本的 "table view" 中执行此操作:

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(哦,我已经翻译了所谓的行名称,所以任何人都可以理解这个问题)。当我更新 table 它不起作用并给出以下消息:

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 年代初期,所以我不确定为什么不起作用...老实说,批处理的东西快要死了。

我已经搜索了滞后函数并且对我来说似乎是正确的,并且由于 table 有一个主键并且如果我只是在没有滞后函数的情况下尝试它(仅使用 [BALANCE] AS ([DEBIT]-[CREDIT]) )它有效完美,我想我不需要指定顺序或其他东西,所以我再次认为问题是滞后函数。

问题是:

滞后函数可以和CREATE TABLE一起使用,对吧?如果没有,我是否应该在 OnLoad 事件的表单中进行查询以创建该列?

有没有其他方法可以访问以前的记录?是的,我可以通过 DataSet 使用一个非常简单的 foreach 来完成,但我不想创建...用英语怎么称呼它?差距?只是数据库和应用程序中的信息不同,重复查询等等...所以我认为数据库自动管理它会更好:P,对吗?

SQL中没有以前的记录 - table没有顺序。

会计标准——在大多数司法管辖区甚至是法律上的要求——是在 table 中记录更改和新值,以及 运行 数字(每个帐户)。