Как удалить ненужные числа и / или специальные символы из поля String в SSIS или SQL - PullRequest
0 голосов
/ 10 января 2020

Я новичок в SSIS. Я пытаюсь извлечь данные из SharePoint и загрузить данные в SQL Server 2012. Большинство полей в порядке, кроме одного. Я получаю нежелательные значения (случайное число и # символ), такие как

117;#00.010;#120;#00.013 

, где я хочу отобразить

00.010;00.013

Я пытался использовать приведенный ниже код в столбце Производные, но все еще не повезло

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

и это вывод, который я получаю, если использую приведенный выше код

00.010;#120;#00.013

Мой желаемый вывод

00.010;00.013

Ответы [ 2 ]

0 голосов
/ 10 января 2020

Пожалуйста, попробуйте это:

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

или поскольку ваша sql версия сервера 2017 года, вы можете использовать STRING_AGG вместо STUFF для объединения строк, возвращаемых через CTE.

SELECT STRING_AGG(value, NVARCHAR(MAX)) AS csv FROM tmp group by id;
0 голосов
/ 10 января 2020

Обратите внимание, что используется T SQL, это не выражение SSIS. Ниже приведено решение, которое будет работать в SQL Server 2017 или новее. STRING_AGG - это SQL SERVER 2017 или новее, а STRING_SPLIT - SQL SERVER 2016 или новее.

Я использую STRING_SPLIT, чтобы разбить строку ;, затем STRING_AGG, чтобы объединить части, которые вы хотите сохранить. Я добавил еще одну запись в мой пример, чтобы продемонстрировать, как вам нужно GROUP BY , чтобы хранить значения в отдельных строках, иначе все ваши значения вернутся в одной строке.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...