【问题标题】:How to update an inner join table with split_string?如何使用 split_string 更新内部连接表?
【发布时间】:2021-04-24 00:42:44
【问题描述】:

我有一张简单的表,比如:

表 A:

Id Role
1 Admin
2 Member
3 Reviewer
4 Contributor
5 Champion
6 Casual
7 Manager

我有两个参数,一个是 @Id Nvarchar(max) = '1,2,3' 将包含我需要更新的所有 ID 的值。 @Roles Nvarchar(max)='Member,Casual,Manager' 将映射到上面的 @Ids。 所以基本上,我想用值 Member 更新 Id 1,用 Casual 更新 Id 2,用 Manager 更新 Id 3。

结果应该是:

Id Role
1 Member
2 Casual
3 Manager
4 Contributor
5 Champion
6 Casual
7 Manager

我在想split_string@Ids and @Roles,找到内连接表,循环更新,但不知道在SQL server中如何实现。

我很想听听有关如何在 SQL 服务器中实现它的任何反馈或方法。

谢谢。

【问题讨论】:

  • 阅读文档。如下文所述,string_split 不保证您的方法所要求的顺序。如果您通过了 TVP,则不需要任何这些,您只需加入即可。所以更好的问题是为什么你将“元组”作为单独的数组传递。
  • 根据问题指南,请展示您的尝试并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。

标签: sql-server split sql-update


【解决方案1】:

问题是如何在@Id@Roles 之间定义key-value 对。

基本上,split_string 无法解决该要求。

返回类型: 返回一个 single-column 表,其行是 子串。列名是value

所以我建议你像这样创建自己的strSplit

CREATE FUNCTION  [dbo].[strSplit] ( @string nvarchar( MAX), @splitter CHAR( 1) )
RETURNS @res TABLE ( id INT PRIMARY KEY, rank INT, val nvarchar( MAX) )
AS
BEGIN
     IF SUBSTRING ( @string, len ( @string), 1)<>@splitter
          SET @string= @string+@splitter
     DECLARE @start INT, @word nvarchar(MAX), @charindex INT, @i INT
     SET @i=1
     SET @start=1
     SET @charindex= CHARINDEX( @splitter, @string, @start)
     WHILE (@charindex <> 0)BEGIN
          SET @word= SUBSTRING( @string, @start, @charindex - @start)
          SET @start= @charindex +1
          SET @charindex= CHARINDEX( @splitter, @string, @start)
          INSERT INTO @res  VALUES ( @start, @i, @word)
          SET @i=@i+1
     END
     RETURN
END

之后,你可以很容易地得到key-value这样的结果。

SELECT id.val AS ID, Role.val AS Role
FROM strSplit(@Id, ',') Id
INNER JOIN strSplit(@Roles, ',') Role ON Id.rank = Role.rank

输出如下所示

ID  Role
1   Member
2   Casual
3   Manager

现在,您可以加入您的 Table A 进行更新。

;WITH cte_TempTable AS (
 SELECT id.val AS ID, Role.val AS Role
 FROM strSplit(@Id, ',') Id
 INNER JOIN strSplit(@Roles, ',') Role ON Id.rank = Role.rank
)
UPDATE t
SET t.Role = c.Role
FROM @TableA t
INNER JOIN cte_TempTable c ON t.ID = c.ID

dbfiddle.uk上的演示

【讨论】:

  • 感谢@Nguyen Van Phong。它确实有很大帮助。如果我还有其他问题,我会回复你:)
  • 刚刚做了。非常感谢:)
猜你喜欢
  • 2019-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
  • 1970-01-01
  • 2014-01-14
  • 1970-01-01
相关资源
最近更新 更多