根据官方 Microsoft BOL DENSE_RANK 是不确定的(RANK())。但根据Itzik Ben-Gan 的排名函数 “...... RANK() 和 DENSE_RANK() 函数总是确定性的”。谁是对的?
到目前为止我发现: 微软的定义“确定性函数在任何时候使用一组特定的输入值调用它们时总是返回相同的结果,并给出相同的数据库状态。”
所以在集合理论表雇员
Employee Salary
Sue Right 1.00
Robin Page 1.00
Phil Factor 1.00
Run Code Online (Sandbox Code Playgroud)
和员工2
Employee Salary
Phil Factor 1.00
Sue Right 1.00
Robin Page 1.00
Run Code Online (Sandbox Code Playgroud)
是相同的。但是排名函数返回不同的值:
CREATE TABLE [dbo].[Employees](
--[ID] [int] IDENTITY(1,1) NOT NULL,
[Employee] [varchar](150) NOT NULL,
[Salary] [smallmoney] NULL,
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Employees2](
--[ID] [int] IDENTITY(1,1) NOT NULL,
[Employee] [varchar](150) NOT NULL,
[Salary] [smallmoney] NULL,
) ON …
Run Code Online (Sandbox Code Playgroud) 最近偶然发现以下问题:更改元数据会更改查询输出。
\n\n以下是如何获取它。
\n\nCREATE TABLE [dbo].[prod]\n(\n[ID] [tinyint] NOT NULL,\n[values] [tinyint] NOT NULL\n) \nGO\n
Run Code Online (Sandbox Code Playgroud)\n\n以下查询始终返回 \xe2\x80\x98This is the end\xe2\x80\x99 (始终引发错误)。此外,过滤器应该是某种随机生成器。
\n\nBEGIN TRY\nSELECT [id] FROM \n (\n SELECT [id] as [id]\n FROM dbo.prod\n WHERE ([id]=1/0)\n ) t1\nWHERE\n-- Random generator 1 always returns false\n(FLOOR(RAND()*(1))=1)\n-- Random generator 2 does not always return false\n/*\nSUBSTRING( cast(NEWID() as varchar(max)), 1, 1)\nIN ('1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'A', 'B', 'C', 'D', 'E', 'F')\n*/\n-- Random generator 3 does not always return …
Run Code Online (Sandbox Code Playgroud)