SQL Server: Как Вы удаляете пунктуацию из поля?

Я использую шаблонное метапрограммирование все время, но в D, не C++. Шаблонный метаязык C++ был первоначально разработан для простой параметризации типа и стал полным по Тьюрингу метаязыком почти случайно. Это - поэтому Turing tarpit, что только Andrei Alexandrescu, не простые смертные, может использовать.

шаблонный подъязык D, с другой стороны, был на самом деле разработан для метапрограммирования вне простой параметризации типа. Andrei Alexandrescu , кажется, любит его, , но другие люди могут на самом деле понять его шаблоны D. Также достаточно мощно, что кто-то записал трассировщик лучей времени компиляции в нем как подтверждение концепции.

я предполагаю большую часть useful/non-trivial метапрограммы, которую я когда-либо писал в D, был шаблон функции, который, учитывая тип структуры как шаблонный параметр и список заголовка столбца называет в порядке, соответствующем объявлениям переменной в структуре как параметр периода выполнения, будет читать в файле CSV и возвращать массив структур, один для каждой строки, с каждым полем структуры, соответствующим столбцу. Все преобразования типов (строка для плавания, интервал, и т.д.) сделаны автоматически, на основе типов шаблонных полей.

Другой хороший, который главным образом работает, но все еще не обрабатывает несколько случаев правильно, является глубоким шаблоном функции копии, который обрабатывает структуры, классы, и выстраивает правильно. Это использует только отражение/самоанализ времени компиляции, так, чтобы это могло работать со структурами, которые, в отличие от полноценных классов, не имеют никаких возможностей отражения/самоанализа во время выполнения в D, потому что они, как предполагается, легки.

11
задан Ev. 30 November 2009 в 08:05
поделиться

5 ответов

Ideally, you would do this in an application language such as C# + LINQ as mentioned above.

If you wanted to do it purely in T-SQL though, one way make things neater would be to firstly create a table that held all the punctuation you wanted to removed.

CREATE TABLE Punctuation 
(
    Symbol VARCHAR(1) NOT NULL
)

INSERT INTO Punctuation (Symbol) VALUES('''')
INSERT INTO Punctuation (Symbol) VALUES('-')
INSERT INTO Punctuation (Symbol) VALUES('.')

Next, you could create a function in SQL to remove all the punctuation symbols from an input string.

CREATE FUNCTION dbo.fn_RemovePunctuation
(
    @InputString VARCHAR(500)
)
RETURNS VARCHAR(500)
AS
BEGIN
    SELECT
        @InputString = REPLACE(@InputString, P.Symbol, '')
    FROM 
        Punctuation P

    RETURN @InputString
END
GO

Then you can just call the function in your UPDATE statement

UPDATE tblMyTable SET FieldName = dbo.fn_RemovePunctuation(FieldName)
17
ответ дан 3 December 2019 в 01:44
поделиться

Вы можете использовать регулярные выражения в SQL Server - вот статья, основанная на SQL 2005:

http://msdn.microsoft.com/en-us/magazine/cc163473.aspx

3
ответ дан 3 December 2019 в 01:44
поделиться

Если это одноразовая вещь, я бы использовал фрагмент C # + LINQ в LINQPad для выполнения работы с регулярными выражениями.

Это быстро и легко, и вам не нужно проходить процесс настройки хранимой процедуры CLR, а затем убирать за собой.

0
ответ дан 3 December 2019 в 01:44
поделиться

Я предлагаю 2 решения

Решение 1. Создайте таблицу шумов и замените шумы на пробелы

например,

DECLARE @String VARCHAR(MAX)
DECLARE @Noise TABLE(Noise VARCHAR(100),ReplaceChars VARCHAR(10))
SET @String = 'hello! how * > are % u (: . I am ok :). Oh nice!'

INSERT INTO @Noise(Noise,ReplaceChars)
SELECT '!',SPACE(1) UNION ALL SELECT '@',SPACE(1) UNION ALL
SELECT '#',SPACE(1) UNION ALL SELECT '$',SPACE(1) UNION ALL
SELECT '%',SPACE(1) UNION ALL SELECT '^',SPACE(1) UNION ALL
SELECT '&',SPACE(1) UNION ALL SELECT '*',SPACE(1) UNION ALL
SELECT '(',SPACE(1) UNION ALL SELECT ')',SPACE(1) UNION ALL
SELECT '{',SPACE(1) UNION ALL SELECT '}',SPACE(1) UNION ALL
SELECT '<',SPACE(1) UNION ALL SELECT '>',SPACE(1) UNION ALL
SELECT ':',SPACE(1)

SELECT @String = REPLACE(@String, Noise, ReplaceChars) FROM @Noise
SELECT @String Data

Решение 2. С таблицей номеров

DECLARE @String VARCHAR(MAX)
SET @String = 'hello! & how * > are % u (: . I am ok :). Oh nice!'

;with numbercte as
(
 select 1 as rn
 union all
 select rn+1 from numbercte where rn<LEN(@String)
)
select REPLACE(FilteredData,'&#x20;',SPACE(1)) Data from 
(select SUBSTRING(@String,rn,1) 
from numbercte  
where SUBSTRING(@String,rn,1) not in('!','*','>','<','%','(',')',':','!','&','@','#','$')

for xml path(''))X(FilteredData)

Вывод (Оба случая)

Data

hello  how   are  u  . I am ok . Oh nice

Примечание. Я только что поместил некоторые шумы. Возможно, вам придется добавить необходимые вам шумы.

Надеюсь, это поможет

7
ответ дан 3 December 2019 в 01:44
поделиться

I'd wrap it in a simple scalar UDF so all string cleaning is in one place if it's needed again.

Then you can use it on INSERT too...

1
ответ дан 3 December 2019 в 01:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: