【问题标题】:SQL Query Notifications and GetDate()SQL 查询通知和 GetDate()
【发布时间】:2026-01-12 02:30:01
【问题描述】:

我目前正在处理为查询通知注册的查询。根据通知服务的规则,我只能在为订阅设置的查询中使用确定性函数。但是,GetDate()(以及我能想到的几乎任何其他方式)都是不确定的。每当我提取数据时,我希望能够将结果集限制为仅由当天确定的相关记录。

有谁知道我可以使用的一种解决方法,它允许我使用当前日期来过滤我的结果,但不会使查询通知的查询无效?

示例代码:

SELECT fcDate as RecordDate, fcYear as FiscalYear, fcPeriod as FiscalPeriod, fcFiscalWeek as FiscalWeek, fcIsPeriodEndDate as IsPeriodEnd, fcPeriodWeek as WeekOfPeriod
FROM dbo.bFiscalCalendar 
WHERE fcDate >= GetDate() -- This line invalidates the query for notification...

其他想法:

我们的数据库中有一个应用程序控制表,用于存储应用程序级别的设置。我曾想过编写一个小脚本,用当前的 smalldatetime 保持记录是最新的。但是,我加入此表的通知也失败了,我不知道为什么。我推测它与我指定文本类型(列名)有关,这很令人沮丧。

示例代码 2:

SELECT fcDate as RecordDate, fcYear as FiscalYear, fcPeriod as FiscalPeriod, fcFiscalWeek as FiscalWeek, fcIsPeriodEndDate as IsPeriodEnd, fcPeriodWeek as WeekOfPeriod
FROM dbo.bFiscalCalendar    
INNER JOIN dbo.xApplicationControls ON  fcDate >= acValue AND acName = N'Cache_CurrentDate' 

有人有什么建议吗?

编辑:这是一个link on MSDN,它给出了通知服务的规则

【问题讨论】:

    标签: sql-server notificationservices


    【解决方案1】:

    事实证明,我找到了解决方案。基本上,我使我的查询尝试无效,因为我将一个值转换为 DateTime,将其标记为非确定性。即使您没有专门调用演员表,但会做类似的事情:

    RecordDate = 'date_string_value'
    

    你最终还是会得到一个日期演员表。希望这会帮助其他遇到此问题的人。

    这个链接对我帮助很大。

    http://msdn.microsoft.com/en-us/library/ms178091.aspx

    【讨论】:

      【解决方案2】:

      绕过此问题的一个好方法是创建一个仅显示“SELECT GetDate() AS Now”的视图,然后在查询中使用该视图。

      编辑:我看不到不使用用户定义的函数(这就是我使用的“今天的视图”位)。那么您可以在指向视图的查询中使用 UDF 吗?

      【讨论】:

      • 很遗憾,通知服务的查询也不允许访问视图。
      • UDF 怎么样?我没有看到他们被禁止的参考
      • UDF 是允许的,但前提是它们也不包含非确定性函数(至少,我 99% 确信这是正确的)。我会仔细检查这个选项。谢谢。
      • 事实证明,它们必须是确定性的 UDF,SQL Server 会根据其中的查询进行调用。它最终是同样的问题。好主意。