我对SQL Server数据库具有只读访问权限。我想使用与SQL Server数据库位于同一台计算机上的Python程序来使用SELECT
查询它。下面的存储过程尝试也是SELECT
语句。我正在Python中使用pyodbc模块。
我做了三遍尝试,从数据库中获取想要的数据。除以下指出的地方外,所有三种尝试几乎相同。
[第一次尝试,我创建了一个具有公共表表达式的SQL语句,以及四个SELECT
语句,其中有几个INNER JOIN
和LEFT OUTER JOIN
由UNION 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查询它。下面的存储过程尝试...
对于AlwaysLearning,我的回答集中在将SQL代码传递给数据库并尝试利用视图的数据库尝试。