У меня есть таблица под названием user, которая содержит имя поля и адрес электронной почты.
Отправьте электронное письмо всем, следуя этому синтаксису
И я хочу иметь запрос, который обновляет мою таблицу имен, чтобы она выглядела так
name forname
Я уже пробовал использовать string_split.
Как разделить адрес электронной почты на части
Я использовал эту ссылку, чтобы понять, но SELECT выдает мне ошибку.
Дело в том, что я не понимаю, как этим пользоваться.
Если бы кто-нибудь мог просто объяснить, как это работает, было бы здорово.
String_Split разбивает столбец на строки. Вы можете попробовать substring/charindex или, возможно, parsename.


Если я правильно понял ваш вопрос, то есть обновить столбец name именами, включенными в столбец Email, вы можете попробовать этот запрос:
UPDATE [user]
SET name = SUBSTRING(email, 1, CHARINDEX('.', email) - 1) + ' ' + SUBSTRING(email, CHARINDEX('.', email) + 2, CHARINDEX('@', email) - CHARINDEX('.', email) - 2)
WHERE CHARINDEX('.', email) > 0;
по сути, это объединяет две подстроки (с пробелом между ними) и воздействует на них на атрибут name для каждой строки в вашей таблице User, используя заранее известные разделители ('.' и .'@').
предложение WHERE здесь предназначено только для того, чтобы гарантировать, что запрос подействует только на те строки, значения электронной почты которых содержат символ «.». чар.
Спасибо за информацию, я попробовал и получил эту ошибку. Сообщение 537, уровень 16, состояние 3, строка 1. Неверный параметр длины, переданный в функцию LEFT или SUBSTRING.
Как применить ваш пример к этой ссылке Как разделить адрес электронной почты на части Ваша ошибка может быть связана с использованием пользователя в качестве имени таблицы. ПОЛЬЗОВАТЕЛЬ — зарезервированное слово, поэтому с ним необходимо использовать скобки.
SELECT
LEFT(email, CHARINDEX('@', email) - 1) AS accountName
,LEFT(LEFT(email, CHARINDEX('@', email) - 1) , CHARINDEX('.', email) - 1) As [Name before period]
,RIGHT(LEFT(email, CHARINDEX('@', email) - 1) , LEN(LEFT(email, CHARINDEX('@', email) - 1)) - CHARINDEX('.', LEFT(email, CHARINDEX('@', email) - 1))) As [Name after period]
,RIGHT(email, LEN(email) - CHARINDEX('@', email)) AS domainWithExtension
,LEFT(RIGHT(email, LEN(email) - CHARINDEX('@', email)), CHARINDEX('.', RIGHT(email, LEN(email) - CHARINDEX('@', email))) - 1) AS domain
,RIGHT(RIGHT(email, LEN(email) - CHARINDEX('@', email)), LEN(RIGHT(email, LEN(email) - CHARINDEX('@', email))) - CHARINDEX('.', RIGHT(email, LEN(email) - CHARINDEX('@', email)))) AS extension
FROM [user]
поэтому из этого мы можем построить обновление:
UPDATE [user]
SET name=
LEFT(LEFT(email, CHARINDEX('@', email) - 1) , CHARINDEX('.', email) - 1)
+ ' ' +
RIGHT(LEFT(email, CHARINDEX('@', email) - 1) , LEN(LEFT(email, CHARINDEX('@', email) - 1)) - CHARINDEX('.', LEFT(email, CHARINDEX('@', email) - 1)))
Пожалуйста, попробуйте следующее решение, основанное на функции PARSENAME().
Итак, мы будем использовать метод токенизации вместо анализа строк.
Предполагается, что все электронные письма строго соответствуют формату из четырех частей, что и [email protected].
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (id INT IDENTITY PRIMARY KEY, name VARCHAR(50), email VARCHAR(128));
INSERT @tbl (name, email) VALUES
('name1', '[email protected]'),
('name2', '[email protected]');
-- DDL and sample data population, end
-- before
SELECT * FROM @tbl;
UPDATE t1
SET name = PARSENAME(tokens, 4) + SPACE(1) + PARSENAME(tokens, 3)
FROM @tbl AS t1
CROSS APPLY (SELECT REPLACE(email,'@', '.')) AS t2(tokens);
-- after
SELECT * FROM @tbl;
Выход
Не используйте string_split. Вместо этого используйте SUBSTRING и CHARINDEX. Какую ошибку вы получили, когда попытались использовать примеры по ссылке?