2014-12-20 6 views
1

У меня есть на столе PersonDetail, который содержит NAME и AGE как столбец. Я использую одно приложение, которое принимает все данные в виде строки запятой и трубы со значениями, отделенными как «Актон, 58 | Наири, 20 | Sara, 14 | Denny, 52» (Формат такой же, как указано)Как вставить данные из строки в таблицу?

Я хочу вставить эти данные в таблицу (PersonDetail), но я не знаю, как я могу отделить ее как ИМЯ и ВОЗРАСТ.

Кто-то предложил мне создать функцию, которая может отделять данные, Но я не знаю, как это сделать. Может ли кто-нибудь дать мне предложение? Заранее спасибо :)

+0

Используйте приложение для анализа данных. Или прочитайте его непосредственно из файла, используя 'bulk import'. –

ответ

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, @[email protected]))), 
       @dataString = RTRIM(LTRIM(SUBSTRING(@dataString, @pipeIndex+1, @[email protected]))) 
      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 
+0

Спасибо человеку за это решение. я попробую это :) –

+0

ваш прием :) –

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 [email protected]) 
     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 @[email protected] 
    END 
Смежные вопросы