1

好的,从事这项任务的人我使用以下修剪语句来填充不同的表,例如

select Distinct 
    rtrim(right(FilePath, charindex('\', reverse(FilePath)) - 1)) 
from 
    [test].[dbo].[FileMetadata]s 

在我的表格中拉出 \ 之后的最后一个字符串,现在我需要拉出的字符串是本列中的 ABC\\doc\dfs\SCPD\Metadata\MetaData_Creation_Process\Members\ABC\SELL

我该怎么做?

谢谢你的帮助?..


@sgeddes

CREATE TABLE [dbo].[FileMetadata]([FileID] [bigint] IDENTITY(1,1) NOT NULL, [FileName] [varchar](500) NOT NULL, [FilePath] [nvarchar](500) NULL, [SourceName] [varchar](150) NULL, [SenderName] [varchar](150) NULL, [FileSize] [varchar](150) NULL, [FileAttributes] [varchar](100) NULL, [FileExists] [varchar](10) NULL, [TypeID] [int] NULL, [ReceivedDate] [datetime] NULL, [FileModifiedDate] [datetime] NULL, [ContentID] [int] NULL, [TransMethodID] [int] NULL, [ReceiverName] [varchar](150) NULL, [LastUpdateTime] [datetime] NULL,

所以我需要从FilePath填充SourceName,一个例子是\Doc\dfs\SCPD\Metadata\MetaData_Creation_Process\Members\Femi\SELL,这里的源名是FEMI我把文件夹组织得很好,所以最后一个\之前的内容始终是 SourceName,我已经使用 LTRIM 解决了它,但我喜欢您的逻辑,并希望使用您的逻辑填充 SourceName。我希望这能解释得更好?

谢谢

4

1 回答 1

0

您可以引入一个拆分函数,或者使用我不久前学到的这个技巧,CROSS APPLY根据分隔符将数据拆分为多个字段:

WITH CTE AS (
  SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) rn,
  Split.a.value('.', 'VARCHAR(100)') AS filepart  
  FROM  
     (SELECT 
        CAST ('<M>' + REPLACE(FilePath, '\', '</M><M>') + '</M>' AS XML) AS String  
      FROM  FileMetadata
     ) AS A 
  CROSS APPLY String.nodes ('/M') AS Split(a)
)
SELECT C.FilePart
FROM CTE C
  JOIN (SELECT MAX(rn) maxRn FROM CTE) C2 ON C.rn = C2.maxRn-1

SQL 小提琴演示

基本上,CTE 使用反斜杠作为分隔符拆分数据,然后使用 Row_Number 选择倒数第二个。

于 2013-05-06T18:22:02.833 回答