2013-05-06 5 views
1

Ok ребят работают над этой задачей я использовал следующее декоративное заявление, чтобы заполнить различные таблицы примера являетсяКак использовать дифферент, чтобы получить середину слово SQL Server 2008

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,

поэтому мне нужно заполнить SourceName от FilePath, примером может служить \ Doc \ \ ДФС УЗКЗ \ Metadata \ MetaData_Creation_Process \ Members \ Femi \ SELL, исходное имя здесь FEMI. Я правильно структурировал папку, поэтому содержимое до последнего \ всегда является SourceName, я решил его использовать LTRIM, но мне нравится ваша логика и вам понравится Po перетащите SourceName с помощью вашей логики. Надеюсь, это объясняет лучше ?.

Благодаря

+3

Поскольку вы отметили это как 'C#', я предлагаю вам просто разбить его на C#. –

ответ

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 Fiddle Demo

В принципе, CTE разбивает данные на обратную косую черту в качестве разделителя, а затем выбирает следующий с последним с помощью Row_Number.

+0

Вот обновленная скрипка, если у вас больше одной строки - получилось немного уродливым: http://sqlfiddle.com/#!3/36526/1 – sgeddes

+0

спасибо за вашу помощь, похоже, что она работает, но доверие Я никогда не видел что-то подобное в SQL, также, что, если я хочу использовать его для mulple comuns, таких как '\\ doc \ dfs \ SCPD \ Metadata \ MetaData_Creation_Process \ Members \ dsw \ IVNX' alot из них, что мне делать, также можете любезно описать ('/ M') и т. д. – user2183502

+0

@ user2183502 - np, рад, что это помогло. Что вы имеете в виду с несколькими столбцами? – sgeddes

Смежные вопросы