我的 Python 代码在从 PyCharm 运行时运行良好。
但是当我使用 SQL Server 运行相同的代码时sp_execute_external_script
,我收到错误。知道这是怎么回事吗?
Python代码:
import pyodbc
from pandas import DataFrame, read_csv
import glob
def main():
fullFilePath = r"D:\raw files"
conn = pyodbc.connect(
"DRIVER={ODBC Driver 17 for SQL Server};"
"Server=DESKTOP-PCV7785;"
"Database=practice_db;"
"Trusted_Connection=yes;"
)
cursor = conn.cursor()
try:
cursor.execute("CREATE TABLE tbl_babyNames (babyName nvarchar(100), gender nvarchar(2), number int, fileName nvarchar(50))")
conn.commit()
except:
print("Table tbl_babyNames already exists")
files = 0
rows = 0
files_list = [f[len(fullFilePath)+1:] for f in glob.glob(fullFilePath + "\*.txt")]
for file in files_list:
data = read_csv(fullFilePath + "\\" + file, sep=",", header=None, index_col=None)
data.columns=["babyName", "gender", "number"]
df1 = DataFrame(data)
df1["fileName"] = file[:file.find(".txt")]
for row in df1.itertuples():
cursor.execute("""
INSERT INTO practice_db..tbl_babyNames(babyName, gender, number, fileName)
VALUES (?, ?, ?, ?)
""",
row.babyName,
row.gender,
row.number,
row.fileName)
rows += 1
conn.commit()
print("File : {} inserted".format(file))
files += 1
conn.close()
print("Insert is Done!, files: {0} , rows: {1}".format(files, rows))
main()
我在 SQL Server 中运行的内容:
EXECUTE sp_execute_external_script @language = N'Python'
, @script = N'
import pyodbc
from pandas import DataFrame, read_csv
import glob
def main():
fullFilePath = r"D:\raw files"
conn = pyodbc.connect(
"DRIVER={ODBC Driver 17 for SQL Server};"
"Server=DESKTOP-PCV7785;"
"Database=practice_db;"
"Trusted_Connection=yes;"
)
cursor = conn.cursor()
try:
cursor.execute("CREATE TABLE tbl_babyNames (babyName nvarchar(100), gender nvarchar(2), number int, fileName nvarchar(50))")
conn.commit()
except:
print("Table tbl_babyNames already exists")
files = 0
rows = 0
files_list = [f[len(fullFilePath)+1:] for f in glob.glob(fullFilePath + "\*.txt")]
for file in files_list:
data = read_csv(fullFilePath + "\\" + file, sep=",", header=None, index_col=None)
data.columns=["babyName", "gender", "number"]
df1 = DataFrame(data)
df1["fileName"] = file[:file.find(".txt")]
for row in df1.itertuples():
cursor.execute("""
INSERT INTO practice_db..tbl_babyNames(babyName, gender, number, fileName)
VALUES (?, ?, ?, ?)
""",
row.babyName,
row.gender,
row.number,
row.fileName)
rows += 1
conn.commit()
print("File : {} inserted".format(file))
files += 1
conn.close()
print("Insert is Done!, files: {0} , rows: {1}".format(files, rows))
main()
'
我得到的错误:
消息 39004,第 16 层,状态 20,第 10 行
执行“sp_execute_external_script”期间发生“Python”脚本错误,HRESULT 0x80004004。
消息 39019,16 级,状态 2,第 10 行
发生外部脚本错误:
执行时出错。检查输出以获取更多信息。
回溯(最近一次调用最后一次):
文件“”,第 5 行,位于
文件“C:\ProgramData\MSSQLSERVER\Temp-PY\Appcontainer1\BB9FCA34-F670-4555-8B58-B6A3C172718C\sqlindb_0.py”,第 115 行,处于转换中
main() 文件“C:\ProgramData\MSSQLSERVER\Temp-PY\Appcontainer1\BB9FCA34-F670-4555-8B58-B6A3C172718C\sqlindb_0.py”,第 45 行,在 main 中
“DRIVER={用于 SQL Server 的 ODBC 驱动程序 17};”
消息 39019,16 级,状态 2,第 10 行
发生外部脚本错误:
pyodbc.OperationalError: ('08001', '[08001]
[Microsoft][适用于 SQL Server 的 ODBC 驱动程序 17] 命名管道提供程序:无法打开与 SQL Server [5] 的连接。 (5) (SQLDriverConnect);
[08001] [Microsoft][ODBC Driver 17 for SQL Server] 登录超时已过期 (0);
[08001] [Microsoft][SQL Server 的 ODBC 驱动程序 17] 与 SQL Server 建立连接时发生网络相关或实例特定的错误。找不到服务器或无法访问服务器。检查实例名称是否正确以及 SQL Server 是否配置为允许远程连接。有关详细信息,请参阅 SQL Server 联机丛书。 (5)')
SqlSatelliteCall 错误:执行时出错。检查输出以获取更多信息。来自外部脚本的 STDOUT 消息:SqlSatelliteCall 函数失败。请参阅控制台输出以获取更多信息。
回溯(最近一次调用最后一次):
文件“C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\PYTHON_SERVICES\lib\site-packages\revoscalepy\computecontext\RxInSqlServer.py”,
rx_sql_satellite_call 中的第 605 行
rx_native_call("SqlSatelliteCall", 参数)
文件“C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\PYTHON_SERVICES\lib\site-packages\revoscalepy\RxSerializable.py”,第 375 行,在 rx_native_call 中
ret = px_call(functionname, params) RuntimeError: revoscalepy 函数失败。