简体   繁体   中英

How to remove unwanted numbers and/or Special characters from String field in SSIS or SQL

I am new to SSIS. I am trying extract the data from SharePoint and load the data into SQL Server 2012. Most of the fields are coming fine except one. I am getting the unwanted values (random number and # character) like

117;#00.010;#120;#00.013 

where I want to display

00.010;00.013

I tried to use below code in Derived column but still no luck

REPLACE([Related Procedure], SUBSTRING([Related Procedure], 1, FINDSTRING([Related Procedure], "#", 1)), "")

and this is the output I am getting if I use the above code

00.010;#120;#00.013

My desired output is

00.010;00.013

Please note this is using TSQL, it is not an SSIS expression. Below is a solution that will work in SQL Server 2017 or newer. The STRING_AGG function is SQL SERVER 2017 or newer and STRING_SPLIT is SQL SERVER 2016 or newer.

I use STRING_SPLIT to break apart the string by ; , then STRING_AGG to recombine the pieces you want to keep. I added another record to my example to demonstrate how you need to GROUP BY to keep the values in separate rows, otherwise all your values would come back in a single row.

CREATE TABLE #MyTable
(
    Id INT IDENTITY(1,1)
    , [Related Procedure] VARCHAR(100)
)

INSERT INTO #MyTable VALUES
('117;#00.010;#120;#00.013')
, ('118;#00.011;#121;#00.014')

SELECT
    STRING_AGG(REPLACE([value], '#', ''), ';')
FROM 
    #MyTable
    CROSS APPLY STRING_SPLIT([Related Procedure], ';')
WHERE
    [value] LIKE '%.%'
GROUP BY
    Id

Please try this:

IF (OBJECT_ID('tempdb..#temp_table') IS NOT NULL)
    BEGIN
      DROP TABLE #temp_table
    END;
CREATE TABLE #temp_table
(
id int identity(1,1),
    String VARCHAR(MAX)
)

INSERT #temp_table SELECT '117;#00.010;#120;#00.013'

;with tmp (id, value)as (
SELECT  id, replace(value, '#','')   
FROM #temp_table  
CROSS APPLY STRING_SPLIT(String, ';')
where value like '%.%'
)
SELECT  STUFF((SELECT '; ' + value -- or CAST(value AS VARCHAR(MAX)) [text()]
 from tmp
 where id=  t.id
 for xml path(''), TYPE) .value('.','NVARCHAR(MAX)'),1,2,' ') value
 FROM tmp t

or since your sql server version is 2017, you can use STRING_AGG instead of STUFF to concatenate strings returned via CTE.

SELECT STRING_AGG(value, NVARCHAR(MAX)) AS csv FROM tmp group by id;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM