Tim*_*Tim 4 sql-server determinism t-sql set-returning-functions non-deterministic
假设不使用 ORDER BY 子句,在实例化表并用连续插入填充表的 TABLE 值函数中,插入顺序是否具有确定性?
我需要查看发送给我们的给定数据集中使用的 Unicode 字符范围,以便弄清楚为什么 SSMS 中的查询结果中的某些空格(或者至少在眼睛看来是空格)没有被使用。在某些解析例程中,其行为类似于 char(32)。因此,我编写了一个快速而肮脏的函数,将相关列中的字符串值转换为一组可以查询的元组:
create function [foo].[AllChars]
(@in nvarchar(max))
returns @t TABLE (c nchar(1))
as
begin
declare @i int;
while len(@in)>0
begin
insert @t(c) values (left(@in,1));
set @in = substring(@in, 2, len(@in)-1)
end
return;
end
Run Code Online (Sandbox Code Playgroud)
可以这样称呼:
select X.c theChar, unicode(X.c) uValue
from myTable T
cross apply foo.AllChars(T.myCol) X
Run Code Online (Sandbox Code Playgroud)
并将为myTable中的每一行返回一组元组:
t 116
h 104
e 101
32
c 99
a 97
t 116
10 <= culprit
i 105
n 110
32
t 116
h 104
e 101
32
h 104
a 97
t 116
Run Code Online (Sandbox Code Playgroud)
返回的结果按照字符在T.myCol中出现的顺序以及它们插入到 中的顺序@t
。如果没有 ORDER BY 子句,该顺序是否得到保证?
显示顺序仅由顶级ORDER BY
.
您可以重写该函数以返回位置键并使其内联:
\nCREATE OR ALTER FUNCTION dbo.AllChars\n(\n @in nvarchar(max)\n)\nRETURNS table\nAS\nRETURN\nSELECT\n Position = S.[value],\n TheCharacter = \n SUBSTRING\n (\n @in COLLATE Latin1_General_100_CI_AS_SC, \n S.[value], \n 1\n )\nFROM GENERATE_SERIES\n(\n CONVERT(bigint, 1), -- Types must match exactly\n LEN(@in) - 1, -- LEN returns bigint for max input\n CONVERT(bigint, 1) -- Types must match exactly\n) AS S;\n
Run Code Online (Sandbox Code Playgroud)\n我COLLATE
在那里使用一个子句来演示补充字符。您可能会习惯使用默认的数据库排序规则。
用法示例:
\nDECLARE @in nvarchar(max) = \n CONCAT(N\'the cat in\', NCHAR(10), N\'the hat\');\n\nSELECT \n AC.Position, \n AC.TheCharacter,\n Bytes = DATALENGTH(AC.TheCharacter),\n Code = UNICODE(AC.TheCharacter)\nFROM dbo.AllChars(@in) AS AC\nORDER BY\n AC.Position ASC;\n
Run Code Online (Sandbox Code Playgroud)\n结果:
\n位置 | 人物 | 字节 | 代码 |
---|---|---|---|
1 | t | 2 | 116 |
2 | H | 2 | 104 |
3 | 这是 | 2 | 101 |
4 | 2 | 32 | |
5 | 4 | 128526 | |
6 | 2 | 32 | |
7 | C | 2 | 99 |
8 | A | 2 | 97 |
9 | t | 2 | 116 |
10 | 2 | 32 | |
11 | 我 | 2 | 105 |
12 | n | 2 | 110 |
13 | \xe2\x90\x8a | 2 | 10 |
14 | t | 2 | 116 |
15 | H | 2 | 104 |
16 | 这是 | 2 | 101 |
17 | 2 | 32 | |
18 | H | 2 | 104 |
19 | A | 2 | 97 |
20 | t | 2 | 116 |
相关:MS SQL Server 是否有generate_series 函数
\n另请参见Aaron Bertrand 的生成无循环的集合或序列。
\n 归档时间: |
|
查看次数: |
712 次 |
最近记录: |