2015-10-28 34 views
4

我使用的,我一個Microsoft SQL Server 2012的RODBC命令「的SQLQuery」在T-SQL

現在我發現,我感到困惑的現象在應用RODBC包表變量的問題。

如果我使用RODBC命令sqlQuery運行以下查詢,那麼在R中,我將返回列Country,CID,PriceID和WindID的空數據框。

DECLARE @tbl_IDs TABLE 
(
    Country nvarchar(30), 
    CID nvarchar(5), 
    PriceID int, 
    WindID int 
) 

SELECT * FROM @tbl_Ids 

到目前爲止,一切都很好。

不過,如果我嘗試寫一個記錄表變量並執行

DECLARE @tbl_IDs TABLE 
(
    Country nvarchar(30), 
    CID nvarchar(5), 
    PriceID int, 
    WindID int 
) 

INSERT INTO @tbl_IDs 
VALUES 
    ('Germany', 'DE', 112000001, 256000002); 

SELECT * FROM @tbl_Ids 

然後,在R,其結果將是一個空字符,而不是與一個記錄一個數據幀。仍然相同的查詢完美地與SQL Server Management Studio配合使用。 另外,我們追蹤了R-Query執行時數據庫服務器的行爲,看起來服務器完美地處理了它。看來RODBC接口有問題將結果返回到R控制檯。

有沒有人有一個想法如何解決這個問題?

+0

嘗試改變表變量來臨時表。 CREATE TABLE #tbl_IDs ( 國家nvarchar(30), CID nvarchar(5), PriceID int, WindID int ); INSERT INTO #tbl_IDs VALUES ('Germany','DE',112000001,256000002); SELECT * FROM#tbl_Ids' – lad2025

+0

感謝您的回答,但這並未解決問題。我們之前已經測試過了。 – Andro

回答

7

嘗試如下切換NOCOUNT

old_qry <- " 
DECLARE @tbl_IDs TABLE 
(
    Country nvarchar(30), 
    CID nvarchar(5), 
    PriceID int, 
    WindID int 
) 

INSERT INTO @tbl_IDs 
VALUES 
    ('Germany', 'DE', 112000001, 256000002); 

SELECT * FROM @tbl_Ids 
" 
## 
new_qry <- " 
SET NOCOUNT ON; 
DECLARE @tbl_IDs TABLE 
(
    Country nvarchar(30), 
    CID nvarchar(5), 
    PriceID int, 
    WindID int 
); 

INSERT INTO @tbl_IDs 
VALUES 
    ('Germany', 'DE', 112000001, 256000002); 
SET NOCOUNT OFF; 
SELECT * FROM @tbl_Ids 
" 

R> sqlQuery(tcon, gsub("\\n", " ", old_qry)) 
#character(0) 
R> sqlQuery(tcon, gsub("\\n", " ", new_qry)) 
# Country CID PriceID WindID 
#1 Germany DE 112000001 256000002 

基本上你想SET NOCOUNT ON在你的代碼的開頭,並SET NOCOUNT OFF只是最終SELECT語句之前。

+1

非常感謝!這解決了這個問題。涼。 :-) – Andro

0

由於數據庫服務器正確處理查詢,因此將多行操作TSQL查詢保存爲SQL Server存儲過程,並讓R調用它檢索結果集。

請注意,您甚至可以在從R到MSSQL的EXEC sp行中傳遞參數。如前所述此外,包括SET NOCOUNT ON申報的查詢,以避免不想要的結果character(0)

library("RODBC"); 
conn <- odbcConnect("DSN Name",uid="***",pwd="***"); # WITH DSN 
#conn <-odbcDriverConnect('driver={SQL Server};server=servername;database=databasename; 
         #trusted_connection=yes;UID=username; PWD=password') # WITH DRIVER 

df<-sqlQuery(conn, "EXEC dbo.StoredProcName"); 
+0

感謝您的回答,但您的解決方案對於我的數據庫知識有點過分。我無法測試它。 – Andro