我有一个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自己。)
答案 0 :(得分:0)
在[R] / package:odbc
层下,有一个ODBC
驱动程序,负责ODBC
API的实现。
重新回答您的问题:为什么一台机器上可能看到错误,而另一台机器上却没有,可能是在不同的机器上package:odbc
与不同的驱动程序配对(它们是自己提供的)特质)。例如,已知来自Microsoft的SQL Server驱动程序会引发您记录的错误,但是其他错误(我相信,包括开源FreeTDS驱动程序)不会。
odbc::odbcListDrivers()
可以使您了解正在使用的计算机上哪些驱动程序可用。