如何在SQL中过滤字符串?

如何在SQL中过滤字符串?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,如何在SQL 2008中筛选字符串 SELECT FileName=reverse(left(reverse('\\PRODSERVER\D$\EXPORT\Data20160401.txt'), charindex('\',reverse('\\PRODSERVER\D$\EXPORT\Data20160401.txt'), 1) - 1)) 上面的查询返回文件名Data20160401

如何在SQL 2008中筛选字符串

SELECT FileName=reverse(left(reverse('\\PRODSERVER\D$\EXPORT\Data20160401.txt'), 

                    charindex('\',reverse('\\PRODSERVER\D$\EXPORT\Data20160401.txt'), 

                             1) - 1))
上面的查询返回文件名Data20160401.txt


我只需要获取服务器名PRODSERVER。

创建一个函数来拆分字符串

CREATE FUNCTION [dbo].[fnSplitString] 
( 
    @string NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @output TABLE(splitdata NVARCHAR(MAX) 
) 
BEGIN 
    DECLARE @start INT, @end INT 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
    WHILE @start < LEN(@string) + 1 BEGIN 
        IF @end = 0  
            SET @end = LEN(@string) + 1

        INSERT INTO @output (splitdata)  
        VALUES(SUBSTRING(@string, @start, @end - @start)) 
        SET @start = @end + 1 
        SET @end = CHARINDEX(@delimiter, @string, @start)

    END 
    RETURN 
END
输出

PRODSERVER
D$
EXPORT
Data20160401.txt

Asuming文件路径始终以\\开头,您可以执行以下操作:

Filename=substring(string,0,charindex(substring(string,2,len(string)-2),'\')
我不知道这是否是正确的语法,因为我目前不在一台配备任何sql处理器的机器上,但它应该执行以下操作:

  • 获取不带前导的字符串的子字符串\\
  • 获取第三个\的位置,因为这是您不需要的零件开始的位置
  • 从\\之后的第一个位置到第三个位置,从1中创建的子字符串中获取子字符串\

  • 您的文件名是否总是以\\开头?是的,文件名总是以\\开头。路径是否总是相同的?如果没有,,您能给出您希望能够查询的路径变化的示例吗。\\servername\c$\logserver\www\W3SVC1\filename.log这是实际文件路径的格式。您可以从\\之后开始获取路径的子字符串,然后使用charindex获取下一个\所在的索引,然后您就知道了您的位置子字符串必须结束如果我只需要PRODSERVER怎么办?实际上,我正在尝试对现有的select查询实现此拆分函数。。从表中选择col1、col2、split(\\filepath)作为[ServerName],如果您是从表中选择@Path的列名中的子项,则从Bill获得答案不太正确。SUBSTRING的第二个参数是第一个参数中传递的字符串的起始位置。在这种情况下,将字符串作为第一个传递,将零作为第二个传递,将始终返回路径的“\\”部分。此外,SQL Server子字符串不是基于零的。要获得计数,正确的计数必须从1开始,并且包含在内。你的方法看起来更像Select Select SUBSTRING(SUBSTRING(@path,3,len(@path)-2),1,CHARINDEX('\',SUBSTRING(@path,3,len(@path)-2))-1)你必须找到两次SUBSTRING,这样len()就正确了。好的,谢谢,我不确定这些tbh,必须快点,因为我正要离开工作,我刚刚回到电脑上,我有一个大致的想法,但没有时间好好想一想
    DECLARE @path  VARCHAR(50) = '\\PRODSERVER\D$\EXPORT\Data20160401.txt'
    
    Select SubString(@path,3,(CHARINDEX('\',@path,3)-3))
    
    Filename=substring(string,0,charindex(substring(string,2,len(string)-2),'\')