我在表格中有一个XML列;我希望将该XML中的某个值“提升”为计算列,并将其编入索引以便加快搜索速度。我有一个函数,它接收XML信息并输出感兴趣的元素,如下所示:
CREATE FUNCTION [dbo].[fComputeValue] (@data XML)
RETURNS datetime
WITH SCHEMABINDING
AS
BEGIN
RETURN @data.value('(/Metadata/Value[@Key="StartDate"])[1]', 'datetime')
END
但是,当我尝试创建计算列时:
ALTER TABLE dbo.CustomMetadataTable ADD [StartDate] AS ([dbo].[fComputeValue]([CustomMetadataColumn])) PERSISTED
我收到以下错误:
Msg 4936,Level 16,State 1,Line 2 计算列 '开始日期' 在'CustomMetadataTable'表中不能 因为列是持久的 非确定性。
如果我:
我还应该提到日期时间值是XSD日期时间格式。 有任何想法吗?感谢。
答案 0 :(得分:7)
怎么样:
CREATE FUNCTION [dbo].[fComputeValue] (@data XML)
RETURNS varchar(50)
WITH SCHEMABINDING
AS
BEGIN
RETURN @data.value('(/Metadata/Value[@Key="StartDate"])[1]', 'varchar(50)')
END
和
ALTER TABLE dbo.CustomMetadataTable ADD [StartDate] AS (convert(datetime,([dbo].[fComputeValue]([CustomMetadataColumn]), 127)) PERSISTED
或:
return convert(datetime, @data.value('(/Metadata/Value[@Key="StartDate"])[1]', 'varchar(50)'), 127)
来自网上书籍:
CONVERT
除非是确定性的 这些条件存在:源类型是sql_variant。
目标类型是sql_variant及其 源类型是不确定的。
源或目标类型是datetime或 smalldatetime,另一个来源或 target type是一个字符串,和 指定了一个非确定性样式。 要确定性,风格 参数必须是常量。 另外,样式小于或 等于100是不确定的, 样式20和21除外。样式 超过100是确定性的, 样式106,107,109和 113。
如果您使用CONVERT
样式127