通过odbc连接进行的相同dbGetQuery()调用在某些PC上显示“无效的描述符索引”错误,但在其他PC上脚本运行良好

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

我有一个R脚本,可以在我的PC上正常工作。我已将其发送给同事以用作Power BI的来源,但是它无法在他们的PC上运行(即使从不具有Power BI的基本R中运行)。

问题似乎与通过odbc连接的DBI :: GetQuery有关,并且脚本是这样的(我更改了知识产权名称,并缩短了很长的case_when语句):

Database_connection <- dbConnect(drv = odbc::odbc(),
                               Driver = "SQL Server",
                               server = "addressofserver.database.windows.net",
                               database = "database",
                               uid = "UserName",
                               pwd = "UserPassword")

events_typed<-  dbGetQuery(Database_connection, "


SELECT
--- FIELDS: ---
ThemeEvents.Id as EventId,
[ThemeEvents].[VisitedStoreCode] AS Store_Unique_Number,
CONCAT([dbo].Stores.PostCodeOuter, ' ', [dbo].Stores.PostCodeInner) as Postcode,
Themes.[Name] AS Theme_Name,
ProductCategories.Type As Type,
ProductCategories.ProductType AS ProductType,
CASE -- flag whether Store has been Visited in both Themes (will only work after Themes filter added)
WHEN ThemeEvents.VisitedStoreCode IN (SELECT VisitedStoreCode FROM dbo.ThemeEvents JOIN [dbo].Themes on [dbo].ThemeEvents.Theme_Id = [dbo].Themes.Id WHERE [Themes].[name] = 'Theme One')
AND ThemeEvents.VisitedStoreCode IN (SELECT VisitedStoreCode FROM dbo.ThemeEvents JOIN [dbo].Themes on [dbo].ThemeEvents.Theme_Id = [dbo].Themes.Id WHERE [Themes].[name] = 'Theme Two')
THEN 'TRUE'
ELSE 'FALSE'
End AS Visited_In_Both_Themes,
Sum(ThemeEventSalesLines.[Qty]) as PacksSold
Sum(ThemeEventSalesLines.[SalesSubTotal]) as SalesSubTotal -- 
FROM [dbo].ThemeEvents
-- JOINS: ----
LEFT JOIN [dbo].Themes on [dbo].ThemeEvents.Theme_Id = [dbo].Themes.Id
LEFT JOIN [dbo].Stores on [dbo].ThemeEvents.VisitedStoreCode = [dbo].Stores.StoreCode
LEFT JOIN  ThemeEventSales on ThemeEventSales.EventId = ThemeEvents.Id
LEFT JOIN  ThemeEventSalesLines on ThemeEventSalesLines.ThemeEventSale_Id = ThemeEventSales.Id
LEFT JOIN  ThemeProducts on ThemeProducts.Id = ThemeEventSalesLines.ProductId
LEFT JOIN  ( --put the code for the product categories output here:
SELECT [Id]
,[Name]
,[StandardSKUCode]
,[TypeVariantGroupCode]
,[IsActive]
,[PriceSectorCode]
,CASE 
WHEN [Name] like '%Apple%' THEN 'Fruit'
WHEN [Name] like '%Banana%' THEN 'Fruit'
WHEN [Name] like '%Carrot%' THEN 'Vegetable'
WHEN [Name] like '%Tablecloth%' THEN 'Accessory'
WHEN [Name] like '%Candlestick%' THEN 'Accessory'
WHEN [TypeVariantGroupCode] = 00071 THEN 'Fruit'
ELSE 'False Product/Not Mapped' END AS [Type],
CASE 
WHEN [Name] like '%Apple%' THEN 'Food'
WHEN [Name] like '%Banana%' THEN 'Food'
WHEN [Name] like '%Carrot%' THEN 'Food'
WHEN [Name] like '%Tablecloth%' THEN 'Non-Edible'
WHEN [Name] like '%Candlestick%' THEN 'Non-Edible'
WHEN [TypeVariantGroupCode] = 00071 THEN 'Food'
ELSE 'False Product/Not Mapped' END AS ProductType,
CASE
WHEN [Name] like '%Multipack%' THEN 'TRUE'
ELSE 'FALSE' END AS IsMultipack,
CASE
WHEN [Name] like '%Apple%' AND [Name] like '%British%' THEN 'British Fruit'
WHEN [Name] like '%Carrot%' AND [Name] like '%British%' THEN 'British Vegetable'
WHEN [Name] like '%Carrot%' THEN 'Irish Vegetable'
WHEN [Name] like '%Banana%' AND [Name] like '%Jamaican%' THEN 'Jamaican Fruit'
WHEN [TypeVariantGroupCode] = 00071 THEN 'Unidentified Fruit'
WHEN [Name] like '%Apple%' THEN 'Unidentified Fruit'
ELSE NULL END as TypeLocation
FROM [dbo].[Products]
) AS ProductCategories 
ON ProductCategories.Id = ThemeProducts.ProductId --- join to Theme products table not to products table here
--- CONDITIONS & GROUPING: ---
where VisitedStoreCode NOT LIKE '%p%'
and ([Themes].[name] = 'Theme One' -- I have checked and the names are correct
or [Themes].[name] = 'Theme Two')
group by ThemeEvents.Id, VisitedStoreCode, Themes.[Name], CONCAT([dbo].Stores.PostCodeOuter, ' ', [dbo].Stores.PostCodeInner), Type, ProductType, RebateGiven, ThemeEvents.PacksSold
order by EventId
")

哪个返回错误消息(在Power BI中:

Error in result_fetch(res@ptr, n) : 
  nanodbc/nanodbc.cpp:2966: 07009: [Microsoft][ODBC SQL Server Driver]Invalid Descriptor Index 
Calls: dbGetQuery ... dbGetQuery -> .local -> dbFetch -> dbFetch -> result_fetch
Execution halted
Warning message:
In dbClearResult(rs) : Result already cleared

并且在Base R中运行时:

Error in result_fetch(res@ptr, n) : 
  nanodbc/nanodbc.cpp:2966: 07009: [Microsoft][ODBC SQL Server Driver]Invalid Descriptor Index

当用于直接在Power BI中从数据库读取SQL脚本时,它本身运行良好(这无用,因为R脚本的其余部分在导入后对其进行了大量修改),但是它不在R脚本/ dbGetQuery调用中运行在他们的计算机上。但是如上所述,它在我自己的PC上运行良好。我们已经为脚本安装了所有必需的库,并检查它们是否已安装。

此外,还有更基本的查询,例如:

test<-  dbGetQuery(Database_connection, "SELECT TOP 10 * FROM dbo.ThemeEvents")

效果很好。

先前关于此错误消息的所有问题都暗示,这与查询或SQL数据库的结构或输出中列的顺序有关,但是我们俩都针对同一个数据库中的同一个数据库运行同一个查询R脚本,使用相同的凭据。有谁知道为什么它可能在一台计算机上而不是另一台计算机上产生错误?我无法解决该问题,因为它已经可以在我自己的PC上正常运行了,但是我希望它能够被其他同事运行,以便他们可以在Power BI报告中使用它(他们不能在R本身)。

r odbc dbi
1个回答
1
投票

在[R] / package:odbc层下面,有一个ODBC驱动程序,负责ODBC API的实现。

要回答您的问题,请问:为什么您可能在一台机器上看到错误,而在另一台机器上却没有,那么可能是在不同的机器上package:odbc与不同的驱动程序配对(它们具有各自的特性)。例如,已知来自Microsoft的SQL Server驱动程序会引发您记录的错误,但是其他错误(我相信,包括开源FreeTDS驱动程序)不会。

[odbc::odbcListDrivers()可以让您了解正在使用的计算机上哪些驱动程序可用。

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