如何从表中的String插入数据?

时间:2014-12-20 14:16:36

标签: sql sql-server function

我在表 PersonDetail 上,其中包含NAME和AGE作为列。 我正在使用一个应用程序,它将所有数据作为字符串用逗号和管道分隔值,如'Acton,58 | Nairi,20 | Sara,14 | Denny,52'(格式与给定的相同)

我想将该数据插入表格(PersonDetail),但我不知道如何将其作为NAME和AGE分开。

有人建议我创建可以分离数据的函数,但我不知道这样做。 谁能给我一个建议? 在此先感谢:)

3 个答案:

答案 0 :(得分:1)

您可以创建多语句表值函数来分隔数据。 你只需要将每个NAME和AGE插入表类型变量中,插入后你应该返回下面给出的表。

CREATE FUNCTION UDF_InsertDataFromString
(
@dataString VARCHAR(5000)
)
RETURNS @insertedData TABLE
(
NAME VARCHAR(30),
AGE INT
)
AS 
BEGIN
    DECLARE @pipeIndex INT,
            @commaIndex INT,
            @LENGTH INT,
            @NAME VARCHAR(100),
            @AGE INT
    SELECT @LENGTH = LEN(RTRIM(LTRIM(@dataString))),
           @dataString = RTRIM(LTRIM(@dataString))

    WHILE (@LENGTH <> 0)
    BEGIN
        SELECT @LENGTH = LEN(@dataString),
               @commaIndex = CHARINDEX(',', @dataString),
               @pipeIndex = CHARINDEX('|', @dataString)
        IF(@pipeIndex = 0) SET @pipeIndex = @LENGTH +1
        SELECT @NAME = RTRIM(LTRIM(SUBSTRING(@dataString, 1, @commaIndex-1))),
               @AGE = RTRIM(LTRIM(SUBSTRING(@dataString, @commaIndex+1, @pipeIndex-@commaIndex-1))),
               @dataString = RTRIM(LTRIM(SUBSTRING(@dataString, @pipeIndex+1, @LENGTH-@commaIndex-1)))
            INSERT INTO @insertedData(NAME, AGE)    
            VALUES(@NAME, @AGE)
        SELECT @LENGTH = LEN(@dataString)       
    END
    RETURN
END

现在你可以在从字符串插入数据时使用这个函数,你只需要将字符串作为参数传递给函数,如下所示。

DECLARE @personDetail TABLE(NAME VARCHAR(30), AGE INT)

INSERT INTO @personDetail(NAME, AGE)
SELECT NAME, AGE 
FROM dbo.UDF_InsertDataFromString('Acton,58|Nairi,20|Sara,14|Denny,52')

SELECT NAME, AGE
FROM @personDetail

答案 1 :(得分:1)

使用此拆分功能

CREATE FUNCTION [dbo].[fnSplitString] 
( 
    @string NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @output TABLE(splitdata NVARCHAR(MAX) 
) 
BEGIN 
    DECLARE @start INT, @end INT 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
    WHILE @start < LEN(@string) + 1 BEGIN 
        IF @end = 0  
            SET @end = LEN(@string) + 1

        INSERT INTO @output (splitdata)  
        VALUES(SUBSTRING(@string, @start, @end - @start)) 
        SET @start = @end + 1 
        SET @end = CHARINDEX(@delimiter, @string, @start)

    END 
    RETURN 
END

然后使用此查询

DECLARE @x table ( id  int identity(1,1)
    ,                  str varchar(50) )
    DECLARE @str varchar(50)='Acton,58|Nairi,20|Sara,14|Denny,52'
    INSERT INTO @x
    SELECT *
    FROM [dbo].[fnSplitString] (@str ,'|')
    SELECT *
    from @x
    DECLARE @y int=(SELECT count(*)
    FROM @x)
    DECLARE @e varchar(50)
    DECLARE @b varchar(50)
    DECLARE @c varchar(50)
    WHILE @y!=0
    BEGIN
        set @e =(SELECT str
        FROM @x
        where id=@y)
        set @b =(substring(@e,1,(charindex(',',@e)-1)))
        set @c = (substring(@e,(charindex(',',@e)+1),len(@e)-charindex(',',@e)))


        INSERT INTO PersonDetail
        SELECT distinct @b
        ,               @c
        FROM @x
        SET @y=@y-1
    END

答案 2 :(得分:1)

是的,你可以创建自己的功能。

只需要为该

应用不同的字符串函数

https://msdn.microsoft.com/en-IN/library/ms181984.aspx