首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在索引视图中使用FORMATMESSAGE

在索引视图中使用FORMATMESSAGE
EN

Stack Overflow用户
提问于 2019-03-13 10:44:50
回答 1查看 202关注 0票数 1

当创建一个使用内置函数FORMATMESSAGE的索引视图时,我得到一个错误(下面),FORMATMESSAGE是不确定的。可以理解的是,这一观点不能成为现实,这大概是因为FORMATMESSAGE的输出取决于本地化信息,因此并不总是为相同的参数提供相同的输出。

我试图找到一种方法将特定的地区传递给FORMATMESSAGE,通过使用sys.messages而不是文字格式字符串使其具有确定性,但没有成功。

然而,有关确定性和非确定性函数的最新MS信息并没有具体说明FORMATMESSAGE是非确定性的。因此,

有没有人找到在索引视图中使用FORMATMESSAGE的方法?

以下是我的简化测试代码:

代码语言:javascript
复制
SET ANSI_NULLS, QUOTED_IDENTIFIER, ANSI_PADDING ON
GO ----------------------------------------------------------------
CREATE TABLE dbo.Extensions(
    ID INT IDENTITY(1,1) NOT NULL,
    Name VARCHAR(50) NULL,
    ExtNo INTEGER NOT NULL,
  CONSTRAINT PK_Test PRIMARY KEY CLUSTERED (ID ASC)
)
GO ----------------------------------------------------------------
INSERT dbo.Extensions (Name, ExtNo)
VALUES ('New York', 55),
       ('San Francisco', 6),
       ('Paris', 4);
GO ----------------------------------------------------------------
CREATE VIEW dbo.vwExtensions
WITH SCHEMABINDING AS

  SELECT
    ID,
    FORMATMESSAGE ('%s Extension %03i', Name, ExtNo) AS ExtensionName
  FROM
    dbo.Extensions

GO ----------------------------------------------------------------

到现在为止还好。SELECT * FROM dbo.vwExtensions得到正确的结果:

但是,这样做的全部目的是使视图被索引(这样它就实现了,也就是说,结果是预先计算出来的,并由SQL Server - Speed,man!)持久化。然而,

代码语言:javascript
复制
CREATE UNIQUE CLUSTERED INDEX IX_Extension ON dbo.vwExtensions (ID)

给出错误:

代码语言:javascript
复制
Cannot create index on view 'TEST_DB.dbo.vwExtensions'. The function 'formatmessage' yields nondeterministic results. Use a deterministic system function, or ...

注意:我是而不是,我正在寻找计算列的解决方案,因为这里不重要的其他原因。(这不允许在任何情况下将计算列的persisted属性设置为true,原因与上面完全相同)。

编辑:应该在这里添加-我需要使用FORMATMESSAGE (或某些确定性的选择),而不是连接(右)。等,因为格式字符串也存储在表中,而不是硬编码,如这里所示。上面我的代码的简化版本并没有说明这一点。

EN

回答 1

Stack Overflow用户

发布于 2019-03-13 11:13:16

尝试使用确定性函数:

代码语言:javascript
复制
CREATE VIEW dbo.vwExtensions
WITH SCHEMABINDING AS

  SELECT
    ID,
    CONCAT(Name, ' Extension', ' '
        , RIGHT('000' + CAST(ExtNo AS VARCHAR(3)), 3)) AS ExtensionName
  FROM
    dbo.Extensions

然后创建索引:

代码语言:javascript
复制
CREATE UNIQUE CLUSTERED INDEX IX_Extension ON dbo.vwExtensions (ID)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55139995

复制
相关文章

相似问题

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