【问题标题】:Getting an error due to using isDate() in a function which in turn is a formula for a column由于在函数中使用 isDate() 而出现错误,而函数又是列的公式
【发布时间】:2016-05-19 07:59:09
【问题描述】:

我需要以下内容才能在 SQL Server 2008 R2 上工作

我有一个列要添加到一个需要与之关联的公式的表中,我正在使用一个标量值函数。

这是函数:

ALTER FUNCTION [dbo].[fnGetSaleDate_fromXML]
(
    @transaction_data    xml
)

RETURNS date

WITH SCHEMABINDING
AS
BEGIN
    declare @dateXmlValue   varchar(20)
    declare @dateAssembledValueStr  varchar(20)
    declare @dateValue  date

    set @dateXmlValue = '19052014' --this ultimately comes from another column
if @dateXmlValue <> 'Not supplied'
    BEGIN
        set @dateAssembledValueStr = concat(substring(@dateXmlValue, 5, 4), substring(@dateXmlValue, 3, 2), substring(@dateXmlValue, 1, 2))
        if ISDATE(@dateAssembledValueStr) = 1
            BEGIN
                set @dateValue = CONVERT(date, @dateAssembledValueStr, 103)         
            END
    END
    return @dateValue
END

我已经用有效和无效数据测试了这个函数,它工作得很好。

当我尝试将其添加为专栏的论坛时,我收到错误:

Msg 4936, Level 16, State 1, Line 1 Computed column 'contxxxxxe' in table 'propexxxxxxxxxn' cannot be persisted because the column is non-deterministic.

如果我用if ISDATE(@dateAssembledValueStr) = 1 注释该行,它可以正常工作。

研究表明,使用isDate()(除非在非常特殊的情况下)是不确定的。我的问题是,鉴于我的要求,除了自己重新创建 IsDate() 之外,我该如何解决这个问题?

【问题讨论】:

  • 什么版本的 SQL Server?
  • SQL Server 2012。我也会编辑帖子。
  • @VojtěchDohnal .... 这是一个快速编辑。使用 Sql-Server 标签而不是 sql-server-2012 标签搜索问题的人也能看到这个吗?我在问,因为即使我使用的是 sql server 2012,我也不知道问题是否仅针对此版本的 Sql Server,这就是我最初使用 sql-server 标记的原因。
  • 我想我在某处读到这些标签效果很好,当您添加sql-server-2012 时,无需添加一般sql-server。但现在找不到任何参考。但现在我在这里看到了其他答案:meta.stackexchange.com/questions/18878/…
  • 有些标签有同义词 - sql-server-2012sql-server 就是这种情况。

标签: sql sql-server sql-server-2012 sql-server-2008-r2


【解决方案1】:

在 SQL Server 2012 上将 ISDATE 替换为 TRY_CONVERT()

https://msdn.microsoft.com/en-us/library/hh230993.aspx

set @dateValue = TRY_CONVERT(date, @dateAssembledValueStr, 103)
if @dateValue IS NULL
        --handle invalid date string

在 SQL Server 2008 R2 上,您可以创建自己的 CLR 函数。 See this articlethis question

即使您将带有ISDATE 函数的行更改为

if ISDATE(CONVERT(varchar,@dateAssembledValueStr,112)) = 1 

错误保持不变,您可能在this very similar question here 中找到相同的答案。

【讨论】:

  • 感谢@VojtěchDohnal。关于之前的评论。即使我使用的是 SQL Server 2012,我也需要一些可以使用 SQL 2008 R2 的东西,因为我们的生产系统使用的是 SQL 2008R2。
  • 我不能在 UDF 中使用 try catch
  • @AshwinNair 看来您需要在T-SQL中编写自己的ISDATE函数或使用CLR函数。
猜你喜欢
  • 1970-01-01
  • 2019-08-13
  • 2019-03-05
  • 1970-01-01
  • 2014-10-10
  • 2022-01-02
  • 1970-01-01
  • 2018-12-29
  • 2023-03-21
相关资源
最近更新 更多