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函数的更好方法。