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) 我们有一个Visual Studio 2010解决方案,有超过120个项目以某种方式相互引用.所有项目间引用都是项目引用,而不是文件引用,这有助于Visual Studio自动确定项目构建顺序.在120个中,我们有一些核心项目彼此不相互依赖,这些项目被其他项目广泛引用.因此,这些项目位于项目构建顺序的顶部.这些核心项目引用了.NET框架,Enterprise Library(其中一些包含第三方dll文件引用,如zip实用程序).
我无法弄清楚为什么这些核心项目是以特定方式订购的.非相互依赖项目的项目构建顺序的算法是什么?
PS:我明白我可以通过使用Project Dependencies的Dependencies选项卡创建一个假的依赖来影响这个顺序.
可能重复:
转换和验证日期字符串的最佳方法
在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
,你的答案会不同吗?
我有一个可变长度的字符串,我只想检测这个字符串是否包含多个字符.例如:
"sadsdd$sss^dee~"
Run Code Online (Sandbox Code Playgroud)
我想检测此字符串是否包含以下任何内容:$
^
~
.我怎么能用Java做到这一点string.matches
?
"sadsdd$sss^dee~".matches("[^+$+~+]");
Run Code Online (Sandbox Code Playgroud) 我创建了一个实现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.我怎么能这样做?
我们正在将报表服务器从SSRS 2005升级到SSRS 2008 R2。
我对SSRS 2008的CSV导出渲染有一个问题,其中列的SUM出现在2008年的明细值的右侧,而不是像2005年那样显示在左侧,如下图所示。
117
和131
分别是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
这给出了一个例外:'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)