由python程序错误查询的SQL Server数据库,使用可以直接在SQL Server上正常运行的相同SQL代码

问题描述 投票:0回答:1

我对SQL Server数据库具有只读访问权限。我想使用与SQL Server数据库位于同一台计算机上的Python程序来使用SELECT查询它。下面的存储过程尝试也是SELECT语句。我正在Python中使用pyodbc模块。

我做了三遍尝试,从数据库中获取想要的数据。除以下指出的地方外,所有三种尝试几乎相同。

[第一次尝试,我创建了一个具有公共表表达式的SQL语句,以及四个SELECT语句,其中有几个INNER JOINLEFT OUTER JOINUNION ALL语句连接。该查询在SQL Server查询文本编辑器中返回正确的结果,但不是从我的Python程序中返回。在Python程序中,它省略了从“公用表表达式”部分获得的查询部分。从SQL Server查询文本编辑器中运行时,它的确会返回带有公共表表达式部分的结果。但是,尽管从Python程序运行查询时,Python和pyodbc不会从“公共表表达式”部分返回任何内容,但它没有错误运行。尝试1之后,我决定使用Common Table Expressions的替代方法,但没有尝试尝试2和3。

我的第二次尝试是直接在SQL Server数据库上的SQL Server中创建一个视图,该视图返回的信息与Common Table Expression之前所做的完全相同(现在,我可以将该视图替换为查询而不是Common Table。表达)。运行此尝试时,出现错误:

pyodbc.ProgrammingError :(“ 42S02”,“ [42S02] [Microsoft] [用于SQL Server的ODBC驱动程序17] [SQL Server]无效的对象名称“ dbo.VW_VIEW_NAME”。(208)(SQLExecDirectW)”)。

[当我尝试使用New Query在SQL Server数据库上运行此dbo.VW_VIEW_NAME时,它将返回我要查找的结果集,但在尝试使用Python和pyodbc时不会返回。在SQL Server上,我可以使用“对象资源管理器”浏览到视图,然后在“视图”文件夹中查找。我可以右键单击该视图,然后创建一个select语句并执行并执行结果。我只有一个数据库访问帐户,并且只有读取权限。在SQL Server的查询窗口中调用视图的SQL代码运行良好。全部使用与python程序相同的SQL Server登录凭据。

因此,SQL Server似乎不允许Python程序和pyodbc模块访问SQL Server数据库对象。

[我的第三次尝试是将整个SQL查询从Python程序移至SQL Server存储过程,然后仅在我的Python代码中执行存储过程(这样,SQL代码全部在数据库上执行,没有它可能来自数据库外部。)数据库管理员向我授予了对我的存储过程的EXECUTE权限。再一次,我收到与该错误类似的错误:

pyodbc.ProgrammingError :(“ 42000”,“ [42000] [Microsoft] [SQL Server的ODBC驱动程序17] [SQL Server]找不到存储过程'dbo.USP_MY_STORED_PROCEDURE'。(2812)(SQLExecDirectW)”)。

在SQL Server的查询窗口中调用存储过程的SQL代码运行得很好。全部使用与python程序相同的SQL Server登录凭据。

因此,pyodbc进入SQL Server并访问视图,还是进入SQL Server并访问存储过程,结果都是相同的:它并不表示它对这些对象一无所知。

似乎SQL Server可能在一次查询尝试中阻止了pyodbc和Python访问视图,而在另一次查询尝试中阻止了存储过程。我需要在SQL Server中进行更正,以允许外部程序访问视图和存储过程吗?

为了解决此问题,在单独的疑难解答步骤中,我执行了以下操作:将python版本升级到最新版本将Wing IDE升级到最新版本将pyodbc升级到最新阅读整个python DB 2.0 API阅读整个pyodbc文档阅读搜索引擎上的许多链接

这些尝试都没有给我答案。

问题是否是SQL Server阻止从外部访问来访问视图对象和存储过程对象的问题? SQL Server中是否有允许这些事情通过的设置需要进行相应的配置?

这里是通向cursor1.execute(“ ...”)语句的python代码

        conn1 = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server}'
                                       +';SERVER='+server1+'; UID='+username1+'; PWD='+password1+';DATABASE='+database1)
        cursor1 = conn1.cursor()
        print('Before cursor 1 execute sql code ' + str(datetime.datetime.now()))
        cursor1.execute(r"""

我使用的python版本是3.8.2

pyodbc使用的版本是4.0.30

SQL Server版本是SQL Server 2017

操作系统是Windows Server 2012

感谢您帮助我解决了这个问题。

我对SQL Server数据库具有只读访问权限。我想使用与SQL Server数据库位于同一台计算机上的Python程序来使用SELECT查询它。下面的存储过程尝试...

python sql-server stored-procedures view pyodbc
1个回答
0
投票

对于AlwaysLearning,我的回答集中在将SQL代码传递给数据库并尝试利用视图的数据库尝试。

© www.soinside.com 2019 - 2024. All rights reserved.