我想分割一列字符串,如「99 crystal springs road」,並分別獲得2個字(99和水晶),並將99更改爲一列,並將水晶更新爲另一個表的另一列。我怎樣才能使用charindex和substring?SQL SERVER 2008 R2字符串拆分
回答
這裏是如何做到這一點一些示例代碼...
首先,創建這個函數:
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
我得到「無效的長度參數傳遞給左或SUBSTRING函數。」 – rsDesigner 2012-02-29 23:50:36
我有一張表,上面有地址記錄。拆分地址並只獲得前兩個單詞並轉儲到另一個表中。我希望我正確地解釋這個問題。 – rsDesigner 2012-02-29 23:52:17
該錯誤的原因可能是因爲您在每一行中沒有2個空格。我會創建一個函數,然後調用該函數。該函數可以有一些邏輯來檢查第二個空間。我修改了上面的答案。 – 2012-03-01 00:17:56
假設你選擇「99」和「水晶」只是因爲他們是前兩個字...
你可以做到這一點我吶一步,但爲了便於閱讀的解決方案,我已經分離出來
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
我的「插入@table」代碼: – rsDesigner 2012-03-01 00:05:54
更新的解決方案使用的是地址源表而不是單個變量地址 – kaj 2012-03-01 00:11:49
這適用於此示例,但是當我使用長度爲90個字符的實際數據時,它會拋出殘差長度傳遞給LEFT或SUBSTRING函數。這可能是因爲NULLS還是EMPTY?或者如果只有兩個詞如「9街」? – rsDesigner 2012-03-01 00:19:37
也許是這樣的:
首先創建一個獲取字符串的一部分功能:
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:刪除字符串的一部分
- 3. SQL Server 2008從記錄字段中拆分字符串
- 4. SQL Server 2008 R2分組
- 5. SQL Server 2008 R2分頁
- 6. SQL拆分字符串
- 7. 如何在SQL Server 2008中拆分字符串
- 8. 轉義字符SQL Server 2008 R2 [%]
- 9. SQL Server 2008 R2:將列拆分爲兩部分
- 10. SQL Server臨時表拆分字符串
- 11. 拆分SQL Server中的字符串
- 12. 查找字符串中的任何字母SQL Server 2008 R2
- 13. 如何檢查字符串是否包含某些字符並將其拆分到SQL Server 2008 R2中?
- 14. SQLDependency SQL Server 2008 R2
- 15. SQL Server 2008 R2 OBJECT_ID
- 16. SQL Server 2008 R2中如何列值拆分到多個行
- 17. 如何搜索Sql Server 2008 R2存儲過程的字符串?
- 18. SQL Server 2008 R2無提示安裝的連接字符串
- 19. ASP.NET中Microsoft SQL Server 2008 R2的連接字符串
- 20. Visual Studio連接字符串 - Microsoft SQL Server 2008 R2
- 21. 在SQL Server 2008 R2 Express中使用ServiceStack.OrmLite的Unicode字符串
- 22. SQL Server 2008 R2日語錯誤(NVARCHAR)字符串比較?
- 23. SQL Server 2008 R2和SQL Server 2008 R2 RTM之間的差異
- 24. 從SQL Server 2008 R2 Express升級到SQL Server 2008 R2企業
- 25. 如何將.asp頁面的連接字符串寫入sql server SQL Server 2008 R2
- 26. SQL Server 2008 R2的連接字符串與SQL Server Express的對比
- 27. 在SQL Server 2008中將字符串拆分成固定長度的部分
- 28. 拆分字符串Teradata SQL
- 29. 分組/聚合在SQL Server 2008 R2
- 30. SQL Server 2008 R2 - 選擇分層數據
什麼是規則,爲什麼你只想要99和水晶?因爲他們是前兩個字? – kaj 2012-02-29 23:38:43