0

尝试将数据发送到接受表值参数的存储过程。收到以下错误:

[错误] ('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数据源

参考

  1. 第 3 步:使用 pyodbc 连接到 SQL 的概念证明
  2. 第一步:配置pyodbc Python开发的开发环境
  3. 第二步:为pyodbc Python开发创建SQL数据库
  4. Azure 上的 Python
4

1 回答 1

1

我能够重现您的问题。您正在使用为 SQL Server 2000 编写的非常古老的“SQL Server”ODBC 驱动程序。TVP 是在 SQL Server 2008 中引入的。

因此,您收到错误是因为您使用的驱动程序不理解 TVP,因为它们在创建驱动程序时不存在。您将需要使用更现代的驱动程序版本,例如“ODB​​C Driver 17 for SQL 服务器”。

于 2019-12-13T11:42:28.863 回答