假设没有使用 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
这将被称为这样的:
select X.c theChar, unicode(X.c) uValue
from myTable T
cross apply foo.AllChars(T.myCol) X
并将为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
结果以字符在T.myCol中出现的顺序返回,因此也以它们插入@t
. 如果没有 ORDER BY 子句,该顺序是否得到保证?
显示顺序仅由顶级
ORDER BY
.您可以重写函数以返回位置键并使其内联:
我
COLLATE
在那里使用一个子句来演示增补字符。使用默认的数据库排序规则可能没问题。用法示例:
结果:
数据库<>小提琴
相关:MS SQL Server 是否具有 generate_series 函数
另请参阅Aaron Bertrand 的无循环生成集合或序列。
如果没有 order by 条款,则无法保证任何订单。如果您在表变量上创建了索引,您可能会很幸运并根据各种优化器选择按索引顺序返回数据,但仍然无法以任何方式保证。
由于您使用的是 Unicode 数据类型,因此您还需要了解排序顺序中的各种排序规则差异。它也可能发生在非 Unicode 字符串上,但重音等周围的变量较少。