Sql server 视图中分区的总和为NULL,但直接使用时有效
在SQL Server 2016数据库中,我有一个包含金融交易的表: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
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;