Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 视图中分区的总和为NULL,但直接使用时有效_Sql Server - Fatal编程技术网

Sql server 视图中分区的总和为NULL,但直接使用时有效

Sql server 视图中分区的总和为NULL,但直接使用时有效,sql-server,Sql Server,在SQL Server 2016数据库中,我有一个包含金融交易的表: CREATE TABLE Transactions TxnId int NOT NULL IDENTITY(1,1) PRIMARY KEY, AccountId int NOT NULL, DateTime datetime NOT NULL, Amount money NOT NULL ) 我编写了一个视图来显示运行平衡信息: CREATE VIE

在SQL Server 2016数据库中,我有一个包含金融交易的表:

CREATE TABLE Transactions
    TxnId     int      NOT NULL IDENTITY(1,1) PRIMARY KEY,
    AccountId int      NOT NULL,
    DateTime  datetime NOT NULL,
    Amount    money    NOT NULL
)
我编写了一个视图来显示运行平衡信息:

CREATE VIEW TransactionsWithBalance AS

SELECT
    *,
    SUM( Amount ) OVER ( PARTITION BY AccountId ORDER BY [DateTime], TxnId ) AS Balance
FROM
    Transactions
查询此视图时,“余额”列包含所有空值:

但是当我在分区上运行查询时。。。直接在SSMS中查询我在余额列中获得预期值


为什么在视图中查询聚合时返回空值?

这是元数据不同步时可能发生的情况之一,因为您没有:

模式绑定视图;或 每当视图基础对象发生更改时调用

评论 如果视图不是使用schemabinding创建的,则在对视图下的对象进行影响视图定义的更改时,应运行sp_refreshview。否则,查询视图时可能会产生意外结果

更好的选择可能是使用模式绑定。这也将迫使您在视图中不使用SELECT*,而在表中使用由两部分组成的名称,这两种最佳做法都是:

CREATE VIEW dbo.TransactionsWithBalance
WITH SCHEMABINDING
AS
SELECT
    TRN.TxnId, 
    TRN.AccountId,
    TRN.[DateTime],
    TRN.Amount,
    Balance =
        SUM(TRN.Amount) OVER (
            PARTITION BY TRN.AccountId 
            ORDER BY TRN.[DateTime], TRN.TxnId)
FROM
    dbo.Transactions AS TRN;

太奇怪了,我没法重新解释@拉马克很有趣-这很奇怪。看起来像只虫子。表中只有4行吗?你能告诉我们确切的版本吗?选择@版本;我无法在SQLFiddle或rextester中复制它。这是多余的,但如果尝试将其构建为派生表,会发生什么情况?创建查看TransactionWithBalance作为SELECT*FROM SELECT*,按AccountId按[DateTime]顺序在分区上求和金额,TxnId作为Transactions中的余额t tI只能复制它CC@Lamak。这修复了它。使用SSMS删除并创建视图,现在可以再次从中进行查询。我认为视图是可组合的,当在不同的查询(如UDF)中使用时,会生成一个新的执行计划,因此读取视图如此容易被破坏有些令人不安。
TxnId    AccountId    DateTime      Amount    Balance
    1            1    2017-01-01    100.00     100.00
    2            1    2017-01-02    200.00     300.00
    3            2    2017-01-01     10.00      10.00
    4            1    2017-01-03    300.00     600.00
CREATE VIEW dbo.TransactionsWithBalance
WITH SCHEMABINDING
AS
SELECT
    TRN.TxnId, 
    TRN.AccountId,
    TRN.[DateTime],
    TRN.Amount,
    Balance =
        SUM(TRN.Amount) OVER (
            PARTITION BY TRN.AccountId 
            ORDER BY TRN.[DateTime], TRN.TxnId)
FROM
    dbo.Transactions AS TRN;