【发布时间】:2017-04-29 03:29:22
【问题描述】:
一般问题
迁移到 SQL Server 2014 后,以前在 SQL Server 2008 R2 中每次执行都会产生不同结果的 CLR 标量函数的执行,现在每次后续调用都会产生相同的结果。
测试/插图
DECLARE @i int = 0;
WHILE @i < 10
BEGIN
print dbo.getEligLoadTXID();
--> Simulate delay as this code never gets called more than once every few seconds in our environment
WAITFOR DELAY '00:00:00.1';
SET @i += 1;
END;
我们目前正在将我们的环境从 SQL Server 2008 R2 升级到 SQL Server 2014。我们遇到的问题之一是特定于 CLR 标量函数的执行。功能比较简单;它正在根据滴答数生成一个内部 ID(我们不要争论这个函数的需求/目的)。
在 SQL Server 2008 R2 环境中,在循环中执行函数会返回预期结果(每次执行都会产生一个新值)。但是,在我们的新 SQL Server 2014 环境中进行测试时,相同的代码会为循环中的每次执行返回相同的值。
SQL Server 2008 R2 中的结果:
20161213502167209995
20161213502168210095
20161213502169210195
20161213502170210295
20161213502171210395
20161213502172210495
20161213502173210595
20161213502174210695
20161213502175210795
20161213502176210895
SQL Server 2014 中的结果:
20161213502199924787
20161213502199924787
20161213502199924787
20161213502199924787
20161213502199924787
20161213502199924787
20161213502199924787
20161213502199924787
20161213502199924787
20161213502199924787
我们使用此代码为我们收到的每个特定类型的文件生成一个特定 ID。为每个文件生成一个新值,但处理此问题的 SSIS 进程通常需要 4-5 秒来处理每个文件。所以,这个函数每隔几秒就会被调用一次,来自完全不同的连接,但我们仍然得到重复的结果。
返回值确实是周期性变化的,所以并不是整天只取回一个值,而是在一段时间内,无论是 3 秒还是 30 秒,函数都会返回相同的结果。
我们缺少什么?
CLR 函数定义
[SqlFunction(IsDeterministic = true, IsPrecise = true)]
public static String getTransactionID()
{
DateTime NOW = DateTime.Now;
long ticks = NOW.Ticks - new DateTime(NOW.Year, NOW.Month, NOW.Day, 0, 0, 0, 0).Ticks;
return String.Format("{0:0000}{1:00}{2:00}{3}", NOW.Year, NOW.Month, NOW.Day, ticks.ToString());
}
【问题讨论】:
标签: sql-server sql-server-2014 sqlclr