【发布时间】:2022-01-06 03:46:38
【问题描述】:
我有一个脚本,用于存储从各种网站请求的 XML(另存为 str's)。即使 SQL 列类型为NVARCHAR(MAX),其中一些请求也会被截断。我需要知道为什么。我不确定这是时间问题(响应在完成下载之前存储到 SQL)还是分页(?)问题。
问题出现在大约 62k 到 65k 字符及以上。低于此字符数的任何内容都会正确保存。
代码:
import urllib.error
import urllib.request
from bs4 import BeautifulSoup
def get_feed(url):
try:
header = {'User-Agent': 'Mozilla/5.0'}
request = urllib.request.Request(url=url, headers=header)
response = urllib.request.urlopen(request)
xml = BeautifulSoup(response, 'xml')
return xml
except urllib.error.HTTPError as response:
return None
def get_sql_connection():
try:
server = 'mydb.database.windows.net'
database = 'mydb'
driver= '{ODBC Driver 17 for SQL Server}'
conn_string = 'DRIVER=' + driver + ';SERVER=' + server + ';DATABASE=' + database
conn = pyodbc.connect(conn_string + ';Authentication=ActiveDirectoryMsi')
return conn
except Exception as e:
logging.error(e)
return None
def write_xml(conn, xml):
end_format = '%Y-%m-%dT%H:%M:%S%z'
cursor = conn.cursor()
data = {
"xml_doc": str(xml),
"created": datetime.now(timezone(timedelta(hours=-8))).strftime(end_format)}
cursor.execute("INSERT INTO dbo.XML (xml_doc, created) VALUES (?,?)", data['xml_doc'], data['created'])
conn.commit()
#-------------------------
conn = get_sql_connection()
url = 'https://example.com'
xml = get_feed(url)
write = write_feed_table(conn, xml)
再次...超过 ~62k-65k 的字符数,xml 将被截断。
【问题讨论】:
-
你如何确认它们被截断了?通过从 SSMS 中选择数据?它的输出限制为 65,535 个字符,因此请确保您没有被您的工具愚弄,并检查存储的列值的
DATALENGTH()。 (如果数据真的被截断 on write 那么它不会是因为它“在完成下载之前存储” - 但您的驱动程序可能代表您执行一些SET TEXTSIZE限制,也许尝试发出SET TEXTSIZE <2 billion>;在您的查询之前。) -
哇,你知道吗.. 我从 SSMS 中选择数据(选择列,然后是
Copy)。我打赌就是这样!疯狂的字符数指向它!我会验证的。谢谢! -
确认!这就是问题所在。
标签: python sql sql-server xml