【问题标题】:How to convert rows of string data type type to XML data type in SQL Server using python如何使用python在SQL Server中将字符串数据类型类型的行转换为XML数据类型
【发布时间】:2023-04-02 04:11:02
【问题描述】:

我在我的 SQL Server 表中存储了 Web 源代码 varchar。该表有 1000 个这些网络资源。手动打开每个 XML 源将其保存为 XML 数据并以 XML 数据类型存储在 SQL Server 表中是一个繁琐的过程。请帮助使用 SQL 或 Python 中的任何脚本,这些脚本可以遍历我的表中的列表并将每个链接保存为 SQL Server 表中的 XML 数据类型。我正在为多个 XML 粉碎准备这些文件。感谢您的帮助。

select * from [dbo].[FormIndex]

我已附上我的桌子的 sn-p。

最终目标是下表。以下是其中一个手动存储为 XML 时的样子。手动完成数千个非常困难,所以我决定使用 python 代码打开存储在 SQL Server 中的字符串,打开它,将 url 保存为 XML 数据类型并将其存储回表中。

请帮忙 - 谢谢

这是我用来将表作为 pandas 数据框拉取并遍历每个 varchar url 的 Python 代码,打开它并将其作为 XML 数据保存回 SQL Server 表。但我无法运行它

第一个工作正常并返回正确的结果,返回一个 XMLLink 表(我用来在 SQL Server 中存储 XML 字符串的列名):

 ##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()

【问题讨论】:

    标签: python sql-server xml pandas-datareader urlopen


    【解决方案1】:

    尝试在循环中打印出 xmlpath 变量。

    直接遍历数据框只会产生列名,因此 xmlpath 变量所拥有的唯一值是列标题 - “XMLLink”。

    在您的帖子中不提及任何其他内容,循环遍历值的正确方法是:

    for xmlpath in df["XMLLink"]:
        print(xmlpath)
    

    狩猎愉快!

    【讨论】:

      【解决方案2】:

      你可以试试下面的 T-SQL。它遍历调用 Web URL 的表,并最终将 XML 响应保存到 DB 表中以供将来使用。

      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;
      

      【讨论】:

      • Yitzhak Khabinsky !!非常感谢。您的解决方案帮助很大。我在代码中添加的所有内容是 --Advanced server security features --sp_configure 'show advanced options', 1 --GO --RECONFIGURE; --sp_configure 'Ole 自动化程序', 1 --GO --RECONFIGURE;删除错误并将插入语句更改为指向整个表,如:INSERT INTO @tbl (url) (select XMLLink from [dbo].[FormIndex]) 再次感谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-18
      • 1970-01-01
      相关资源
      最近更新 更多