Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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_Sql Server - Fatal编程技术网

尝试在SQL Server中获取字符串左侧的所有文本

尝试在SQL Server中获取字符串左侧的所有文本,sql,sql-server,Sql,Sql Server,我创建了一个函数,它返回一些值,并使用STUFF将它们全部放在一列中 部分结果包括: Something, something else, ?<?xml version="1.0" ... and lots of stuff in here. /> Something,Something? 我想弄清楚的是如何删除整个: <?xml /> tag and all of its inner content. 标记及其所有内部内容。 问题是,有时它会以每行结果的不同部分

我创建了一个函数,它返回一些值,并使用STUFF将它们全部放在一列中

部分结果包括:

Something, something else, ?<?xml version="1.0" ... and lots of stuff in here. />
Something,Something?
我想弄清楚的是如何删除整个:

<?xml /> tag and all of its inner content.
标记及其所有内部内容。
问题是,有时它会以每行结果的不同部分结束

所以我试过CHARINDEX,左,Splits

有什么想法吗

多谢各位

DECLARE @String NVARCHAR(1000)
SET @String = 'Something, something else, ?<?xml version="1.0" ......... />'


SELECT LEFT(@String,CHARINDEX('<?xml',@String)-1) Val
更新

好吧,新的需求是棘手的,真正困难的部分是确定XML标记的确切结尾。假设存在一个非常简单的场景,其中只有一个XML标记,并且字符串中没有先前的
/>
,则可以执行以下操作:

DECLARE @String NVARCHAR(1000)
SET @String = 'Something, something else, ?<?xml version="1.0" ......... /> hello'


SELECT STUFF(@String,CHARINDEX('<?xml',@String),CHARINDEX('/>',@String)-CHARINDEX('<?xml',@String)+2,'') Val
声明@string varchar(MAX)=“某物,某物,某物”
声明@StartOfXml INT=PATINDEX(“%%”,@string)
挑选
子字符串(@string,0,@StartOfXml)+
子字符串(@string,@EndOfXml+2,LEN(@string))
或者将其全部内联:

DECLARE @string varchar(MAX) = 'Something, something else, ?<?xml version="1.0" ... and lots of stuff in here. />, something else yet'
SELECT 
    SUBSTRING(@string, 0, PATINDEX('%<?xml%', @string)) + 
    SUBSTRING(@string, PATINDEX('%/>%', @string) + 2, LEN(@string))
声明@string varchar(MAX)=“某物,某物,某物”
挑选
子字符串(@string,0,PATINDEX('%%',@string)+2,LEN(@string))
到目前为止给出的这个或其他答案的问题是,根据您的XML,字符串中可能有多个“/>”。在这种情况下,您可以执行以下操作:

DECLARE @string varchar(MAX) = 'Something, something else, ?<?xml version="1.0" ... and lots of stuff in here. />, something else yet'
SELECT SUBSTRING(@string, 0, PATINDEX('%<?xml%', @string)) + 
       SUBSTRING(@string, (LEN(@string) - PATINDEX('%>/%', REVERSE(@string))) + 2, LEN(@string))
声明@string varchar(MAX)=“某物,某物,某物”
选择子字符串(@string,0,PATINDEX(“%/%”,REVERSE(@string))+2,LEN(@string))

最后一个解决方案假定XML的最后一个结束标记是字符串“/>”的最后一次出现。希望这些帮助之一

多谢各位。我可以这样做,但问题是一些结果在xml标记之后包含重要信息。@user1447679现在更新了我的答案。您可以在一个字段中有多个子字符串吗?您可以让
没有/b匹配的code/>吗?
DECLARE @string varchar(MAX) = 'Something, something else, ?<?xml version="1.0" ... and lots of stuff in here. />, something else yet'
DECLARE @StartOfXml INT = PATINDEX('%<?xml%', @string)
DECLARE @EndOfXml INT = PATINDEX('%/>%', @string)
SELECT 
    SUBSTRING(@string, 0, @StartOfXml) + 
    SUBSTRING(@string, @EndOfXml + 2, LEN(@string))
DECLARE @string varchar(MAX) = 'Something, something else, ?<?xml version="1.0" ... and lots of stuff in here. />, something else yet'
SELECT 
    SUBSTRING(@string, 0, PATINDEX('%<?xml%', @string)) + 
    SUBSTRING(@string, PATINDEX('%/>%', @string) + 2, LEN(@string))
DECLARE @string varchar(MAX) = 'Something, something else, ?<?xml version="1.0" ... and lots of stuff in here. />, something else yet'
SELECT SUBSTRING(@string, 0, PATINDEX('%<?xml%', @string)) + 
       SUBSTRING(@string, (LEN(@string) - PATINDEX('%>/%', REVERSE(@string))) + 2, LEN(@string))