希望构建一个 SQL Server 函数,该函数从表中提取电话号码列表并以特定方式格式化它们,以便可以将它们传递到寻呼系统 API。
返回的值可以包含任意数量的电话号码,每个电话号码都需要用双引号括起来并用逗号分隔。
以下功能:
BEGIN DECLARE @MyRESULT varchar(max) DECLARE @PAGING_RESULTS nvarchar(max) DECLARE MyCursor CURSOR FOR SELECT PHONE_NUMBER FROM CONTACTS WHERE ON_CALL = 1 OPEN MyCursor FETCH NEXT FROM MyCursor INTO @MyRESULT WHILE @@FETCH_STATUS = 0 BEGIN Set @PAGING_RESULTS = isnull(@PAGING_RESULTS, '') + '"%2B' + isnull(@MyRESULT, '') + '",' FETCH NEXT FROM MyCursor INTO @MyRESULT END Close MyCursor deallocate MyCursor Set @PAGING_RESULTS = isnull(@PAGING_RESULTS, '') return @PAGING_RESULTS END
让我很接近,但它在结果末尾留下了一个额外的逗号,这会破坏 API 调用。
有没有更好的方法可以做到这一点,或者我可以在函数中做额外的工作来清理结果。
样本数据:
理想结果:
“1234567890”、“9876543210”、“7652341890”
当前函数确实返回了我的结果集,但末尾有一个额外/无效的逗号,例如:
“1234567890”、“9876543210”、“7652341890”、
非常感谢!
光标很慢,不要将它们用于简单的事情。
编辑:正如一些人所说,不要使用这种“聪明”的方式,因为可能会出现意想不到的结果:
-- DECLARE @MyRESULT varchar(max)='' -- SELECT @MyRESULT = @MyRESULT + '"%2B' + ISNULL(PHONE_NUMBER, '') + '",' -- FROM CONTACTS WHERE ON_CALL = 1 -- RETURN LEFT(@MyRESULT,LEN(@MyRESULT)-1)
当您的 MSSQL 版本为 2017 或更高版本时:
DECLARE @MyRESULT VARCHAR(MAX) SELECT @MyRESULT = STRING_AGG('%2b"'+PHONE_NUMBER+'"',',') FROM CONTACTS WHERE ON_CALL=1
STRING_AGG 的源代码在互联网上是可用的,所以 - 可以实现自己的 string_agg 或只使用 FOR XML。