小编Kas*_*ash的帖子

SQL Server GUID排序算法.为什么?

UniqueIdentifiers存在问题

我们有一个现有的数据库,它广泛地使用uniqueidentifiers(不幸的是!)作为主键和一些表的一些可空列.我们遇到了这样一种情况,即在这些表上运行的某些报告会对这些uniqueidentifier进行排序,因为表中没有其他列可以进行有意义的排序(这不具有讽刺意味!).目的是排序,以便按照插入顺序显示项目,但不使用NewSequentialId()插入它们 - 因此浪费时间.

有关排序算法的事实

无论如何,考虑到SQL Server根据从结束的第5个字节组(6个字节)开始的字节组排序uniqueidentifier并向第1个字节组(4个字节)移动,从右到左反转第3个字节组(2个字节)的顺序到左右,

我的问题

我很想知道是否有任何真实的生活情况,这种情况有点帮助.

SQL Server如何在内部存储uniqueidentifier,这可能会提供有关它为何具有这种糟糕的排序算法的见解?

参考:

Alberto Ferrari发现了SQL Server GUID排序

当您在具有以下数据的uniqueidentifier列上使用Order By时,Uniqueidentifier按如下所示排序.

请注意,以下数据按升序排序,最高排序首选项是从第5个字节组到第1个字节组(向后).

-- 1st byte group of 4 bytes sorted in the reverse (left-to-right) order below -- 

01000000-0000-0000-0000-000000000000
10000000-0000-0000-0000-000000000000
00010000-0000-0000-0000-000000000000
00100000-0000-0000-0000-000000000000
00000100-0000-0000-0000-000000000000
00001000-0000-0000-0000-000000000000
00000001-0000-0000-0000-000000000000
00000010-0000-0000-0000-000000000000

-- 2nd byte group of 2 bytes sorted in the reverse (left-to-right) order below -- 

00000000-0100-0000-0000-000000000000
00000000-1000-0000-0000-000000000000
00000000-0001-0000-0000-000000000000
00000000-0010-0000-0000-000000000000

-- 3rd byte group of 2 bytes sorted in the reverse (left-to-right) order below -- 

00000000-0000-0100-0000-000000000000
00000000-0000-1000-0000-000000000000
00000000-0000-0001-0000-000000000000 …
Run Code Online (Sandbox Code Playgroud)

sql-server sorting sql-server-2005 sql-server-2008

36
推荐指数
2
解决办法
2万
查看次数

Visual Studio 2010中的项目构建顺序?

我们有一个Visual Studio 2010解决方案,有超过120个项目以某种方式相互引用.所有项目间引用都是项目引用,而不是文件引用,这有助于Visual Studio自动确定项目构建顺序.在120个中,我们有一些核心项目彼此不相互依赖,这些项目被其他项目广泛引用.因此,这些项目位于项目构建顺序的顶部.这些核心项目引用了.NET框架,Enterprise Library(其中一些包含第三方dll文件引用,如zip实用程序).

我无法弄清楚为什么这些核心项目是以特定方式订购的.非相互依赖项目的项目构建顺序的算法是什么?

PS:我明白我可以通过使用Project Dependencies的Dependencies选项卡创建一个假的依赖来影响这个顺序.

build project-reference visual-studio-2010

24
推荐指数
1
解决办法
2万
查看次数

将日期时间值设置为SQL Server中的变量的正确方法

可能重复:
转换和验证日期字符串的最佳方法

在SQL Server中为datetime变量分配日期时间值时,哪种格式最适合用于文化无关的原因以及为什么?

下面的日期是2013年12月1日

DECLARE @myDate DATETIME
SET @myDate = '2013-12-01'
SET @myDate = '20131201'
SET @myDate = '12/01/2013'
SET @myDate = '2013-12-01T00:00:00.000'
SET @myDate = '2013-12-01T00:00:00'
Run Code Online (Sandbox Code Playgroud)

如果@myDate是类型DATETIME2,你的答案会不同吗?

sql-server datetime

13
推荐指数
2
解决办法
8万
查看次数

如何使用java regex检测一个字符串包含多个字符之一

我有一个可变长度的字符串,我只想检测这个字符串是否包含多个字符.例如:

"sadsdd$sss^dee~"
Run Code Online (Sandbox Code Playgroud)

我想检测此字符串是否包含以下任何内容:$ ^ ~.我怎么能用Java做到这一点string.matches

"sadsdd$sss^dee~".matches("[^+$+~+]");
Run Code Online (Sandbox Code Playgroud)

java regex

4
推荐指数
1
解决办法
5138
查看次数

C#自定义迭代器实现 - 防止在foreach循环期间修改集合

我创建了一个实现IEnumerable(T)和自定义IEnumerator(T)的自定义集合.

我还在自定义集合中添加了一个Add()方法,如下所示:

