如何将MSSQL备份的.bak文件中的数据更改为插入数据格式?

-2 投票
1 回答
57 浏览
提问于 2025-04-14 18:01

我在ChatGPT的帮助下得到了下面的代码,现在在检查它,但我不知道为什么会出现错误。请帮帮我。

import pyodbc

conn_str = 'DRIVER={SQL Server};Server=myserver;Database=mydatabase;Trusted_Connection=True'
# create connection
conn = pyodbc.connect(conn_str)

# backup path
backup_file_path = 'D:\\Test.bak'

cursor = conn.cursor()
cursor.execute("CREATE TABLE #TempTable (D VARBINARY(MAX))")

with open(backup_file_path, 'rb') as f:
    backup_data = f.read()
cursor.execute("INSERT INTO #TempTable (D) VALUES (?)", backup_data)

select_query = "SELECT data FROM #TempTable"
for row in cursor.execute(select_query):
    backup_data = row[0].decode('utf-8') 

    table_data = backup_data.split("INSERT INTO ")
    for table_insert in table_data[1:]:
        table_name = table_insert.split()[0]
        values_start_index = table_insert.find("VALUES") + len("VALUES")
        table_values = table_insert[values_start_index:].strip().strip(";")
        insert_script = f"INSERT INTO {table_name} {table_values};"
        print(insert_script)

cursor.execute("DROP TABLE #TempTable")

cursor.close()
conn.close()

文件 "D:\Git\temp\convertBakUp2SQL.py",第18行,出错位置: cursor.execute("INSERT INTO TempTable (D) VALUES (?)", backup_data) pyodbc.Error: ('HY000', '[HY000] [Microsoft][ODBC SQL Server Driver]警告:部分插入/更新。文本或图像列的插入/更新未成功。 (0) (SQLPutData); [HY000] [Microsoft][ODBC SQL Server Driver][SQL Server]文本、ntext或图像指针值与指定的列名冲突。 (7125)')

错误信息提到,文本、ntext或图像指针值与指定的列名冲突。我听说这个错误可能是由于文件大小造成的,所以我用一个小文件进行了测试,但完全没有进展。

在这个过程中,2018版本的SQL Server备份的.bak文件无法在2017版本中恢复,所以我想通过更改插入语句来恢复所有数据。如果有什么需要修正的地方,请帮忙。

1 个回答

0

你到底想做什么呢?每个备份文件(*.bak)都是由以下几个部分组成的:

  • 一个主数据文件(*.mdf);
  • 一个事务日志文件(*.ldf);
  • 一个或多个辅助数据文件(*.ndf)。

你可以通过以下方法来检查这些文件的完整性和结构:

RESTORE FILELISTONLY FROM DISK = 'D:\\Test.bak' 

这样可以告诉你你的备份文件(*.bak)里包含了多少个上述的文件。

看起来你想用一个Python脚本来执行你的SELECT代码(还有其他操作),但我不太明白你的代码。你为什么要把整个备份文件(*.bak)插入到一个临时表里呢?你应该把另一个表里的数据插入到临时表中。

所以你需要实际执行INSERT INTO命令,举个例子:

    `-- Create a temporary table
    CREATE TABLE #TempTable (
        ID INT,
        Name NVARCHAR(50)
    );

-- Insert data into the temporary table
INSERT INTO #TempTable (ID, Name)
VALUES (1, 'John'),
       (2, 'Alice'),
       (3, 'Bob');`

希望这能帮助你理解该如何修改,以便解决你的问题。

撰写回答