【问题标题】:SQL Update string list of IDs with string list of valuesSQL 使用字符串值列表更新 ID 字符串列表
【发布时间】:2016-04-06 03:01:17
【问题描述】:

我想在存储过程中更新在字符串逗号分隔列表中传递的 ID 列表,其中包含字符串逗号分隔的值列表。

那么我如何使用 2 个列表中的相应名称更新每个 ID。 例如:

ids = "1, 2, 4 ,8";
names = "sam, john, sarah ,barry";

ALTER PROCEDURE [dbo].[update_work]
  @ids nvarchar(MAX),
  @names nvarchar(MAX)
AS
BEGIN
    ???
END

【问题讨论】:

  • 修复您的数据结构以将列表存储在表中而不是字符串中。
  • 我认为他正在获取从 UI 传递的字符串作为 User selection 的列表。请检查CROSS APPLY。更多信息可以在这里找到stackoverflow.com/questions/5493510/…
  • 我从 jQuery UI 控件获取数据,所以我无法更改它,那么如何使用 2 个列表中的相应名称更新每个 ID。
  • 使用 DelimitedSplit8k 之类的字符串拆分函数,将数据与项目编号连接起来

标签: sql .net sql-server stored-procedures sql-update


【解决方案1】:

正确的方法是使用表值参数。

但你说你不能,所以我将使用SUBSTRING 和计数表来拆分逗号分隔的字符串。

结构:

CREATE TABLE #tab(id INT, name VARCHAR(100));

INSERT INTO #tab(id, name)
VALUES (1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'),
       (5, 'e'), (6, 'f'), (7, 'g'), (8, 'h'), (9, 'i');  

过程(临时过程,因为 SEDE 不允许创建普通数据库对象):

CREATE PROCEDURE #update_work @ids nvarchar(MAX), @names nvarchar(MAX)
AS
BEGIN
 ;WITH cte AS
 ( SELECT TOP 1000 rn = ROW_NUMBER() OVER(ORDER BY 1/0)
   FROM master..spt_values
 ), cte2 AS
 ( SELECT [val] = SUBSTRING(',' + @ids + ',', rn + 1,
                   CHARINDEX(',', ',' + @ids + ',', rn + 1) - rn -1)
         ,[r] =  ROW_NUMBER() OVER(ORDER BY rn)
         ,[type] = 'id'
  FROM cte
  WHERE rn <= LEN(',' + @ids + ',') - 1
   AND SUBSTRING(',' + @ids + ',', rn, 1) = ','
  UNION ALL 
  SELECT [val] = SUBSTRING(',' + @names + ',', rn + 1,
                   CHARINDEX(',', ',' + @names + ',', rn + 1) - rn -1)
         ,[r] =  ROW_NUMBER() OVER(ORDER BY rn)
         ,[type] = 'name'
  FROM cte
  WHERE rn <= LEN(',' + @names + ',') - 1
   AND SUBSTRING(',' + @names + ',', rn, 1) = ','
 ), cte3 AS
 ( SELECT [id] = cte2.val, [name] = cte2a.val
   FROM cte2
   JOIN cte2 AS cte2a
     ON cte2.[r] = cte2a.[r]
    AND cte2.[type] = 'id'
    AND cte2a.[type] = 'name'
 )
 UPDATE t
 SET name = c3.name
 FROM #tab AS t
 JOIN cte3 c3 ON t.id = c3.id;
END;

测试:

EXEC #update_work
    @ids = '1, 2, 4 ,8', 
    @names = 'sam, john, sarah ,barry';

SELECT * 
FROM #tab;  

LiveDemo

输出:

╔════╦═══════╗
║ id ║ name  ║
╠════╬═══════╣
║  1 ║ sam   ║
║  2 ║ john  ║
║  3 ║ c     ║
║  4 ║ sarah ║
║  5 ║ e     ║
║  6 ║ f     ║
║  7 ║ g     ║
║  8 ║ barry ║
║  9 ║ i     ║
╚════╩═══════╝

【讨论】:

    猜你喜欢
    • 2014-08-30
    • 2017-10-01
    • 2015-11-07
    • 2021-12-13
    • 2017-05-10
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多