2016-09-26 37 views
0

我需要分隔符|分割字符串,那么获得的每一个值,我需要在名称字段中插入相同的,像这样:分割字符串在T-SQL和插入参数

​​

下面是我的代码来分割字符串。

DECLARE @SplitStringTable TABLE (Value nvarchar(MAX) NOT NULL) 
DECLARE @StringToSplit nvarchar(MAX) = 'abc|def|gh|ijj' 
DECLARE @SplitEndPos int 
DECLARE @SplitValue nvarchar(MAX) 
DECLARE @SplitDelim nvarchar(1) = '|' 
DECLARE @SplitStartPos int = 1 

SET @SplitEndPos = CHARINDEX(@SplitDelim, @StringToSplit, @SplitStartPos) 

WHILE @SplitEndPos > 0 
BEGIN 
    SET @SplitValue = SUBSTRING(@StringToSplit, @SplitStartPos, (@SplitEndPos - @SplitStartPos)) 

    INSERT @SplitStringTable (Value) VALUES (@SplitValue) 

    SET @SplitStartPos = @SplitEndPos + 1 
    SET @SplitEndPos = CHARINDEX(@SplitDelim, @StringToSplit, @SplitStartPos) 
END 

BEGIN TRANSACTION T1 

    DECLARE @i int = 0 

    WHILE @i < @SplitEndPos 
    BEGIN 
     INSERT INTO Monitoring (UserId, Name, DateCreated) 
     VALUES (@UserId, @Name, getdate()) 

     SET @i = @i + 1 
    END 

    COMMIT TRANSACTION T1 

请帮忙,我该怎么办?

+3

没有必要诉诸循环的分裂字符串。请参阅这篇文章并更换您的字符串拆分器。 http://sqlperformance.com/2012/07/t-sql-queries/split-strings –

+0

肖恩说,他发布的链接是一篇文章,描述了在2012年之前的系统上拆分字符串的最快方法。如果您运行的是SQL Server 2012+,那么这个版本的速度稍微快一些,可以利用LEAD分析功能:http://www.sqlservercentral.com/articles/SQL+Server+2012/106903/ –

回答

1

这里有很多拆分/解析函数。

假设变量:

Declare @UserID int = 1 
Declare @String varchar(max)='abc|def' 

Insert Into Monitoring (UserId,Name,DateCreated) 
Select UserID  = @UserID 
     ,Name  = Key_Value 
     ,DateCreated = GetDate() 
From [dbo].[udf-Str-Parse](@String,'|') 

以下将被插入

UserID Name DateCreated 
1  abc  2016-09-26 17:31:24.107 
1  def  2016-09-26 17:31:24.107 

的UDF如果需要

CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimiter varchar(10)) 
Returns Table 
As 

Return 
( 
    Select Key_PS = Row_Number() over (Order By (Select null)) 
      ,Key_Value = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)'))) 
    From (Select x = Cast('<x>'+ Replace(@String,@Delimiter,'</x><x>')+'</x>' as xml).query('.')) as A 
    Cross Apply x.nodes('x') AS B(i) 
); 

编辑

顺便说一句,如果你只是单独运行的解析功能,你会得到如下:

Declare @String varchar(max)='abc|def' 
    Select * From [dbo].[udf-Str-Parse](@String,'|') 

-- Returns 

    Key_PS Key_Value 
    1  abc 
    2  def 
+0

真的很喜欢这里的超快速解析器, http://stackoverflow.com/questions/39650912/how-to-pass-an-array-of-integer-values-from-a-table-to-a-stored-procedure/39651231#39651231。 –