由于它在SQL Server 2019中不可用(并且几乎肯定不会被后移),因此您无法启用它。
问题在于SSMS的IntelliSense /工具提示编码没有基于版本的条件逻辑,并且代码超前于引擎。目前,该功能仅在Azure SQL数据库,托管实例和Synapse中可用。
从文档:
参数enable_ordinal 和 ordinal
输出列目前仅在Azure SQL数据库,Azure SQL 托管实例和Azure Synapse Analytics(仅限无服务器SQL池)中受支持。
更多背景信息:
您可以创建自己的内联表值UDF来提供相同类型的序数输出(并使其返回与 STRING_SPLIT
相同的输出,以便稍后轻松更改)。有许多变体;这是其中之一:
CREATE FUNCTION dbo.SplitStrings_Ordered
(
@List nvarchar(max),
@Delimiter nvarchar(255)
)
RETURNS TABLE
AS
RETURN (SELECT value = Item ,
ordinal = ROW_NUMBER() OVER (ORDER BY Number),
FROM (SELECT Number, Item = SUBSTRING(@List, Number,
CHARINDEX(@Delimiter, @List + @Delimiter, Number) - Number)
FROM (SELECT ROW_NUMBER() OVER (ORDER BY s1.[object_id])
FROM sys.all_objects AS s1 CROSS JOIN sys.all_objects AS s2) AS n(Number)
WHERE Number <= CONVERT(INT, LEN(@List))
AND SUBSTRING(@Delimiter + @List, Number, LEN(@Delimiter)) = @Delimiter
) AS y);
GO
另一种更简单的方法是使用JSON,我最近在这个提示中甚至忘记了自己写过它:
CREATE FUNCTION dbo.SplitStrings_Ordered
(
@List nvarchar(max),
@Delimiter nchar(1)
)
RETURNS table WITH SCHEMABINDING
AS
RETURN
(
SELECT value, ordinal = [key]
FROM OPENJSON(N'["' + REPLACE(@List, @Delimiter, N'","') + N'"]') AS x
);
GO
此外,如果您只想获取1到4段名称中的最后一个序数,并且每个部分都小于等于128个字符,则可以使用PARSENAME()
函数:
DECLARE @str nvarchar(512) = N'here is one.here is two.and three.and four';
SELECT p1 = PARSENAME(@str, 4),
p2 = PARSENAME(@str, 3),
p3 = PARSENAME(@str, 2),
p4 = PARSENAME(@str, 1);
输出:
p1 |
p2 |
p3 |
p4 |
这里是一个 |
这里是两个 |
还有三个 |
最后是四个 |