2014-04-01 49 views
2

中旬,我在SQL Server中的列,看起来像这样 -SQL服务器:提取字符串

columnA 
---------------------------------------------------------------------- 
Vendor=ABCCorp,FTPAddress=ftp.abccorp.com,Filename=index.html.yyyymmdd,Filename_Encrypted=index.html.ppg.yyyymmdd,Filename_Compressed=index.html.yyyymmdd.zip,LocalPath=\\san\folder\folder\yyyy\mm\dd,RemotePath=/ 

我希望能够从该列中提取了Filename。问题是,由于长度的变化(供应商,ftp可能会有所不同),我不能说它只是从一个特定的点开始。

理想情况下,我希望它在第三个“=”之后开始,并在第四个“之后”结束。我如何去做这件事?

回答

2

您可以使用CHARINDEX函数来获取Filename=的位置。

试试这个:

DECLARE @String VARCHAR(500) 
DECLARE @SearchToken VARCHAR(25) 
DECLARE @StartLocation INT 
SET @String = 'Vendor=ABCCorp,FTPAddress=ftp.abccorp.com,Filename=index.html.yyyymmdd,Filename_Encrypted=index.html.ppg.yyyymmdd,Filename_Compressed=index.html.yyyymmdd.zip,LocalPath=\\san\folder\folder\yyyy\mm\dd,RemotePath=/' 
SET @SearchToken = 'Filename=' 
SET @StartLocation = CHARINDEX(@SearchToken, @String) 
SELECT SUBSTRING(@String, @StartLocation + LEN(@SearchToken), CHARINDEX(',', @String, @StartLocation) - (@StartLocation + LEN(@SearchToken))) 

它提取你需要寻找的Filename=的位置,然后服用后并直到下一个逗号,启动子的东西。

+0

这让我到文件名开头=所以你说我需要从另一个方向重复(例如CHARINDEX',Filename_Encrypted ='),然后修剪这些数字以得到'Filename = index.html.yyyymmdd',然后从那里做最后修剪? – whoisearth

+1

@whoisearth我已经更新了我的答案。 –

+0

我只是回复说我爱你。 – whoisearth

0

我会创建一个用户定义的函数来拆分字符串,然后再拆分字符串两次。

这是功能我有一个字符串分割:

create FUNCTION [dbo].[buildTableFromSplit] (@str nvarchar(max), @delimiter VARCHAR(50)) 
     RETURNS @myTable TABLE (ID int identity (1,1), split nvarchar(max)) 
AS BEGIN 

DECLARE @x xml 

SELECT @X = CONVERT(xml,'<root><s>' + REPLACE(@Str,@delimiter,'</s><s>') + '</s></root>') 

INSERT INTO @myTable(split) 
SELECT [Value] = T.c.value('.','varchar(max)') 
FROM @X.nodes('/root/s') T(c) 

    return 
END 

然后我会叫它像这样:

DECLARE @str VARCHAR(MAX) 
SET @str = 'Vendor=ABCCorp,FTPAddress=ftp.abccorp.com,Filename=index.html.yyyymmdd,Filename_Encrypted=index.html.ppg.yyyymmdd,Filename_Compressed=index.html.yyyymmdd.zip,LocalPath=\\san\folder\folder\yyyy\mm\dd,RemotePath=/' 
DECLARE @delimiter VARCHAR(50) 
SET @delimiter = ',' 

    SELECT split FROM dbo.buildTableFromSplit((SELECT split FROM dbo.buildTableFromSplit(@str, @delimiter) WHERE LEFT(split,9) = 'FileName='), '=') 
    WHERE id =2