Sql server 在某些符号之间找到值

Sql server 在某些符号之间找到值,sql-server,tsql,find,Sql Server,Tsql,Find,我有一些符号()之间的值。我需要编写一个查询来提取它们 例如,考虑到以下情况: DECLARE @a VARCHAR(MAX) = N'(<1002>+<1003>+<1004>+<1048>+<1049>+<1050>)/(<1400>*2)' 如果您实现SQL CLR正则表达式函数,那么执行此操作将非常容易,但如果您没有时间或技能,则可以使用以下内容: DECLARE @a VARCHAR(MAX) = N

我有一些符号(
)之间的值。我需要编写一个查询来提取它们

例如,考虑到以下情况:

DECLARE @a VARCHAR(MAX) = N'(<1002>+<1003>+<1004>+<1048>+<1049>+<1050>)/(<1400>*2)'

如果您实现SQL CLR正则表达式函数,那么执行此操作将非常容易,但如果您没有时间或技能,则可以使用以下内容:

DECLARE @a VARCHAR(MAX) = N'(<1002>+<1003>+<1004>+<1048>+<1049>+<1050>)/(<1400>*2)'

SET @A = REPLACE(@A, '<', 'lt;');
SET @A = REPLACE(@A, '>', 'gt;');

DECLARE @xml XML

SET @xml = '<node>' + REPLACE(@A, 'gt;', '</node><node>') + '</node>'


SELECT ROW_NUMBER() OVER (ORDER BY T.c)
      ,SUBSTRING(T.c.value('.', 'VARCHAR(MAX)'), CHARINDEX('lt;', T.c.value('.', 'VARCHAR(MAX)')) + 3, 1024)
FROM @xml.nodes('node') T(c)
WHERE CHARINDEX('lt;', T.c.value('.', 'VARCHAR(MAX)')) >0;
(<x z="1002" />+<x z="1003" />+<x z="1004" />+<x z="1048" />+<x z="1049" />+<x z="1050" />)/(<x z="1400" />*2)
DECLARE@a VARCHAR(MAX)=N'(+++)/(*2)'
设置@A=REPLACE(@A,,'gt;');
声明@xml
设置@xml=''+REPLACE(@A,'gt;','')+''
选择(按T.c.顺序)上方的行号()
,子字符串(T.c.value(‘.,‘VARCHAR(MAX)’),CHARINDEX(‘lt;’,T.c.value(‘.,‘VARCHAR(MAX)’)+3,1024)
来自@xml.nodes('node')T(c)
其中CHARINDEX('lt;',T.c.值('.','VARCHAR(MAX)')>0;

您可以通过使用函数删除任何不需要的字符来实现所需的功能,然后通过使用as next执行语句:-

Create table #TempTable (col1 int)

DECLARE @a VARCHAR(MAX) = N'(<1002>+<1003>+<1004>+<1048>+<1049>+<1050>)/(<1400>*2)'

Declare @SqlStatement  NVARCHAR(MAX) =  'Insert into #TempTable Values ' + 

REPLACE(Replace(REPLACE(REPLACE(Replace(REPLACE(@a,'<',''),'>',''),'/(','+'),')+','+'),'*2',''),'+','),(')

Exec sp_executesql @SqlStatement 

Select * from #TempTable

Drop table #TempTable

这可以简单一点:

DECLARE@yourStr VARCHAR(MAX)=N'(+++)/(*2);
选择AllX.value(“@z”,“int”)
FROM(值(CAST(替换(@yourStr,'')为XML))A(Casted)
交叉应用A.Casted.nodes('/x')B(AllX);
就这样:-)

简而言之:

通过替换
,我们可以创建一个(格式不正确的)XML,如下所示:

DECLARE @a VARCHAR(MAX) = N'(<1002>+<1003>+<1004>+<1048>+<1049>+<1050>)/(<1400>*2)'

SET @A = REPLACE(@A, '<', 'lt;');
SET @A = REPLACE(@A, '>', 'gt;');

DECLARE @xml XML

SET @xml = '<node>' + REPLACE(@A, 'gt;', '</node><node>') + '</node>'


SELECT ROW_NUMBER() OVER (ORDER BY T.c)
      ,SUBSTRING(T.c.value('.', 'VARCHAR(MAX)'), CHARINDEX('lt;', T.c.value('.', 'VARCHAR(MAX)')) + 3, 1024)
FROM @xml.nodes('node') T(c)
WHERE CHARINDEX('lt;', T.c.value('.', 'VARCHAR(MAX)')) >0;
(<x z="1002" />+<x z="1003" />+<x z="1004" />+<x z="1048" />+<x z="1049" />+<x z="1050" />)/(<x z="1400" />*2)
(+++)/(*2)
T-SQL可以处理片段,因此我们可以使用
.nodes('/x')
读取根级别的所有
元素。任何其他内容都只是元素之间的杂音,在
text()
节点中浮动,我们可以忽略


我们只需读取
z
-属性并将其返回为
int

SQL Server的版本是什么?SQL Server 2014gotqn,这可以简单一点;-)那很好。我并没有强迫自己做太多的回答——只是试图解决这个问题,但这肯定是使用XML函数的更好方法。