public void Add(T item)
{
    T[] tempArray = new T[_array.Length + 1];

    for (int i = 0; i < _array.Length; i++)
    {
        tempArray[i] = _array[i];
    }

    tempArray[_array.Length] = item;

    _array = tempArray;
    tempArray = null;
}
Run Code Online (Sandbox Code Playgroud)

该实现基于此示例http://msdn.microsoft.com/en-us/library/system.collections.ienumerator.aspx.

当我使用我的数组进行foreach循环时,我想阻止集合修改(比如在循环中调用Add())并抛出一个新的InvalidOperationException.我怎么能这样做?

c# foreach iterator invalidoperationexception

3
推荐指数
1
解决办法
540
查看次数

强制SSRS 2008使用SSRS 2005 CSV呈现

我们正在将报表服务器从SSRS 2005升级到SSRS 2008 R2。
我对SSRS 2008的CSV导出渲染有一个问题,其中列的SUM出现在2008年的明细值的右侧,而不是像2005年那样显示在左侧,如下图所示。
117131分别是Column2和Column3的总和。

SSRS 2005 CSV输出

Column2_1,Column3_1,Column2,Column3
117,131,1,2
117,131,1,2
117,131,60,23
117,131,30,15
117,131,25,89
Run Code Online (Sandbox Code Playgroud)

SSRS 2008 CSV输出

Column2,Column3,Column2_1,Column3_1
1,2,117,131
1,2,117,131
60,23,117,131
30,15,117,131
25,89,117,131
Run Code Online (Sandbox Code Playgroud)

我知道CSV渲染器在SSRS 2008 R2中进行了重大更改,并支持图表和仪表,更重要的是它提供了2种模式:默认Excel模式和Compliant模式。但是两种模式都无法解决此问题。合规模式本来应该与2005年最接近,但是显然对于我的情况来说还不够。

我的问题:
是否有一种方法可以强制SSRS 2008将报告回退到向后兼容模式,以便将其导出为2005 CSV格式?

尝试过的解决方案:
a)使用基于2005的CRI
基于本文在ExecutionLog2上的内容,如果SSRS 2008 R2遇到无法自动升级的报告(例如,使用基于2005的CustomReportItem控件构建的报告),则这些特定报告将为使用旧的Yukon引擎以“透明的向后兼容模式”进行处理。

似乎它回到了先前的版本模式(2005)并尝试呈现它。因此,我尝试使用基于2005的条形码CustomReportItem并将其部署到SSRS 2008 R2报表服务器,但是它显示了与以前相同的结果,尽管它抑制了条形码。这是因为SSRS 2008 R2找到了一种抑制部分报告输出并显示其余部分的方法。很高兴找到一个基于2005的CRI,它使SSRS 2008 R2使用其旧的Yukon引擎对其进行处理。请注意,即使它使用“旧的Yukon处理引擎”,也很有可能仍使用新的CSV渲染器,因此它显示相同的输出。如果是这样,那么这个选项就没有意义了。

b)使用XML渲染器
我们可以使用自定义XML渲染器,然后使用XSLT将xml转换为适当的CSV,但这意味着我们需要转换所有200个报告。因此,这是不可行的。

请注意,我们不能选择同时部署SSRS 2005和SSRS 2008 R2。

reportingservices-2005 reporting-services ssrs-2008 export-to-csv ssrs-2008-r2

3
推荐指数
1
解决办法
4176
查看次数

NVARCHAR 的奇怪异常

这给出了一个例外:'NVARCHAR' 不是公认的内置函数名称。

DECLARE @BatchIds TABLE
    (
      BatchId AS UNIQUEIDENTIFIER ,
      UserLogonId AS NVARCHAR(80) ,
      ReportStatus NVARCHAR(100) ,
      Created DATETIME ,
      RunTimeInMins AS INT ,
      ReportName NVARCHAR(200)
    )
Run Code Online (Sandbox Code Playgroud)

当我删除 NVARCHAR 的“AS”时,它不会给出任何异常。

DECLARE @BatchIds TABLE
    (
      BatchId AS UNIQUEIDENTIFIER ,
      UserLogonId NVARCHAR(80) ,
      ReportStatus NVARCHAR(100) ,
      Created DATETIME ,
      RunTimeInMins AS INT ,
      ReportName NVARCHAR(200)
    )
Run Code Online (Sandbox Code Playgroud)

关于为什么的任何建议?

更新:

请注意,我的问题更多地是针对为什么 AS 在这种情况下在幕后的工作方式不同,而不是试图解决工作情况。对于那些无法使第二个示例工作的人,请尝试此操作。这为我提供了与Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64)相同的数据和 SQL Server 版本。

DECLARE @BatchIds TABLE
    (
      UserLogonId NVARCHAR(80) , …
Run Code Online (Sandbox Code Playgroud)

sql-server nvarchar

2
推荐指数
1
解决办法
3464
查看次数