Sql server 从SQL Server中的varchar字段中间隔离文本

Sql server 从SQL Server中的varchar字段中间隔离文本,sql-server,Sql Server,我的一个表中有一个varchar列,我需要能够从中间分离一些文本,这样我就可以使用它从另一个表中查找信息 此列可能包含的文本示例如下: 0A10-Deeside PKG AHU-G37-Pa-A is out of range (Current value of 12.000000 is greater than the maximum value of 5.000000) 在本例中,0A10 Deeside是同一表中另一列中的数据,称为AssetID,可以是任意长度。类似地,从超出范围开始的

我的一个表中有一个varchar列,我需要能够从中间分离一些文本,这样我就可以使用它从另一个表中查找信息

此列可能包含的文本示例如下:

0A10-Deeside PKG AHU-G37-Pa-A is out of range (Current value of 12.000000 is greater than the maximum value of 5.000000)
在本例中,0A10 Deeside是同一表中另一列中的数据,称为AssetID,可以是任意长度。类似地,从超出范围开始的文本可以是任意长度,但始终以字符串超出范围开始

我需要分离的是AssetID和超出范围之间的文本,PKG AHU-G37-Pa-A,但我正在努力找到一种方法,因为这也会有不同的长度,因此无法单独使用子字符串


有办法吗?我正在使用MS SQL Server 2008

使用char index查找第一个空格和is的位置。将这些信息反馈到子字符串中。


我喜欢XML类型,因为它可以做很多有趣的事情。也许这种方法适合你,因为它是绝对可变的

DECLARE @test VARCHAR(MAX)='0A10-Deeside PKG AHU-G37-Pa-A is out of range (Current value of 12.000000 is greater than the maximum value of 5.000000)';

DECLARE @testXML XML=CAST('<root><r>' + REPLACE(@test,'is out of range','</r><r>') + '</r></root>' AS XML);

SELECT x.y.value('.','varchar(max)')
FROM @testXML.nodes('/root/r') AS x(y);
一些增强功能可从表中选择此项,其中开头是另一列的一部分:

DECLARE @tbl TABLE(testText VARCHAR(MAX),AnotherColumn VARCHAR(MAX));

INSERT INTO @tbl VALUES('0A10-Deeside PKG AHU-G37-Pa-A is out of range (Current value of 12.000000 is greater than the maximum value of 5.000000)','0A10-Deeside');

SELECT testXML.v.value('/root[1]/r[2]','varchar(max)')
FROM @tbl AS tbl
CROSS APPLY
(
    SELECT CAST('<root><r>' + REPLACE(REPLACE(tbl.testText,'is out of range','</r><r>'),tbl.AnotherColumn,'</r><r>') + '</r></root>' AS XML) 
) AS testXML(v)

此查询将在col2之间隔离文本,并且文本超出范围:

结果:

PKG AHU-G37-Pa-A

所有的行都是这样的吗?听起来应该有多个列包含数据,而不是一个列。这样,您就不需要对简单的联接/查找执行字符串操作。不,不是所有的行都是这样的,但我们将只处理那些是这样的行。在正常情况下,多列显然是最有意义的,但这里我们基本上是在解析从第三方系统写入表中的数据。我们无法控制格式,也无法控制将哪些数据传送到哪里。遗憾的是,我们试图提取的数据(SpecName)不是从第三方写入的,因此我们必须尝试从这个字符串中提取它。上帝保佑写得不好的集成;将字符串按空格字符分隔是非常-嗯-勇敢的:-OP声明,开头0A10 Deeside来自同一表中的另一列,并且第三部分总是以相同短语开头超出范围。我想你应该使用这个信息…@Shnugo你是对的,答案已经更新了。谢谢这看起来最接近我需要的东西-我只是不知道这里代表什么东西-或者它只是用作返回结果的别名?啊,好的。Stuff是一个实际的函数。我不知道!OP声明,起始0A10 Deeside来自同一表格中的另一列,并且第三部分始终以相同短语开头超出范围。我认为人们应该利用这些信息。。。将字符串除以空格可能是危险的……事实上,同样的方法可以用于比空格更好的更严格的限制。我认为上面的答案足以让开发人员指出正确的方向。遗憾的是,在所需数据被允许包含空格之前,AssetID会删除文本。在列名AssetID上使用CHARINDEX似乎是更好的选择。
SELECT 
  stuff(substring(col1, 0, charindex(' is out of range', col1)), 1,
    len(col2) + 1, '')
FROM yourtable
PKG AHU-G37-Pa-A