Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 选择由特定分隔符括起并包含特定值的字符串_Sql Server_Xml_String - Fatal编程技术网

Sql server 选择由特定分隔符括起并包含特定值的字符串

Sql server 选择由特定分隔符括起并包含特定值的字符串,sql-server,xml,string,Sql Server,Xml,String,我有一个SQL Server表,它在varchar字段中存储xml标记,我希望select语句从包含特定值的每一行返回整个节点。例如: 1. <tag1><tag2 value1 = "abcde" value2 = "fghij"></tag2></tag1> 2. <tag1><tag2 value1 = "hfdgd" value2 = "fgytyhij"></tag2></tag1> 3.

我有一个SQL Server表,它在varchar字段中存储xml标记,我希望select语句从包含特定值的每一行返回整个节点。例如:

1. <tag1><tag2 value1 = "abcde" value2 = "fghij"></tag2></tag1>
2. <tag1><tag2 value1 = "hfdgd" value2 = "fgytyhij"></tag2></tag1>
3. <tag1><tag2 value1 = "abcde" value2 = "ettyy"></tag2></tag1>
4. <tag1><tag2 value1 = "qwere" value2 = "mnbvb"></tag2></tag1>
1。
2.
3.
4.
我希望搜索词为“abcde”,并希望select语句返回:

<tag2 value1 = "abcde" value2 = "fghij">
<tag2 value1 = "abcde" value2 = "ettyy">

我可以使用PATINDEX查找我正在搜索的图案的位置。我的问题是,我无法找到与搜索字符串最接近的“”并返回包含“”的整个字符串。

如何

DECLARE @Str VARCHAR(400);
SET @Str = '<tag1><tag2 value1 = "abcde" value2 = "fghij"></tag2></tag1>';

SELECT SUBSTRING(@Str, CHARINDEX('>', @Str) +1, CHARINDEX('/', @Str) - 8)
DECLARE@Str VARCHAR(400);
设置@Str='';
选择子字符串(@Str,CHARINDEX('>',@Str)+1,CHARINDEX('/',@Str)-8)
更新:

CREATE TABLE T(
  Str VARCHAR(400)
);

INSERT INTO T VALUES
('<tag1><tag2 value1 = "abcde" value2 = "fghij"></tag2></tag1>'),
('<tag1><tag2 value1 = "hfdgd" value2 = "fgytyhij"></tag2></tag1>'),
('<tag1><tag2 value1 = "abcde" value2 = "ettyy"></tag2></tag1>'),
('<tag1><tag2 value1 = "qwere" value2 = "mnbvb"></tag2></tag1>');

SELECT SUBSTRING(Str, CHARINDEX('>', Str) +1, CHARINDEX('/', Str) - 8)
FROM T
WHERE Str LIKE '%"abcde"%';
--or more better
--WHERE Str LIKE '%value1 = "abcde"%';
创建表T(
Str VARCHAR(400)
);
插入到T值中
(''),
(''),
(''),
('');
选择子字符串(Str,CHARINDEX('>',Str)+1,CHARINDEX('/',Str)-8)
从T
其中Str类似“%”abcde“%”;
--或者更好
--其中Str类似于“%value1=”abcde“%”;

现在应该可以更好地工作了。我第一次发帖时没有看到@SearchVal

declare @TheStrings table(SomeVal varchar(max))

insert @TheStrings values
                              ('<tag1><tag2 value1 = "abcde" value2 = "fghij"></tag2></tag1>')
,('<tag1><tag1a value="asdf"></tag1a><tag2 value11 = "abcde" value3="qwer" value2 = "wow"></tag2></tag1>')

declare @SearchVal varchar(10) = 'abcde'

select 
    SomeVal
    , SUBSTRING(SomeVal, len(SomeVal) - charindex('<', reverse(SomeVal), charindex(reverse(@SearchVal), reverse(SomeVal))) + 1, charindex('>', SUBSTRING(SomeVal, len(SomeVal) - charindex('<', reverse(SomeVal), charindex(reverse(@SearchVal), reverse(SomeVal))) + 1, 100)))
from @TheStrings
declare@TheStrings表(SomeVal varchar(max))
插入@TheStrings值
('')
,('')
声明@SearchVal varchar(10)='abcde'
挑选
某地

,SUBSTRING(SomeVal,len(SomeVal)-charindex(“”,SUBSTRING(SomeVal,len(SomeVal)-charindex(“与XML的任何交互都应依赖SQL Server提供的原生XML方法。在字符串级别处理XML(使用字符串方法,如
charindex
SUBSTRING
等)是有害的,可能会被稍微不同但有效的XML片段打断。例如,属性的顺序不是文档的一部分。空白和换行是由读者引入的

例如,您的XML

<tag1><tag2 value1 = "abcde" value2 = "fghij"></tag2></tag1>
一些解释 如果在
下面有一个
属性
value1
,该属性的值类似于名为
@findthisvillue1
的sql变量,那么XML就是
xquery
XML


假设一个原生XML列,这是非常快的。很好地知道:SQL Server不会将XML存储为您看到的字符串,而是存储为物理结构中的层次结构表。
XPath
XQuery
可以很好地处理这一问题。

select语句必须返回完整的子字符串,包括最近的“”。结果应该是我现在意识到我没有清楚地解释这个问题。我已经更新了上面的详细信息。@DamnGenius我认为在您的表中使用它并不困难,请检查更新。我认为任何人都不应该在字符串级别上解决XML问题。您可能会出于某些原因阅读我的答案……这只适用于从单个字符串返回模式行。select需要返回包含@SearchVal.LOL oops的所有行的模式。是的,100应该替换为len(SameVal)。当我把它们放在一起时,这是一个占位符。;)@Shnugo我完全同意。但是我不清楚他们是否存储实际的xml。它只是说他们将xml标记存储为varchar。如果OP确实存储xml,他们应该更改数据类型并消除对有效性的任何怀疑。@Shnugo,我完全同意。但是,我们以这种方式继承了应用程序。他们的xml代码存储在表为varchar。不知道为什么,但我们别无选择,只能作为字符串进行操作。@DamnGenius,但我们别无选择,只能作为字符串进行操作。您可以(而且您应该)将字符串转换为XML,并使用XML方法进行检查。正如我在回答中所解释的,您的路线上有许多陷阱。。。
<tag1><tag2 value2='fghij' value1='abcde'/></tag1>
DECLARE @mockup TABLE(YourStringXML VARCHAR(MAX))
INSERT INTO @mockup VALUES 
 ('<tag1><tag2 value1 = "abcde" value2 = "fghij"></tag2></tag1>')
,('<tag1><tag2 value1 = "hfdgd" value2 = "fgytyhij"></tag2></tag1>')
,('<tag1><tag2 value1 = "abcde" value2 = "ettyy"></tag2></tag1>')
,('<tag1><tag2 value1 = "qwere" value2 = "mnbvb"></tag2></tag1>');

DECLARE @FindThisInValue1 VARCHAR(10) = 'abcde';

SELECT *
FROM @mockup m
WHERE CAST(YourStringXML AS XML).exist('/tag1/tag2[@value1=sql:variable("@FindThisInValue1")]')=1;