通過導航 SQL Server 中的所有表,從 json 數組中刪除具有給定 id 的元素

哈夫薩國民

所有表都有一個名為BranchList. BranchList是一個包含 json 數組的字符串,像這樣

[ { "Id": 1, "Branch": 259 }, { "Id": 1, "Branch": 253 } ]

我想通過導航所有表從列表中刪除分支 253 的 json 值,它應該是這樣的

[ { "Id": 1, "Branch": 259 } ]

我為這樣的單個表找到了一種方法,但對我來說更新所有表還不夠。

declare @JSONData nvarchar(max)
declare @Id nvarchar(max)
declare @BranchList nvarchar(max)
declare @Counter INT

select @Counter = count(BranchList) 
from WarehouseTypes 
outer apply OPENJSON(BranchList) as s
where JSON_VALUE(s.value,'$.Branch') = 253;

while (@Counter > 0)
begin
    select @Id = Id, @BranchList = BranchList 
    from WarehouseTypes 
    outer apply OPENJSON(BranchList) as s
    where JSON_VALUE(s.value,'$.Branch') = 253;
   
    set @JSONData = N''+@BranchList+'';
    set @JSONData = (select * 
                     from OPENJSON(@JSONData, '$') 
                     with (
                           Id int '$.Id',
                           Branch int '$.Branch'
                          )
                     where not (Branch = 253) 
                     for json path);
   
    exec('update WarehouseTypes set BranchList ='''+@JSONData+''' where Id='+@Id);
    set @Counter = @Counter  - 1
end

預先感謝您的幫助。

若羅夫

您可以嘗試生成並執行動態語句。重要的步驟是:

  • 獲取包含列的每個表的名稱BranchList(使用系統目錄視圖)。
  • 從存儲的 JSON 數組中刪除項目。使用當前版本的 SQL Server,您無法從 JSON 數組中刪除項目,因此您需要將 JSON 數組解析為表(使用OPENJSON()和顯式架構),過濾行並將表的內容輸出為 JSON(使用FOR JSON AUTO)。

T-SQL:

DECLARE @stm nvarchar(max)
DECLARE @err int

SELECT @stm = STRING_AGG(
   CONCAT(
      N'UPDATE ',
      QUOTENAME(sch.[name]), '.',
      QUOTENAME(tab.[name]),
      N' SET ', 
      QUOTENAME(col.[name]), ' = (',
      N'SELECT Id, Branch FROM OPENJSON(',
      QUOTENAME(col.[name]),
      N', ''$'') WITH (Id int ''$.Id'', Branch int ''$.Branch'') WHERE Branch <> 253 FOR JSON PATH',
      N')'
   ),
   '; '
)
FROM sys.columns col
JOIN sys.tables tab ON col.object_id = tab.object_id
JOIN sys.schemas sch ON tab.schema_id = sch.schema_id
WHERE col.[name] = 'BranchList' 

PRINT @stm
EXEC @err = sp_executesql @stm
IF @err <> 0 PRINT 'Error found'

結果是一個複雜的語句,包含UPDATE每個表語句:

UPDATE [dbo].[xxxx] 
SET [BranchList] = (
   SELECT Id, Branch 
   FROM OPENJSON([BranchList], '$') WITH (Id int '$.Id', Branch int '$.Branch') 
   WHERE Branch <> 253 
   FOR JSON AUTO
)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在SQL Server中从JSON删除空元素

按 ID 刪除 JSON [] 數組元素

React js 從數組中刪除項目會刪除所有其他元素

如何從數組中刪除在python中不同索引位置具有公共元素的行?

項目/元素剪輯通過導航欄

從 SQL Server 的結果集中分配具有相同 ID 的所有記錄,列中的現有值

在MS SQL Server中插入多行并检索所有新表ID的背面

SQL Server:将行插入表中,对于所有 id 尚不存在

Jsoup - 從元素中刪除所有子項

JS:從元素中刪除所有屬性

如何从多维JSON数组访问元素(在SQL Server中)

通过条件SQL Server 2016从JSON数组中删除元素

如何在 JavaScript 中刪除 DOM 中具有相同 id 的兩個元素?

检索SQL Server中具有相同前缀的所有XML元素

對於 react-navigation + web,通過 URL 直接導航到嵌套路由會導致標題中缺少後退按鈕

從C中的數組中刪除元素

Javescript以原子方式從數組中刪除元素

用Java從數組中刪除元素

过滤具有相邻ID的SQL元素

從 SQL Server 中的 Json 數組獲取 Json 值和 Json 字符串

如何從具有給定 id 的 2 列的另一個表中獲取或連接數據

SQL Server 中的 JSON

从现有 SQL Server 表中删除所有列

從具有相似元素的元組列表中刪除重複的 3 個值元組

SQL - 從具有約束的表中刪除行

SQL Server - 僅當同一列和表中該用戶 ID 存在值 B 時,才排除具有值 A 的所有行

在 SQL Server 表中,如何根据对具有 JSON 值的列的 JSON 搜索过滤记录

检查sql server中具有相同id的行的条件

在SQL SERVER中仅选择具有max(id)的行