首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >指定SQL Server索引视图中列的小数精度

指定SQL Server索引视图中列的小数精度
EN

Stack Overflow用户
提问于 2017-09-13 11:35:58
回答 1查看 862关注 0票数 0

我想知道是否可以覆盖索引视图中列的默认列精度。视图似乎总是以尽可能高的精度创建列。

下面是一个完整的可运行示例:

代码语言:javascript
运行
复制
-- drop and recreate example table and view if they exist
IF EXISTS(SELECT * FROM sys.objects WHERE name = 'ExampleIndexedView')
    DROP VIEW [dbo].[ExampleIndexedView]

IF EXISTS(SELECT * FROM sys.objects WHERE name = 'Example')
    DROP TABLE [dbo].[Example]

-- create example table
CREATE TABLE [dbo].[Example](
    [UserID] [int],
    [Amount] [decimal](9, 2)
) ON [PRIMARY]

-- insert sample rows
INSERT INTO [dbo].[Example] ([UserID], [Amount]) VALUES (1, 10)
INSERT INTO [dbo].[Example] ([UserID], [Amount]) VALUES (2, 20)
INSERT INTO [dbo].[Example] ([UserID], [Amount]) VALUES (3, 30)
INSERT INTO [dbo].[Example] ([UserID], [Amount]) VALUES (1, 15)
INSERT INTO [dbo].[Example] ([UserID], [Amount]) VALUES (1, 2.5)
GO

-- create indexed view
CREATE VIEW [dbo].[ExampleIndexedView]
WITH SCHEMABINDING
AS

SELECT
    e.UserID as UserID
    ,SUM(ISNULL(e.[Amount], 0)) as [Amount]
    ,COUNT_BIG(*) as [Count]        --Required for indexed views
FROM [dbo].[Example] e
GROUP BY 
    e.UserID
GO

CREATE UNIQUE CLUSTERED INDEX [CI_ExampleIndexedView]
    ON [dbo].[ExampleIndexedView]
        ([UserID])

-- show stats for view
exec sp_help [ExampleIndexedView]

这将生成一个包含以下列的视图:

代码语言:javascript
运行
复制
UserID(int, null)  
Amount(decimal(38,2), null)  

我理解为什么视图会自动为SUM列使用尽可能大的存储类型,但是假设我知道Amount列的求和永远不会超过decimal(19, 2)的限制-有没有办法强制视图将列创建为decimal(19, 2)而不是decimal(38, 2)

decimal(38, 2)需要17个字节来存储,decimal(19,2)只需要9个字节。作为一个测试,我将索引视图复制到一个使用decimal(19,2)的常规表中,总体存储空间节省了大约40%,因此对于包含大量小数聚合的视图来说,这似乎是一件值得做的事情。

编辑:发布了一个完整的可运行示例,该示例创建了一个示例表,在其中填充了几行,然后在该表上创建了一个索引视图。结果是索引视图中的Amount列是decimal(38,2),出于节省空间的原因,我希望找到一种方法将其强制为decimal(19,2)。

EN

回答 1

Stack Overflow用户

发布于 2017-09-13 11:40:26

CAST()或CONVERT()将其转换为所需的精度

代码语言:javascript
运行
复制
Select 
    UserID, 
    CONVERT(DECIMAL(9,2), SUM(Amount)) as Amount, 
FROM 
    Example
GROUP BY 
    UserID
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46188441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档