2015-10-28 4 views
4

Я использую пакет RODBC который я подаю на Microsoft SQL Server 2012.RODBC команда «SQLQuery» имеет проблемы с таблицы переменных в T-SQL

Теперь я обнаружил явление, которое озадачивает меня.

Если я запустил следующий запрос с помощью команды sqlQuery RODBC, то в 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, то результат будет пустой символ вместо dataframe с одной записью. Все тот же запрос отлично работает с 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 ЦЕННОСТИ ('Германия', 'DE', 112000001, 256000002); SELECT * FROM # tbl_Ids' – lad2025

+0

Спасибо за ваш ответ, но это не решило проблему. Мы уже тестировали это раньше. – Andro

ответ

7

Try переключая 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 вызвать его.

Обратите внимание, что вы даже можете передавать параметры в линии EXEC sp от R до MSSQL. Кроме того, как упоминалось выше, включают 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