SQL Server 2014存储过程嵌套循环插入分隔字符串仅生成部分行问题
问题分析
你的存储过程仅生成第一个地点对应品牌数据的原因是:处理第一个地点时直接修改了传入的@Brand参数,将所有品牌拆分完毕。后续地点循环时,@Brand已无|分隔符,内层品牌循环直接跳过,无法生成其他地点与品牌的组合数据。
修正后的存储过程
ALTER PROCEDURE [dbo].[Add_Reviewer] @FirstName NVARCHAR(MAX) ,@LastName NVARCHAR(MAX) ,@Email NVARCHAR(MAX) ,@Brand NVARCHAR(MAX) ,@Location NVARCHAR(MAX) ,@Department NVARCHAR(MAX) ,@ProductLine NVARCHAR(MAX) AS BEGIN -- 保存原始品牌字符串,避免循环中修改导致后续地点无法复用 DECLARE @OriginalBrand NVARCHAR(MAX) = @Brand DECLARE @TempBrand NVARCHAR(MAX) DECLARE @templocation NVARCHAR(MAX) WHILE CHARINDEX('|', @Location) > 0 BEGIN SET @templocation = SUBSTRING(@Location, 1, CHARINDEX('|', @Location) - 1 ) -- 每次处理新地点时,重置临时品牌变量为原始品牌字符串 SET @TempBrand = @OriginalBrand WHILE CHARINDEX('|', @TempBrand) > 0 BEGIN DECLARE @tempbrand NVARCHAR(MAX) SET @tempbrand = SUBSTRING(@TempBrand, 1, CHARINDEX('|', @TempBrand) - 1 ) INSERT INTO [Reviewers] ([FirstName], [LastName], [Email], [Brand], [Location], [ProductLine], [Department]) VALUES (@FirstName, @LastName, @Email, @tempbrand, @templocation, @ProductLine, @Department) SET @TempBrand = SUBSTRING(@TempBrand, CHARINDEX('|', @TempBrand) + 1, LEN(@TempBrand)) END SET @Location = SUBSTRING(@Location, CHARINDEX('|', @Location) + 1, LEN(@Location)) END END
关键修改点
- 新增
@OriginalBrand变量保存原始品牌字符串,避免直接修改传入的@Brand参数 - 每次进入地点循环时,将
@TempBrand重置为@OriginalBrand,确保每个地点都能与所有品牌进行组合 - 内层品牌循环操作
@TempBrand而非原始@Brand,保证循环独立性
补充说明
如果你的输入字符串末尾可能存在无内容的|(如示例中的9|10|11|),当前逻辑已能正确处理最后一个品牌值。若需要兼容末尾无分隔符的情况(如9|10|11),可在循环结束后单独处理剩余的品牌和地点值。
内容的提问来源于stack exchange,提问作者Craigjb
相关产品推荐
相关产品推荐

