Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在sql中将字符串拆分为变量?_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

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

如何在sql中将字符串拆分为变量?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个字符串,看起来像BAT | CAT | RAT | MAT我想把这个字符串分成4部分,然后将它们存储到4个不同的变量中,比如@a、 分别为@b、@c和@d 如何在sql中实现这一点 用于围绕字符进行拆分: DECLARE @A VARCHAR (100)= 'cat | bat | sat' SELECT items INTO #STRINGS FROM dbo.split(@A,'|') 另请参见此链接 DECLARE @test varchar(max); set @test

我有一个字符串,看起来像
BAT | CAT | RAT | MAT
我想把这个字符串分成4部分,然后将它们存储到4个不同的变量中,比如@a、 分别为@b、@c和@d


如何在sql中实现这一点

用于围绕字符进行拆分:

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

拆分字符串的变通方法:


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

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
DECLARE@DataSource表
(
[ID]TINYINT标识(1,1)
,[Value]NVARCHAR(128)
)   
声明@Value NVARCHAR(MAX)='BAT | CAT | RAT | MAT'
声明@XML=N“”
插入到@DataSource([Value])
选择RTRIM(LTRIM(T.c.值('.',NVARCHAR(128)))
来自@xml.nodes('//r')T(c)
选择[ID]
,[价值]
来自@DataSource
如果此查询为:

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

非常简单。 (在Microsoft SQL Server Management Studio中使用PATINDEX。)


使用CHARINDEX,看这里:这是否有用,因为您面临的问题此线程可能会帮助您解析名称是标准的聪明答案,但它实际上不是一个很好的答案,因为它需要
sysname
数据类型。就做普通的字符串切碎。@ErikE你能详细解释一下为什么要避免使用
ParseName
,因为这段代码对我来说似乎很有吸引力。好吧,我刚刚意识到,一个人只能拆分4个参数,如果有第5个参数,它只会返回null。我错了吗?事实上,你是对的,请访问链接了解更多信息。如果你想使用句点怎么办?如果希望字符串长度超过255个字符,该怎么办?你看过ParseName的代码了吗?如果我没记错的话,它非常难看。滥用系统功能让我心惊肉跳。这似乎是个坏主意。如果你只有3个代币而不是4个代币,并且要4个代币怎么办?有没有更简单的方法?我有一个函数,它负责分割一长串参数,但我一直在寻找一些简单的方法来分割一个已知参数数的字符串\这是一种众所周知的分割字符串的技术,而且非常简单。如果您有一个实现此方法的函数,您可以在任何需要的地方使用它。
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