sql - 从XML文件插入

标签 sql sql-server xml tsql xpath

我正在尝试使用XML文件更新客户表,但是它没有将XML中的值提取到变量中以传递到表中。我收到的错误消息是“无法将值NULL插入列'EmailAddress'”,即使EmailAddress显然有一个值也是如此。我觉得我缺少一些非常简单的东西,但是无法弄清楚。有什么想法吗?

USE MyGuitarShop

DECLARE @CustomerUpdate XML

SET @CustomerUpdate = 
    '<NewCustomers>
        <Customer EmailAddress="izzychan@yahoo.com" Password="" FirstName="Isabella" LastName="Chan" />
        <Customer EmailAddress="johnprine@gmail.com" Password="" FirstName="John" LastName="Prine" />
        <Customer EmailAddress="kathykitchen@sbcglobal.net" Password="" FirstName="Kathy" LastName="Kitchen" />
    </NewCustomers>';

INSERT Customers (EmailAddress, Password, FirstName, LastName)
    VALUES
    (
        @CustomerUpdate.value('(/NewCustomers/Customer/EmailAddress)[1]', 'varchar(255)'),
        @CustomerUpdate.value('(/NewCustomers/Customer/Password)[1]', 'varchar(60)'),
        @CustomerUpdate.value('(/NewCustomers/Customer/FirstName)[1]', 'varchar(60)'),
        @CustomerUpdate.value('(/NewCustomers/Customer/LastName)[1]', 'varchar(60)')        
    );

SELECT * FROM Customers

最佳答案

我觉得我缺少一些非常简单的东西...


是的,您是对的:-D,您缺少@来读取属性值:

DECLARE @CustomerUpdate XML

SET @CustomerUpdate = 
    '<NewCustomers>
        <Customer EmailAddress="izzychan@yahoo.com" Password="" FirstName="Isabella" LastName="Chan" />
        <Customer EmailAddress="johnprine@gmail.com" Password="" FirstName="John" LastName="Prine" />
        <Customer EmailAddress="kathykitchen@sbcglobal.net" Password="" FirstName="Kathy" LastName="Kitchen" />
    </NewCustomers>';

SELECT
        @CustomerUpdate.value('(/NewCustomers/Customer/@EmailAddress)[1]', 'varchar(255)'),
        @CustomerUpdate.value('(/NewCustomers/Customer/@Password)[1]', 'varchar(60)'),
        @CustomerUpdate.value('(/NewCustomers/Customer/@FirstName)[1]', 'varchar(60)'),
        @CustomerUpdate.value('(/NewCustomers/Customer/@LastName)[1]', 'varchar(60)')        


更新:一次性插入所有<Customer>

试试这个:

DECLARE @Customers TABLE(EMailAddress VARCHAR(100),[Password] VARCHAR(100),FirstName VARCHAR(100),LastName VARCHAR(100));

DECLARE @CustomerUpdate XML

SET @CustomerUpdate = 
    '<NewCustomers>
        <Customer EmailAddress="izzychan@yahoo.com" Password="" FirstName="Isabella" LastName="Chan" />
        <Customer EmailAddress="johnprine@gmail.com" Password="" FirstName="John" LastName="Prine" />
        <Customer EmailAddress="kathykitchen@sbcglobal.net" Password="" FirstName="Kathy" LastName="Kitchen" />
    </NewCustomers>';

INSERT INTO @Customers (EmailAddress, Password, FirstName, LastName)
SELECT c.value('@EmailAddress', 'varchar(255)')
      ,c.value('@Password', 'varchar(60)')
      ,c.value('@FirstName', 'varchar(60)')
      ,c.value('@LastName', 'varchar(60)')        
FROM @CustomerUpdate.nodes(N'/NewCustomers/Customer') AS A(c)

SELECT * FROM @Customers

关于sql - 从XML文件插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44340813/

相关文章:

c# - 插入数据库时​​出错

c# - EntityFramework 插入速度非常慢,数据量大

xml - 如何通过 XPath 选择命名空间值

sql - 在 where in 子句中返回所有结果 (Sql Server)

C# Winform - 如何通过向 ReportViewer 传递 3 个变量(即 Reportname(RDL 文件)、SQLstring 和 Connectionstring)来显示实时报告

sql-server - SSIS - 记录到 SYSSSISLOG 以外的表

java - Android Studio 启动需要很长时间

xml - XSD 元素替换组示例?

sql - 窗口函数/聚合函数/中断窗口

mysql - 如何获取用户最后插入的值?