我在SQL Server中有一个看起来像这样的列 -
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可能不同),我无法告诉它只是从特定点开始。
理想情况下,我希望它在第3个' ='之后开始。并在第4个'之后结束。我该怎么做?
答案 0 :(得分: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=
的位置,然后在此之后开始使用子字符串直到下一个逗号,
来提取您所需的内容。
答案 1 :(得分: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