简体   繁体   中英

Import Export data from a CSV file to SQL Server DB?

I am working on a web application where i have to do a import export functionality. i am new in this so i want your suggestions and there are some issues that i am facing to do this functionality,

So first i have a JSON array from Frontend (AngularJs)

 [ { "MyName": "Shubham", "UserType": "Premium", "DialCode": "India", "ContactNumber": "9876543210", "EmailAddress": "Contact@Shubh.com" "Country": "India", "Notes": "Notes-Notes-Notes-Notes" }, { "MyName": "Shubham 2", "UserType": "Free Trial", "DialCode": "India", "ContactNumber": "123456789", "EmailAddress": "Contact2@Shubh.com" "Country": "India", "Notes": "Notes-Notes-Notes-Notes" } ] 

Now i am converting this array to a XML in NodeJs Using XMLbuilder Like This

<UserXML>
    <MyName>Shubham</MyName>
    <UserType>Premium</UserType>
    <DialCode>India</DialCode>
    <ContactNumber>9876543210</ContactNumber>
    <EmailAddress>Contact@Shubh.com</EmailAddress>
    <Country>India</Country>
    <Notes>Notes-Notes-Notes-Notes</Notes>
</UserXML>
<UserXML>
    <MyName>Shubham 2</MyName>
    <UserType>Free Trial</UserType>
    <DialCode>India</DialCode>
    <ContactNumber>123456789</ContactNumber>
    <EmailAddress>Contact2@Shubh.com</EmailAddress>
    <Country>India</Country>
    <Notes>Notes2-Notes2-Notes2-Notes2</Notes>
</UserXML>

Now i am using this XML in SQL Server to insert these 2 records into my user table now the issue is i have another table where country code and country name is saved i am using Foreign Key ref in my user table i have made a sample code

DROP TABLE IF EXISTS #Country
DROP TABLE IF EXISTS #user
DROP TABLE IF EXISTS #UserType


 CREATE TABLE #Country
(
    Id INT PRIMARY KEY  identity(1 ,1),
    Name VARCHAR(50) NOT NULL,
    DialCode VARCHAR(50) NOT NULL
 )
 CREATE TABLE #UserType
(
    Id INT PRIMARY KEY  identity(1 ,1),
    Name VARCHAR(50) NOT NULL
 )
 CREATE TABLE #user
(
    Id                INT PRIMARY KEY  IDENTITY(1 ,1),
    Name              VARCHAR(50) NOT NULL,
    UserTypeId        INT NOT NULL,
    DialCodeId        INT NOT NULL,
    ContactNumber     VARCHAR(50) NOT NULL,
    EmailAddress      VARCHAR(50) NOT NULL,
    CountryId         INT NOT NULL,
    Notes      VARCHAR(50) NOT NULL
   FOREIGN KEY(CountryId) REFERENCES #Country(Id),
   FOREIGN KEY(UserTypeId) REFERENCES #UserType(Id)
);



INSERT INTO #Country (Name,DialCode)
VALUES ('India','+91'), 
       ('Dubai','+971'),
       ('U.S','+1') ;
INSERT INTO #UserType (Name)
VALUES ('Premium'), 
       ('Free Trial');

CASE 1 (Working Fine) if i have a single record then there is no issue by using this apporch

declare @xml xml = '<UserXML>
    <Name>Shubham CASE-1</Name>
    <UserType>Premium</UserType>
    <DialCode>India</DialCode>
    <ContactNumber>9876543210</ContactNumber>
    <EmailAddress>Contact@Shubh.com</EmailAddress>
    <Country>India</Country>
    <Notes>Notes-Notes-Notes-Notes CASE-1</Notes>
</UserXML>'

Now i have to check the country name/User Type and match it with the country table to get the id

DECLARE @CountryId INT 
       ,@UserType INT
SELECT @CountryId = id FROM #Country WHERE Name LIKE ''+(select U.Items.value('./DialCode[1]','NVARCHAR(200)') as DialCode FROM @xml.nodes('/UserXML') U(Items))+'%'
SELECT @UserType = id FROM #UserType WHERE Name LIKE ''+(select U.Items.value('./UserType[1]','NVARCHAR(200)') as UserType FROM @xml.nodes('/UserXML') U(Items))+'%'


INSERT INTO #user 
                SELECT 
                U.Item.query('./Name').value('.','VARCHAR(100)') Name,
                @UserType,
                @CountryId,
                U.Item.query('./ContactNumber').value('.','VARCHAR(100)') ContactNumber,
                U.Item.query('./EmailAddress').value('.','VARCHAR(100)') EmailAddress,
                @CountryId,
                U.Item.query('./Notes').value('.','VARCHAR(100)') Notes
                FROM @Xml.nodes('/UserXML') AS U(Item)

CASE-2 (Well the Isssue is here) if i have multiple records then how can i check every node and then make a join or something like that to make my insert query work fine

declare @xml2 xml = '<UserXML>
    <Name>Shubham CASE-2</Name>
    <UserType>Premium</UserType>
    <DialCode>India</DialCode>
    <ContactNumber>9876543210</ContactNumber>
    <EmailAddress>Contact@Shubh.com</EmailAddress>
    <Country>India</Country>
    <Notes>Notes-Notes-Notes-Notes CASE-2</Notes>
</UserXML>
<UserXML>
    <Name>Shubham 2 CASE-2</Name>
    <UserType>Free Trial</UserType>
    <DialCode>Dubai</DialCode>
    <ContactNumber>123456789</ContactNumber>
    <EmailAddress>Contact2@Shubh.com</EmailAddress>
    <Country>Dubai</Country>
    <Notes>Notes2-Notes2-Notes2-Notes2 CASE-2</Notes>
</UserXML>'

DECLARE @CountryId2 INT 
       ,@UserType2 INT
SELECT @CountryId2 = id FROM #Country WHERE Name LIKE ''+(select U.Items.value('./DialCode[1]','NVARCHAR(200)') as DialCode FROM @xml2.nodes('/UserXML') U(Items))+'%'
SELECT @UserType2 = id FROM #UserType WHERE Name LIKE ''+(select U.Items.value('./UserType[1]','NVARCHAR(200)') as UserType FROM @xml2.nodes('/UserXML') U(Items))+'%'


INSERT INTO #user 
                SELECT 
                U.Item.query('./Name').value('.','VARCHAR(100)') Name,
                @UserType,
                @CountryId,
                U.Item.query('./ContactNumber').value('.','VARCHAR(100)') ContactNumber,
--              U.Item.query('./EmailAddress').value('.','VARCHAR(100)') EmailAddress,
                @CountryId,
                U.Item.query('./Notes').value('.','VARCHAR(100)') Notes
                FROM @xml2.nodes('/UserXML') AS U(Item)

Please If you have any suggestions Or any other better approach for doing this task then help me out i am new to this so i don't know about the best approach for doing this task

You can read JSON directly and perform the JOIN

SELECT entity.*
 FROM OPENROWSET (BULK N'd:\temp\file.json', SINGLE_CLOB) as j
 CROSS APPLY OPENJSON(BulkColumn)
 WITH(
    MyName nvarchar(100)
   ,UserType nvarchar(100)
   ,DialCode nvarchar(100)
   ,ContactNumber nvarchar(100)
   ,EmailAddress nvarchar(100)
   ,Country nvarchar(100)
   ,Notes nvarchar(500)
 ) AS entity

More infos about import JSON documents and the OPENJSON

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM