如何使用 python 在 SQL 服务器中将字符串数据类型的行转换为 XML 数据类型
How to convert rows of string data type type to XML data type in SQL Server using python
我在我的 SQL 服务器 table 中存储了 Web 源作为 varchar
。 table 有 1000 个这样的网络资源。手动打开每个 XML 源将其保存为 XML 数据并存储在 SQL 服务器 table 中作为 XML 数据类型是一个繁琐的过程。请帮助 SQL 或 Python 中的任何脚本,这些脚本可以遍历我的 table 中的列表并将每个 link 保存为 XML 数据类型 SQL 服务器 table。我正在准备这些文件以进行多次 XML 粉碎。感谢您的帮助。
select * from [dbo].[FormIndex]
我附上了我的 table 的片段。
最终目标是下面的 table。这是其中一个手动存储为 XML 时的样子。手动完成其中的数千个非常困难,所以我决定使用 python 代码打开存储在 SQL 服务器中的字符串,打开它,将 url 保存为 XML
数据类型并将其存储回 table.
请帮忙 - 谢谢
这是我用来将 table 作为 pandas 数据框提取并遍历每个 varchar
url 的代码,打开它并将其作为 XML
数据保存回 SQL 服务器 table。但是我不能运行它
第一个工作正常并返回了正确的结果,返回了 XML 链接的 table(我用来将 XML 字符串存储在 SQL 中的列名服务器):
##From SQL Server database to DataFrame Pandas
import pandas as pd
import pyodbc
cnxn = pyodbc.connect
cnxn = pyodbc.connect(
r'Trusted_Connection=yes;'
r'DRIVER={ODBC Driver 13 for SQL Server};'
r'SERVER=*****;'
r'DATABASE=IRS-900;'
r'UID=*****;'
r'PWD=*****;'
)
query = "SELECT XMLLink FROM [IRS-900].[dbo].[FormIndex]"
df = pd.read_sql(query, cnxn)
print(df.head(7))
但是当我构建 for 循环以遍历数据框时,它会抛出错误。这是代码
import os
import pyodbc
import datetime
import pyodbc
import urllib
import pandas as pd
##From SQL Server database to DataFrame Pandas
cnxn = pyodbc.connect
cnxn = pyodbc.connect(
r'Trusted_Connection=yes;'
r'DRIVER={ODBC Driver 13 for SQL Server};'
r'SERVER=*****;'
r'DATABASE=IRS-900;'
r'UID=*****;'
r'PWD=*****;'
)
query = "SELECT XMLLink FROM [IRS-900].[dbo].[FormIndex]"
df = pd.read_sql(query, cnxn)
##print(df.head(7))
for xmlpath in df:
xmlurl=urllib.request.urlopen(xmlpath)
xml_as_string = xmlurl.read()
cursor = cnxn.cursor()
cursor.execute("insert into Test_Table values ('Text', 1, '"+ xml_as_string +"')")
cnxn.commit()
dData = cursor.fetchall()
尝试在循环中打印出 xmlpath 变量。
直接遍历数据框只会产生列名,因此 xmlpath 变量唯一持有的值是 header-“XMLLink”列。
在 post 中不提及任何其他内容,循环遍历值的正确方法是:
for xmlpath in df["XMLLink"]:
print(xmlpath)
狩猎愉快!
您可以尝试以下T-SQL。它遍历 table 调用网络 URL,并最终将 XML 响应保存到数据库 table 以供将来使用。
SQL
SET TEXTSIZE -1;
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, url NVARCHAR(1000));
INSERT INTO @tbl (url) VALUES
('https://s3.amazonaws.com/irs-form-990/200931393493000150_public.xml'),
('https://s3.amazonaws.com/irs-form-990/201013693492007030_public.xml');
DECLARE @tblTarget TABLE (ID INT IDENTITY, xmldata XML, LoadedDateTime DATETIMEOFFSET(3) DEFAULT (SYSDATETIMEOFFSET()));
DECLARE @responseText TABLE (responseText VARCHAR(MAX));
-- DDL and sample data population, end
DECLARE @status INT
, @res AS INT
, @url AS NVARCHAR(1000);
DECLARE @RowCount INT = (SELECT COUNT(*) FROM @tbl);
WHILE @RowCount > 0 BEGIN
SELECT @url = url
FROM @tbl
ORDER BY ID DESC OFFSET @RowCount - 1 ROWS FETCH NEXT 1 ROWS ONLY;
-- do whatever needed, apply any logic, call stored procedures, etc.
EXEC sp_OACreate 'MSXML2.ServerXMLHTTP', @res OUT;
EXEC sp_OAMethod @res, 'open', NULL, 'GET',@url,'false';
EXEC sp_OAMethod @res, 'send';
EXEC sp_OAGetProperty @res, 'status', @status OUT;
INSERT INTO @ResponseText (ResponseText)
EXEC sp_OAGetProperty @res, 'responseText';
EXEC sp_OADestroy @res;
INSERT INTO @tblTarget (xmldata)
SELECT responseText FROM @responseText;
DELETE FROM @responseText;
SET @RowCount -= 1;
END
SELECT * FROM @tblTarget;
我在我的 SQL 服务器 table 中存储了 Web 源作为 varchar
。 table 有 1000 个这样的网络资源。手动打开每个 XML 源将其保存为 XML 数据并存储在 SQL 服务器 table 中作为 XML 数据类型是一个繁琐的过程。请帮助 SQL 或 Python 中的任何脚本,这些脚本可以遍历我的 table 中的列表并将每个 link 保存为 XML 数据类型 SQL 服务器 table。我正在准备这些文件以进行多次 XML 粉碎。感谢您的帮助。
select * from [dbo].[FormIndex]
我附上了我的 table 的片段。
最终目标是下面的 table。这是其中一个手动存储为 XML 时的样子。手动完成其中的数千个非常困难,所以我决定使用 python 代码打开存储在 SQL 服务器中的字符串,打开它,将 url 保存为 XML
数据类型并将其存储回 table.
请帮忙 - 谢谢
这是我用来将 table 作为 pandas 数据框提取并遍历每个 varchar
url 的代码,打开它并将其作为 XML
数据保存回 SQL 服务器 table。但是我不能运行它
第一个工作正常并返回了正确的结果,返回了 XML 链接的 table(我用来将 XML 字符串存储在 SQL 中的列名服务器):
##From SQL Server database to DataFrame Pandas
import pandas as pd
import pyodbc
cnxn = pyodbc.connect
cnxn = pyodbc.connect(
r'Trusted_Connection=yes;'
r'DRIVER={ODBC Driver 13 for SQL Server};'
r'SERVER=*****;'
r'DATABASE=IRS-900;'
r'UID=*****;'
r'PWD=*****;'
)
query = "SELECT XMLLink FROM [IRS-900].[dbo].[FormIndex]"
df = pd.read_sql(query, cnxn)
print(df.head(7))
但是当我构建 for 循环以遍历数据框时,它会抛出错误。这是代码
import os
import pyodbc
import datetime
import pyodbc
import urllib
import pandas as pd
##From SQL Server database to DataFrame Pandas
cnxn = pyodbc.connect
cnxn = pyodbc.connect(
r'Trusted_Connection=yes;'
r'DRIVER={ODBC Driver 13 for SQL Server};'
r'SERVER=*****;'
r'DATABASE=IRS-900;'
r'UID=*****;'
r'PWD=*****;'
)
query = "SELECT XMLLink FROM [IRS-900].[dbo].[FormIndex]"
df = pd.read_sql(query, cnxn)
##print(df.head(7))
for xmlpath in df:
xmlurl=urllib.request.urlopen(xmlpath)
xml_as_string = xmlurl.read()
cursor = cnxn.cursor()
cursor.execute("insert into Test_Table values ('Text', 1, '"+ xml_as_string +"')")
cnxn.commit()
dData = cursor.fetchall()
尝试在循环中打印出 xmlpath 变量。
直接遍历数据框只会产生列名,因此 xmlpath 变量唯一持有的值是 header-“XMLLink”列。
在 post 中不提及任何其他内容,循环遍历值的正确方法是:
for xmlpath in df["XMLLink"]:
print(xmlpath)
狩猎愉快!
您可以尝试以下T-SQL。它遍历 table 调用网络 URL,并最终将 XML 响应保存到数据库 table 以供将来使用。
SQL
SET TEXTSIZE -1;
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, url NVARCHAR(1000));
INSERT INTO @tbl (url) VALUES
('https://s3.amazonaws.com/irs-form-990/200931393493000150_public.xml'),
('https://s3.amazonaws.com/irs-form-990/201013693492007030_public.xml');
DECLARE @tblTarget TABLE (ID INT IDENTITY, xmldata XML, LoadedDateTime DATETIMEOFFSET(3) DEFAULT (SYSDATETIMEOFFSET()));
DECLARE @responseText TABLE (responseText VARCHAR(MAX));
-- DDL and sample data population, end
DECLARE @status INT
, @res AS INT
, @url AS NVARCHAR(1000);
DECLARE @RowCount INT = (SELECT COUNT(*) FROM @tbl);
WHILE @RowCount > 0 BEGIN
SELECT @url = url
FROM @tbl
ORDER BY ID DESC OFFSET @RowCount - 1 ROWS FETCH NEXT 1 ROWS ONLY;
-- do whatever needed, apply any logic, call stored procedures, etc.
EXEC sp_OACreate 'MSXML2.ServerXMLHTTP', @res OUT;
EXEC sp_OAMethod @res, 'open', NULL, 'GET',@url,'false';
EXEC sp_OAMethod @res, 'send';
EXEC sp_OAGetProperty @res, 'status', @status OUT;
INSERT INTO @ResponseText (ResponseText)
EXEC sp_OAGetProperty @res, 'responseText';
EXEC sp_OADestroy @res;
INSERT INTO @tblTarget (xmldata)
SELECT responseText FROM @responseText;
DELETE FROM @responseText;
SET @RowCount -= 1;
END
SELECT * FROM @tblTarget;