2

我正在做一个查询,该查询将从 table1 中删除其列 table1.id = table2.id 的所有行

table1.id 列在 nvarchar(max) 中,xml 格式如下:

<customer><name>Paulo</name><gender>Male</gender><id>12345</id></customer>

编辑: id 列只是一个巨大的 XML 的一部分,因此结束标记可能与开始标记不匹配。

我尝试过使用 name.nodes 但它仅适用于 xml 列并且更改列数据类型不是一种选择,到目前为止这是我使用的代码PATINDEX

DELETE t1
FROM table1 t1
WHERE PATINDEX('%12345%',id) != 0

但我需要的是从 table2.id 中搜索所有值,其中包含如下:

12345
67890
10000
20000
30000

任何方法都会像 sp_executesql 和/或 while 循环一样好,或者有比使用 patindex 更好的方法吗?谢谢!

4

2 回答 2

2
Select *
--Delete A
 From Table1 A
 Join Table2 B on CharIndex('id>'+SomeField+'<',ID)>0

我不知道 Table2 中字段的名称。我也假设它是一个varchar。如果不,cast(SomeField as varchar(25))

编辑 - 这是我测试的。它应该工作

Declare @Table1 table (id varchar(max))
Insert Into @Table1 values
('<customer><name>Paulo</name><gender>Male</gender><id>12345</id></customer>'),
('<customer><name>Jane</name><gender>Femail</gender><id>7895</id></customer>')

Declare @Table2 table (SomeField varchar(25))
Insert into @Table2 values
('12345'),
('67890'),
('10000'),
('20000'),
('30000')


Select *
--Delete A
 From @Table1 A
 Join @Table2 B on CharIndex('id>'+SomeField+'<',ID)>0
于 2016-09-16T03:38:46.163 回答
2
;with cteBase as (
    Select *,XMLData=cast(id as xml) From Table1
)
Select *
 From cteBase
 Where XMLData.value('(customer/id)[1]','int') in (12345,67890,10000,20000,30000)

如果您对结果满意,请将 final 更改 Select *Delete

于 2016-09-16T02:46:53.830 回答