如何在sql中将字符串拆分为变量?

时间:2013-12-20 07:19:47

标签: sql sql-server sql-server-2008

我有一个看起来像BAT | CAT | RAT | MAT的字符串我想把这个字符串分成4个部分,然后分别存储在4个不同的变量中,分别说.. @ a,@ b,@ c,@ d。 我在代码中执行此操作,但我不确定如何在sql中执行此操作?  谢谢。

3 个答案:

答案 0 :(得分:7)

用于分割char:

DECLARE @A VARCHAR (100)= 'cat | bat | sat'

SELECT items
INTO #STRINGS 
FROM dbo.split(@A,'|')

也可以看到这个链接

DECLARE @test varchar(max);
set @test = 'Peter/Parker/Spiderman/Marvel';
set @test = Replace(@test, '/', '.');

SELECT ParseName(@test, 4) --returns Peter
SELECT ParseName(@test, 3) --returns Parker
SELECT ParseName(@test, 2) --returns Spiderman
SELECT ParseName(@test, 1) --returns Marvel

SQL Server 2005 : split string into array and get array(x)?

分割字符串的解决方法:

http://www.sqlperformance.com/2012/07/t-sql-queries/split-strings

答案 1 :(得分:6)

您可以拆分值并将它们插入表变量中,然后将它们分配给您的变量,如下所示:

DECLARE @DataSource TABLE
(
    [ID] TINYINT IDENTITY(1,1)
   ,[Value] NVARCHAR(128)
)   

DECLARE @Value NVARCHAR(MAX) = 'BAT | CAT | RAT | MAT'

DECLARE @XML xml = N'<r><![CDATA[' + REPLACE(@Value, '|', ']]></r><r><![CDATA[') + ']]></r>'

INSERT INTO @DataSource ([Value])
SELECT RTRIM(LTRIM(T.c.value('.', 'NVARCHAR(128)')))
FROM @xml.nodes('//r') T(c)

SELECT [ID] 
      ,[Value]
FROM @DataSource

此查询的结果是:

enter image description here

注意,这种技术是动态的 - 它会拆分用|分割的任何字符串数,并将它们存储在表变量表中。

答案 2 :(得分:3)

美好而简单。 (在Microsoft SQL Server Management Studio中使用PATINDEX。)

DECLARE @string varchar(25) = 'BAT | CAT | RAT | MAT'
DECLARE @one varchar(5) = null
DECLARE @two varchar(5) = null
DECLARE @three varchar(5) = null
DECLARE @four varchar(5) = null

BEGIN

      SET @one = SUBSTRING(@string, 0, PATINDEX('%|%', @string)) 
      SET @string = SUBSTRING(@string, LEN(@one + '|') + 1, LEN(@string))

      SET @two = SUBSTRING(@string, 0, PATINDEX('%|%', @string))
      SET @string = SUBSTRING(@string, LEN(@two + '|') + 1, LEN(@string))

      SET @three = SUBSTRING(@string, 0, PATINDEX('%|%', @string))
      SET @string = SUBSTRING(@string, LEN(@three + '|') + 1, LEN(@string))

      SET @four = @string

      SELECT @one AS Part_One, @two AS Part_Two, @three AS Part_Three, @four AS Part_Four
END