通过 xml 在 sql 服务器中插入多行
inserting multiple rows via xml in sql server
我正在尝试将数据从 xml 文件插入临时 table,问题是我可以从这里一次输入一行数据:
DECLARE @tblCountry TABLE
(
CountryCode nvarchar(5),
CountryName nvarchar(50)
)
INSERT INTO @tblCountry(CountryCode, CountryName)
SELECT --DISTINCT
x.v.value('(/countries/country/@code)[1]','VARCHAR(5)'),
x.v.value('(/countries/country/text())[1]','VARCHAR(50)')
FROM @countryXML.nodes('/countries/country') x(v)
SELECT CountryCode, CountryName FROM @tblCountry
但是当我试图把它放在一个循环中时,我无法让它工作:
create proc spcountry
@count int
AS
BEGIN
DECLARE @countryXML XML
SET @countryXML = '<countries>
<country code="AF" iso="4">Afghanistan</country>
<country code="ZW" iso="716">Zimbabwe</country>
</countries>'
DECLARE @tblCountry TABLE
(
CountryCode nvarchar(5),
CountryName nvarchar(50)
)
SET @count = 1
WHILE (@count < 238)
BEGIN
INSERT INTO @tblCountry(CountryCode, CountryName)
SELECT --DISTINCT
x.v.value('(/countries/country/@code)[sql:variable("@count")]','VARCHAR(5)'),
x.v.value('(/countries/country/text())[[sql:variable("@count")]]','VARCHAR(50)')
FROM @countryXML.nodes('/countries/country') x(v)
set @count = @count + 1
END
END
SELECT CountryCode, CountryName FROM @tblCountry
我一直在关注这个 link 的解决方案:
XML data type method “value” must be a string literal
create proc spcountry @count int
AS
declare @countryXML XML;
declare @tblCountry TABLE
(
CountryCode nvarchar(5),
CountryName nvarchar(50)
);
begin
SET @countryXML = '<countries>
<country code="AF" iso="4">Afghanistan</country>
<country code="ZW" iso="716">Zimbabwe</country>
</countries>';
INSERT INTO @tblCountry(CountryCode, CountryName)
SELECT TOP(@count)
x.v.value('@code','VARCHAR(50)'),
x.v.value('.','VARCHAR(50)')
FROM @countryXML.nodes('/countries/country') x(v)
SELECT CountryCode, CountryName
FROM @tblCountry;
end
go
-- sample call
-- exec spcountry 2
我正在尝试将数据从 xml 文件插入临时 table,问题是我可以从这里一次输入一行数据:
DECLARE @tblCountry TABLE
(
CountryCode nvarchar(5),
CountryName nvarchar(50)
)
INSERT INTO @tblCountry(CountryCode, CountryName)
SELECT --DISTINCT
x.v.value('(/countries/country/@code)[1]','VARCHAR(5)'),
x.v.value('(/countries/country/text())[1]','VARCHAR(50)')
FROM @countryXML.nodes('/countries/country') x(v)
SELECT CountryCode, CountryName FROM @tblCountry
但是当我试图把它放在一个循环中时,我无法让它工作:
create proc spcountry
@count int
AS
BEGIN
DECLARE @countryXML XML
SET @countryXML = '<countries>
<country code="AF" iso="4">Afghanistan</country>
<country code="ZW" iso="716">Zimbabwe</country>
</countries>'
DECLARE @tblCountry TABLE
(
CountryCode nvarchar(5),
CountryName nvarchar(50)
)
SET @count = 1
WHILE (@count < 238)
BEGIN
INSERT INTO @tblCountry(CountryCode, CountryName)
SELECT --DISTINCT
x.v.value('(/countries/country/@code)[sql:variable("@count")]','VARCHAR(5)'),
x.v.value('(/countries/country/text())[[sql:variable("@count")]]','VARCHAR(50)')
FROM @countryXML.nodes('/countries/country') x(v)
set @count = @count + 1
END
END
SELECT CountryCode, CountryName FROM @tblCountry
我一直在关注这个 link 的解决方案: XML data type method “value” must be a string literal
create proc spcountry @count int
AS
declare @countryXML XML;
declare @tblCountry TABLE
(
CountryCode nvarchar(5),
CountryName nvarchar(50)
);
begin
SET @countryXML = '<countries>
<country code="AF" iso="4">Afghanistan</country>
<country code="ZW" iso="716">Zimbabwe</country>
</countries>';
INSERT INTO @tblCountry(CountryCode, CountryName)
SELECT TOP(@count)
x.v.value('@code','VARCHAR(50)'),
x.v.value('.','VARCHAR(50)')
FROM @countryXML.nodes('/countries/country') x(v)
SELECT CountryCode, CountryName
FROM @tblCountry;
end
go
-- sample call
-- exec spcountry 2