SQLSCRIPT_STRING 库为处理字符串提供了一种方便简单的方式。您可以使用给定的分隔符或正则表达式拆分库,设置字符串的格式或重新排列,并将表变量转换为已经可用的字符串。
代码语法CREATE LIBRARY SYS.SQLSCRIPT_STRING LANGUAGE SQLSCRIPT AS BUILTINBEGIN FUNCTION SPLIT(IN VALUE NVARCHAR(5000), IN SEPARATOR NVARCHAR(5000), IN MAXSPLIT INT DEFAULT -1) RETURNS ...; FUNCTION SPLIT_TO_TABLE(IN VALUE NVARCHAR(5000), IN SEPARATOR NVARCHAR(5000), IN MAXSPLIT INT DEFAULT -1) RETURNS TABLE(RESULT NVARCHAR(5000)); FUNCTION SPLIT_TO_ARRAY(IN VALUE NVARCHAR(5000), IN SEPARATOR NVARCHAR(5000), IN MAXSPLIT INT DEFAULT -1) RETURNS RESULTS NVARCHAR(5000) ARRAY; FUNCTION SPLIT_REGEXPR(IN VALUE NVARCHAR(5000), IN REGEXPR NVARCHAR(5000), IN MAXSPLIT INT DEFAULT -1) RETURNS ...; FUNCTION SPLIT_REGEXPR_TO_TABLE(IN VALUE NVARCHAR(5000), IN REGEXPR NVARCHAR(5000), IN MAXSPLIT INT DEFAULT -1) RETURNS TABLE(RESULT NVARCHAR(5000)); FUNCTION SPLIT_REGEXPR_TO_ARRAY(IN VALUE NVARCHAR(5000), IN REGEXPR NVARCHAR(5000), IN MAXSPLIT INT DEFAULT -1) RETURNS RESULTS NVARCHAR(5000) ARRAY; FUNCTION FORMAT(IN FORMAT NVARCHAR(5000), IN ...) RETURNS RESULT NVARCHAR(8388607); FUNCTION FORMAT_TO_TABLE(IN FORMAT NVARCHAR(5000), IN TABLE(...)) RETURNS TABLE(RESULT NVARCHAR(8388607)); FUNCTION FORMAT_TO_ARRAY(IN FORMAT NVARCHAR(5000), IN TABLE(...)) RETURNS RESULTS NVARCHAR(8388607) ARRAY; FUNCTION TABLE_SUMMARY(IN TABLE TABLE(...), IN ROWS INT DEFAULT 100) RETURNS RESULT NVARCHAR(8388607); END;
SPLIT(_REGEXPR) 函数根据给定的参数返回多个变量。
SPLIT_TO_ARRAY(REGEXPR) 返回包含 N 个分隔字符串的 NVARCHAR(5000) 数组
SPLIT_TO_TABLE(_REGEXPR) 返回表类型为 (WORD NVARCHAR(5000)) 的单个列表
示例代码DO BEGIN USING SQLSCRIPT_STRING AS LIB; DECLARE a1, a2, a3 INT; (a1, a2, a3) = LIB:SPLIT('10, 20, 30', ', '); --(10, 20, 30)END; DO BEGIN USING SQLSCRIPT_STRING AS LIB; DECLARE first_name, last_name STRING; DECLARE area_code, first_num, last_num INT; first_name = LIB:SPLIT('John Sutherland', ','); --('John Sutherland') (first_name, last_name) = LIB:SPLIT('John Sutherland', ' '); --('John','Sutherland') first_name = LIB:SPLIT('Brian', ' '); --('Brian') (first_name, last_name) = LIB:SPLIT('Brian', ' '); -- throw SQL_FEW_VALUES (first_name, last_name) = LIB:SPLIT('Michael Forsyth Jr', ' ');--throw SQL_MANY_VALUES (first_name, last_name) = LIB:SPLIT('Michael Forsyth Jr', ' ', 1); --('Michael', 'Forsyth Jr') (area_code, first_num, last_num) = LIB:SPLIT_REGEXPR('02)2143-5300', '\(|\)|-'); --(02, 2143, 5300)END; DO BEGIN USING SQLSCRIPT_STRING AS LIB; DECLARE arr INT ARRAY; DECLARE arr2 STRING ARRAY; DECLARE tv, tv2 TABLE(RESULT NVARCHAR(5000)); arr = LIB:SPLIT_TO_ARRAY('10,20,30,40,50',','); --array(10,20,30,40,50) arr2 = LIB:SPLIT_REGEXPR_TO_ARRAY('Blake Kelly; Fred Randall; Bell Walsh; Leonard Quinn; Chris McDonald', '\s*;\s*'); --array('Blake Kelly', 'Fred Randall', 'Bell Walsh', 'Leonard Quinn', 'Chris McDonald') tv = LIB:SPLIT_TO_TABLE('10,20,30,40,50',','); --table[(10),(20),(30),(40),(50)] tv2 = LIB:SPLIT_REGEXPR_TO_TABLE('10+20/30*40-50', '\+|\/|\*|-'); --table[(10),(20),(30),(40),(50)]END; 备注 SPLIT_TO_TABLE 函数当前不支持隐式表变量声明。 CREATE PROCEDURE SPLIT_TO_TABLE_TEST AS BEGIN USING SQLSCRIPT_STRING AS lib; DECLARE tv TABLE(RESULT NVARCHAR(5000)); --Needs explicit table variable declaration tv = LIB:SPLIT_TO_TABLE('a,b',','); SELECT * FROM :tv;END; CALL SPLIT_TO_TABLE_TEST(); -- [(a), (b)]
FORMAT 函数支持新的 Python 样式格式。
代码语法replacement_field := "{" [field_name] [":"format_spec] "}"field_name := [column_name | integer]format_spec := [sign][0][width][.precision][type]sign := "+" | "-" | " "width := integerprecision := integertype := "s" | "b" | "c" | "d" | "o" | "x" | "X" | "e" | "E" | "f" | "F" | "g" | "G" 字符串表示类型 类型含义's'字符串格式没有与 's' 相同 整数表示类型 类型含义'b'二进制格式'c'字符'd'小数整数'o'Octal 格式'x'HEX 格式。在结果中使用小写字母'X'HEX 格式。在结果中使用大写字母没有与 'd' 相同 浮点和小数值表示类型 类型含义'e'指数表示法。缺省精度为 6。'E'指数表示法。在结果中使用大写字母 'E'。'f'固定点。缺省精度为 6。'F'固定点。NAN 用于 nan,INF 用于结果中的 inf。'g'常规格式。缺省精度为 6。类型为 'e',精度为 p-1,数字具有指数指数如果 -4 <= exp < p,则与 'f' 相同,精度为 p-1-exp否则,与 'e' 相同,精度为 p - 1'G'常规格式。在结果中使用大写字母 'E'。没有类似于 'g'。缺省精度为表示数字所需的高精度。
类型示例基本FORMAT('{} {}', 'one', 'two') => 'one two'FORMAT('{1} {0}', 1, 2) => '2 1'截断长字符串FORMAT('{:.5}', 'xylophone') =>'xylop'FORMAT('{:10.5}', 'xylophone') => 'xylop '编号FORMAT('{:d}', 42) => '42'FORMAT('{:f}', 3.141592653589793) => '3.141593'FORMAT('{:g}', 123456) => '123456'FORMAT('{:g}', 1234567) => '1.23456e+06'FORMAT('{:g}', 0.000123456) => '0.000123456'FORMAT('{:g}', 0.0000123456) => '1.23456e-05'填充编号FORMAT('{:4d}', 42) => ' 42'FORMAT('{:06.2f}', 3.141592653589793) => '003.14'FORMAT('{:04d}', 42) => '0042'带符号的编号FORMAT('{:+d}', 42) => '+42'FORMAT('{: d}', -23) => '-23'FORMAT('{: d}', 42) => ' 42'列名称tv = select 1 as first, 2 as last from dummy;FORMAT_TO _TABLE('{first} {last}', :tv) => [('1 2')]FORMAT_TO _TABLE('{first:04d} {last:02d}', :tv) => [('0001 02')]
使用给定的格式字符串和其他参数返回单个格式字符串。支持两种类型的附加参数:标量变量和单个数组。第一个参数类型仅接受标量变量,并且应具有正确的参数数量和类型。对于第二个参数类型,仅允许一个应具有正确大小和类型的数组。
返回具有 N 格式字符串且使用给定表变量的表或数组。FORMAT STRING 逐行应用。
示例代码DO BEGIN USING SQLSCRIPT_STRING AS LIB; DECLARE your_name STRING = LIB:FORMAT('{} {}', 'John', 'Sutherland'); --'John Sutherland' DECLARE name_age STRING = LIB:FORMAT('{1} {0}', 30, 'Sutherland'); --'Sutherland 30' DECLARE pi_str STRING = LIB:FORMAT('PI: {:06.2f}', 3.141592653589793); --'PI: 003.14'DECLARE ts STRING = LIB:FORMAT('Today is {}', TO_VARCHAR (current_timestamp, 'YYYY/MM/DD')); --'Today is 2017/10/18' DECLARE scores double ARRAY = ARRAY(1.4, 2.1, 40.3); DECLARE score_str STRING = LIB:FORMAT('{}-{}-{}', :scores); --'1.4-2.1-40.3'END; DO BEGIN USING SQLSCRIPT_STRING AS LIB; DECLARE arr NVARCHAR(5000) ARRAY; declare tv table(result NVARCHAR(5000)); --tt: [('John', 'Sutherland', 1988), ('Edward','Stark',1960)] DECLARE tt TABLE (first_name NVARCHAR(100), last_name NVARCHAR(100), birth_year INT); tt.first_name[1] = 'John'; tt.last_name[1] = 'Sutherland'; tt.birth_year[1] = 1988; tt.first_name[2] = 'Edward'; tt.last_name[2] = 'Stark'; tt.birth_year[2] = 1960; arr = LIB:FORMAT_TO_ARRAY('{first_name} {last_name} was born in {birth_year}', :tt); --['John Sutherland was born in 1988', 'Edward Stark was born in 1960'] tv = LIB:FORMAT_TO_TABLE('{first_name} {last_name} was born in {birth_year}', :tt); --tv: [('John Sutherland was born in 1988'), ('Edward Stark was born in 1960')]END;
TABLE_SUMMARY 将表变量转换为单个格式化字符串。它将表序列化为人性化格式,类似于客户端中的当前结果集。由于该表被序列化为单个字符串,因此结果是在 PROCEDURE 执行期间读取的,而不是在客户端获取时读取的。参数 MAX_RECORDS 限制要序列化的行数。如果格式化字符串的大小大于 NVARCHAR(8388607),则仅返回字符串的有限大小。
通过 SQLScript FORMAT 函数,表中的值的格式如下:
示例代码CREATE TABLE SAMPLE1(NAME nvarchar(32), AGE INT);INSERT INTO SAMPLE1 VALUES ('John Bailey', 28);INSERT INTO SAMPLE1 VALUES ('Kevin Lawrence', 56);INSERT INTO SAMPLE1 VALUES ('Leonard Poole', 31);INSERT INTO SAMPLE1 VALUES ('Vanessa Avery', 16); DOBEGIN USING SQLSCRIPT_STRING AS STRING; USING SQLSCRIPT_PRINT AS PRINT; T1 = SELECT * FROM SAMPLE1; PRINT:PRINT_LINE(STRING:TABLE_SUMMARY(:T1, 3));END;------------------------NAME,AGEJohn Bailey,28Kevin Lawrence,56Leonard Poole,31