如何使用 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;