Sql 如何从表中的字符串插入数据?

Sql 如何从表中的字符串插入数据?,sql,sql-server,function,Sql,Sql Server,Function,我在表PersonDetail上有一个列表,其中包含姓名和年龄作为列。 我正在使用一个应用程序,该应用程序通过逗号和管道分隔值将所有数据作为字符串,如'Acton,58 | Nairi,20 | Sara,14 | Denny,52'(格式与给定格式相同) 我想将该数据插入表(Persondeail),但我不知道如何将其作为名称和年龄分开 有人建议我创建一个可以分离数据的函数,但我不知道该怎么做。 谁能给我提个建议吗?? 提前感谢:)您可以创建多语句表值函数来分隔数据。 您只需将每个名称和年龄插

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

我想将该数据插入表(Persondeail),但我不知道如何将其作为名称和年龄分开

有人建议我创建一个可以分离数据的函数,但我不知道该怎么做。 谁能给我提个建议吗??
提前感谢:)

您可以创建多语句表值函数来分隔数据。 您只需将每个名称和年龄插入表类型变量,插入后应返回该表,如下所示

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
使用此拆分函数

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