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