簡體   English   中英

導入將數據從CSV文件導出到SQL Server DB?

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

我正在使用Web應用程序,在其中必須執行導入導出功能。 我是新手,因此我想向您提出建議,並且在執行此功能時遇到一些問題,

首先,我有一個來自Frontend(AngularJs)的JSON數組

 [ { "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" } ] 

現在,我正在使用XMLbuilder將此數組轉換為NodeJs中的XML

<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>

現在,我在SQL Server中使用此XML將這2條記錄插入到我的用戶表中,現在的問題是我在另一個表中保存了國家/地區代碼和國家/地區名稱。我在我的用戶表中使用了外鍵引用,我做了一個示例代碼

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');

情況1(工作正常),如果我只有一條記錄,那么使用此處理程序就沒有問題

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>'

現在,我必須檢查國家/地區名稱/用戶類型,並將其與國家/地區表匹配以獲取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)

案例2(問題在這里)如果我有多個記錄,那么我如何檢查每個節點,然后進行聯接或類似的操作,以使我的插入查詢工作正常

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)

請如果您有任何建議或其他更好的方法來執行此任務,然后幫幫我,我是新來的,所以我不知道執行此任務的最佳方法

您可以直接讀取JSON並執行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

有關導入JSON文檔OPENJSON的更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM