尝试将数据发送到接受表值参数的存储过程。收到以下错误:
[错误] ('HY004', '[HY004] [Microsoft][ODBC SQL Server Driver]无效的 SQL 数据类型 (0) (SQLBindParameter)')
我知道这是由于数据类型不匹配造成的——但是如何纠正呢?
当我使用 SQL Server 探查器时,我看到以下内容
exec sp_sproc_columns N'[MyTestTvp]',N'dbo',@ODBCVer=3
Python代码
import pandas as pd
import pyodbc
from pandas.plotting import scatter_matrix
import matplotlib.pyplot as plt
def main():
cnxn = pyodbc.connect("Driver={SQL Server};Server=dataserver;UID=UserName;PWD=Password@123;Database=MySQLServerDatabase;")
dfInput = pd.read_sql_query('exec dbo.usp_Temp_GetAllPatientBKs_ToEncrypt ?', cnxn, params=['None'] )
c01 = [1, 2, 3]
param_array = []
for i in range(3):
param_array.append([c01[i]])
try:
cursor = cnxn.cursor()
result_array = cursor.execute("EXEC dbo.[MyTestTvp] ?", [param_array]).fetchall()
cursor.commit() #very important to commit
except Exception as ex:
print("Failed to execute MyTestTvp")
print("Exception: [" + type(ex).__name__ + "]", ex.args)
if __name__== "__main__":
main()
SQL Server 中的 TVP
CREATE TYPE dbo.[MyList] AS TABLE
(
[Id] INT NOT NULL
);
-- create stored procedure
CREATE PROCEDURE dbo.[MyTestTvp]
(
@tvp dbo.[MyList] READONLY
)
AS
BEGIN
SET NOCOUNT ON;
SELECT * FROM @tvp
END
更新
非常感谢戈德汤普森。根据 Gord Thompson 发布的答案,我更改了连接
cnxn = pyodbc.connect("Driver={ODBC Driver 13 for SQL Server};Server=dataserver.sandbox.rcoanalytics.com;UID=SimpleTest;PWD=SimpleTest@123;Database=RCO_DW;")
然后我收到以下错误:
未找到数据源名称且未指定默认驱动程序
引用pyodbc + MySQL + Windows:未找到数据源名称且未指定默认驱动程序
然后在系统 DSN 选项卡中的 ODBC 数据源管理器中的服务器上安装 Driver={ODBC Driver 13 for SQL Server}
控制面板>系统和安全>管理工具。>ODBC数据源
参考