Я хочу разбить столбец строк, скажем, «99 кристальных пружин дороги» и получить только 2 слова (99 и кристалл) соответственно и обновить 99 до одной колонки и кристалла в другой столбец другой таблицы. Как это сделать, используя charindex и подстроку?SQL SERVER 2008 R2 string split
ответ
Вот некоторые примеры кода на том, как это сделать ...
Во-первых, создать эту функцию:
CREATE FUNCTION [dbo].[GetStringPart]
(@fullString varchar(200), @pos tinyint)
RETURNS VARCHAR(200) -- return_data_type.
AS
BEGIN
IF @pos IS NULL OR @pos <= 0
SET @pos = 1
declare @secondPart varchar(200),@firstPart varchar(200),@output varchar(200)
declare @firstSpace int, @secondSpace int
set @firstSpace = CHARINDEX(' ', @fullString)
IF @firstSpace <= 0
RETURN ''
ELSE IF @pos = 1
BEGIN
SET @output = LTRIM(RTRIM(SUBSTRING(@fullString, 1, @firstSpace)))
END
ELSE
BEGIN
SET @secondSpace = CHARINDEX(' ', @fullString, CHARINDEX(' ', @fullString)+1) - CHARINDEX(' ', @fullString)+1
IF @secondSpace <= 0
SET @secondSpace = LEN(@fullString) - @firstSpace + 1
SET @output = LTRIM(RTRIM(SUBSTRING(@fullString, @firstSpace, @secondSpace)))
END
RETURN @Output
END
GO
Затем вы можете использовать его как это:
declare @origTable table(name varchar(100))
insert into @origTable (name) values ('99 crystal springs road')
declare @newTable table(col1 varchar(100), col2 varchar(100))
INSERT INTO @newTable (col1, col2)
SELECT dbo.GetStringPart(name, 1), dbo.GetStringPart(name, 2) FROM @origTable
select * from @newTable
Я получаю «Неверный параметр длины, переданный функции LEFT или SUBSTRING». – rsDesigner
У меня есть таблица с записями адресов, как указано выше. разделить адрес и получить только первые два слова и сбросить в другую таблицу. Надеюсь, я правильно объясню эту проблему. – rsDesigner
Причина этой ошибки была, вероятно, в том, что у вас не было 2 пробелов в каждой строке. Я бы создал функцию, а затем вызвал эту функцию. Функция может иметь некоторую логику для проверки этого второго пространства. Я пересмотрел свой ответ выше. –
Предполагая что вы выбираете «99» и «кристалл» только потому, что это первые два слова ...
Вы можете сделать это i на один шаг, но для удобства чтения решения я отделил из
declare @sourceAddresses table
(
address varchar(100)
)
declare @split table
(
address varchar(100),
firstDelimiter int,
secondDelimiter int
)
declare @table table
(
part1 varchar(20),
part2 varchar(20)
)
insert into @sourceAddresses (address) values ('99 crystal springs road')
insert into @sourceAddresses (address) values ('100 elsewhere road')
insert into @split (address, firstDelimiter)
select address, charindex(' ', address)
from @sourceAddresses
update @split
set secondDelimiter = charindex(' ', address, (firstDelimiter+1))
where firstDelimiter > -1
insert into @table (part1, part2)
select substring(address, 0, firstDelimiter), substring(address, (firstDelimiter+1), (secondDelimiter-firstDelimiter))
from @split
where firstDelimiter > -1
and secondDelimiter > -1
select * from @table
мой код «Вставить в @ таблицу»: – rsDesigner
Обновленное решение для использования исходной таблицы адресов, а не только одного адреса переменной – kaj
Это работает для примера, но когда я использую фактические данные длиной в 90 символов, он выдает длину Invalide передается функции LEFT или SUBSTRING. Возможно, из-за NULLS или EMPTY? ИЛИ Если есть только два слова типа «9-й улицы»? – rsDesigner
Может быть что-то вроде этого:
Сначала нужно создать функцию, которая получает часть строки:
CREATE FUNCTION dbo.GetStringPart (@sep char(1), @s varchar(512),@pos int)
RETURNS VARCHAR(200)
AS
BEGIN
DECLARE @output VARCHAR(200)
;WITH Pieces(pn, start, stop) AS (
SELECT 1, 1, CHARINDEX(@sep, @s)
UNION ALL
SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
FROM Pieces
WHERE stop > 0
)
SELECT
@output=SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END)
FROM Pieces
WHERE [email protected]
RETURN @Output
END
GO
Тогда вы можете легко сделать это:
DECLARE @origalTable TABLE(name VARCHAR(100))
INSERT INTO @origalTable
VALUES('99 crystal springs road')
DECLARE @newTable TABLE(col1 VARCHAR(100), col2 VARCHAR(100))
INSERT INTO @newTable (col1, col2)
SELECT dbo.GetStringPart(' ',name, 1), dbo.GetStringPart(' ',name, 2) FROM @origalTable
SELECT * FROM @newTable
DROP FUNCTION dbo.GetStringPart
- 1. SQL Server 2008 R2:
- 2. SQL Server 2008 R2: IDENTITY
- 3. SQL Server 2008 R2: ROW_NUMBER()
- 4. SQL Server 2008 R2 Trigger
- 5. SQL Server 2008 R2 pagination
- 6. SQLDependency SQL Server 2008 R2
- 7. SQL Server 2008 R2 поворота
- 8. Обновление SQL Server 2008 до 2008 R2
- 9. Linked Server в SQL Server 2008 R2
- 10. SQL Server 2008 Split String From Field In Record
- 11. ELMAH и SQL Server 2008 R2?
- 12. Не удается установить SQL Server 2008 R2
- 13. Retryable SQLBulkCopy для SQL Server 2008 R2
- 14. SQL Split string
- 15. Различия между SQL Server 2008 R2 и SQL Server 2008 R2 RTM
- 16. Обновление с SQL Server 2008 R2 Express до SQL Server 2008 R2 Enterprise
- 17. Миграция из SQL Server 2008 R2 Express для SQL Server 2008 R2 Разработчики Издание
- 18. SQL Server 2008 R2 Отсутствует параметр
- 19. Try_Convert для SQL Server 2008 R2
- 20. SQL Server 2008 R2: Подготовьте динамический WILDCARD
- 21. SQL Server 2008 R2: Избегайте наоборот записи
- 22. SSRS с использованием Sql Server 2008 R2
- 23. как подключить Microsoft SQL Server 2008 R2
- 24. Hashtable в SQL Server 2008 R2
- 25. Использование функций в SQL Server 2008 R2
- 26. PHP для запроса SQL Server 2008 R2
- 27. Установка процессоров SQL Server 2008 R2/2
- 28. Производительность SQL Server 2008 R2 Express DataReader
- 29. Поддержка FluentNhibernate для SQL Server 2008 R2
- 30. Каков уровень совместимости SQL Server 2008 r2
Каковы правила, почему вы хотите только 99 и кристалл? Потому что это первые два слова? – kaj