有没有办法在SQL Server中循环字符串?

有没有办法在SQL Server中循环字符串?,sql,sql-server,loops,select,stored-procedures,Sql,Sql Server,Loops,Select,Stored Procedures,我试图在SQL Server中循环一个varchar,其中一列的格式为 "F1 100 F2 400 F3 600" 我需要的是将数字除以10:“F1 10 F2 40 F3 60”,目前我有一个调用此函数的存储过程: ALTER FUNCTION [name_offunction] (@Chain varchar(120)) RETURNS varchar(120 AS BEGIN DECLARE @Result varchar(120), @Pos i

我试图在SQL Server中循环一个varchar,其中一列的格式为

"F1 100 F2 400 F3 600"
我需要的是将数字除以10:“F1 10 F2 40 F3 60”,目前我有一个调用此函数的存储过程:

ALTER FUNCTION [name_offunction]
    (@Chain varchar(120)) 
RETURNS varchar(120
AS
BEGIN
    DECLARE @Result varchar(120), @Pos int, @Concat varchar(120)

    WHILE LEN(@Chain) > 0
    BEGIN
         SET @Pos = CHARINDEX(' ', @Chain)
         SET @Result = CASE
                           WHEN SUBSTRING(@Chain, 1, @Pos-1) LIKE '%[^A-Z]%' 
                                 THEN SUBSTRING(@Chain, 1, @Pos-1)
                           WHEN SUBSTRING(@Chain, 1, @Pos-1) NOT LIKE '%[^A-Z]%' 
                                 THEN CAST(CAST(SUBSTRING(@Chain, 1, @Pos-1) / 10 AS INT)AS CHAR)
                       END
         SET @Chain = REPLACE(@Chain, SUBSTRING(@Chain, 1, @Pos), '')
         SET @Concat += @Result + ' '
   END
   RETURN @Concat 

我们这里似乎有两个问题。首先,您希望在SQL中循环,然而,SQL是一种基于集合的语言。这意味着它在基于集合的操作中表现出色,但在迭代操作(如循环)中表现不佳

下一步是,您拥有看起来是分隔数据的内容,并且希望以某种方式影响该分隔数据,然后将数据重建为分隔字符串。在数据库中存储分隔数据总是一个设计缺陷,您真的应该修复这个设计

因此,我建议您在标量函数上使用内联表值函数

首先,由于值的顺序位置似乎很重要,我们不能使用SQL Server内置的
STRING_SPLIT
,因为有文档记录不能保证值的顺序相同。因此,我将使用给出序号位置的

然后我们可以使用
TRY\u CONVERT
检查值是否为
int
(我假设这是正确的数据类型),以及是否被
10
除。最后,我们可以使用
STRING\u AGG
重建数据

在函数外部,这将如下所示:

声明@Chain varchar(120)='F1 100 F2 400 F3 600';
在组(按DS.item排序)中选择字符串\u AGG(合并(转换(varchar(10),TRY\u转换(int,DS.item)/10),DS.item),“”)
来自dbo.DelimitedSplit8K_铅(@Chain,“)DS;
因此,作为一项功能,您可以执行以下操作:

创建函数dbo.YourFunction(@Chain varchar(120))
将表返回为
返回
选择组(按DS.item排序)中的字符串(合并(转换(varchar(10),TRY_转换(int,DS.item)/10),DS.item),“”)作为新链
来自dbo.DelimitedSplit8K_铅(@Chain,“)DS;
去
电话是这样的:

选择YF.NewChain
从dbo.YourTable YT
交叉应用dbo.YourFunction(YT.Chain)YF;


请注意,
STRING\u AGG
是在SQL Server 2017中引入的;如果您使用的是较旧的版本(您没有注意到这是个问题),则需要使用“旧”的XML路径
解决方案,如图所示。

为什么要在SQL Server中循环?SQL Server是一种基于集合的语言;您应该做的最后一件事是循环。也许您可以拆分字符串,将拆分后的值放入表中。。。然后尝试将每行值除以10。。。例如,如何split@Larnu,这就是为什么我要问,为了找到最好的解决方案,我知道我不应该做循环。。。。。。。。