尝试访问SQL Server中的上一条记录

时间:2016-02-12 11:16:50

标签: sql-server calculated-columns

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

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年代早期一样,所以我不确定为什么不工作......老实说,这批产品正在扼杀我。

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

问题是:

滞后函数可以与CREATE TABLE一起使用,对吗?如果没有,我应该在OnLoad事件中创建一个查询来创建该列吗?

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

1 个答案:

答案 0 :(得分:1)

SQL中没有以前的记录 - 表没有订单。

会计标准 - 在大多数司法管辖区甚至法律上非常要求 - 是在表中记录变更和新值,以及运行编号(每个帐户)。