当创建一个使用内置函数FORMATMESSAGE的索引视图时,我得到一个错误(下面),FORMATMESSAGE是不确定的。可以理解的是,这一观点不能成为现实,这大概是因为FORMATMESSAGE的输出取决于本地化信息,因此并不总是为相同的参数提供相同的输出。
我试图找到一种方法将特定的地区传递给FORMATMESSAGE,通过使用sys.messages而不是文字格式字符串使其具有确定性,但没有成功。
然而,有关确定性和非确定性函数的最新MS信息并没有具体说明FORMATMESSAGE是非确定性的。因此,
有没有人找到在索引视图中使用FORMATMESSAGE的方法?
以下是我的简化测试代码:
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!)持久化。然而,
CREATE UNIQUE CLUSTERED INDEX IX_Extension ON dbo.vwExtensions (ID)给出错误:
Cannot create index on view 'TEST_DB.dbo.vwExtensions'. The function 'formatmessage' yields nondeterministic results. Use a deterministic system function, or ...注意:我是而不是,我正在寻找计算列的解决方案,因为这里不重要的其他原因。(这不允许在任何情况下将计算列的persisted属性设置为true,原因与上面完全相同)。
编辑:应该在这里添加-我需要使用FORMATMESSAGE (或某些确定性的选择),而不是连接(右)。等,因为格式字符串也存储在表中,而不是硬编码,如这里所示。上面我的代码的简化版本并没有说明这一点。
发布于 2019-03-13 11:13:16
尝试使用确定性函数:
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然后创建索引:
CREATE UNIQUE CLUSTERED INDEX IX_Extension ON dbo.vwExtensions (ID)https://stackoverflow.com/questions/55139995
复制相似问题