Параметризованные запросы, не работающие с SQL Server 2017

Описание проблемы и ожидаемый результат

Я пробую параметризованные запросы на моем SQL Server, следуя документации, представленной здесь: https://cran.r-project.org/web/packages/DBI/DBI.pdf. Однако у меня это не работает.

В частности, когда я пишу запрос на вставку некоторых строк с использованием параметров, возвращаемое значение равно 0, что означает, что никакие строки не были затронуты. В примере, который я показываю ниже, значение должно быть 2, потому что это повлияет на 2 строки.

Кроме того, когда я запрашиваю всю таблицу, строки, которые я должен был вставить с помощью параметров, не отображаются.

Просматривая документацию, о которой я упоминал выше в разделе о параметризации запросов, я заметил, что SQL Server не упоминается. Доступны ли параметризованные запросы для SQL Server?

База данных: SQL Server 2017

РЕДАКТИРОВАТЬ

У меня это немного работает, но все еще есть основные проблемы. dbExecute () и dbGetQuery () не работают. Нужно использовать dbSendStatement () или dbSendQuery, затем dbBind (), dbFetch (), dbClearStatement (). Пример приведен ниже.

В частности, dbExecute () возвращает 0 строк как затронутых, и при запросе таблицы строки, которые должны были быть вставлены, не были вставлены.

dbGetQuery () возвращает Error in result_fetch(res@ptr, n, ...) : unused argument (param = list("Joe"))

НОВЫЙ воспроизводимый пример

library(DBI)
library(odbc)
library(dplyr)
library(dbplyr)

con <- dbConnect(odbc(),
                 Driver = "SQL SERVER",
                 Server = SERVER_NAME,
                 Database = DB_NAME,
                 UID = USERNAME,
                 PWD = PASSWORD)


# Create a table and insert some entries
createTable <- dbExecute(con, "CREATE TABLE People (id int NOT NULL, name char(10) NOT NULL)")
insertRows <- dbExecute(con, "INSERT INTO People (id, name) VALUES (1, 'Joe'), (2, 'Mark'), (3, 'Laura')")

# Query the table we just created
query <- dbGetQuery(con, "SELECT * FROM People")

# Parameterized queries do not work using dbExecute and dbSendQuery
# insertRowsParams <- dbExecute(con, "INSERT INTO People (id, name) VALUES (?, ?)", param = list(c(4, 5), c("Mike", "Hannah"))
# query <- dbGetQuery(con, "SELECT * FROM People WHERE name = ?", param = list("Joe"))

# Parameterized queries do work using more primitive, labor-intensive functions
insertRowsParams <- dbSendStatement(con, "INSERT INTO People (id, name) VALUES (?, ?)")
dbBind(insertRowsParams, list(c(4, 5), c("Mike", "Hannah")))
resultStatement <- dbFetch(insertRowsParams)
dbClearResult(insertRowsParams)
query <- dbGetQuery(con, "SELECT * FROM People")

selectRowsParams <- dbSendQuery(con, "SELECT * FROM People WHERE name = ?")
dbBind(selectRowsParams, list("Joe"))
resultQuery <- dbFetch(selectRowsParams)
dbClearResult(selectRowsParams)

СТАРЫЙ Воспроизводимый пример

library(DBI)
library(odbc)
library(dplyr)
library(dbplyr)

con <- dbConnect(odbc(),
                 Driver = "SQL SERVER",
                 Server = SERVER_NAME,
                 Database = DB_NAME,
                 UID = USERNAME,
                 PWD = PASSWORD)

# Create a table and insert some entries
createTable <- dbExecute(con, "CREATE TABLE People (id int NOT NULL, name char(10) NOT NULL)")
insertRows <- dbExecute(con, "INSERT INTO People (id, name) VALUES (1, 'Joe'), (2, 'Mark'), (3, 'Laura')")

# The value for insertRowsParams is 0 indicating 0 rows were affected
insertRowsParams <- dbExecute(con, "INSERT INTO People (id, name) VALUES (?, ?)", param = list(c(4, 5), c("Mike", "Hannah")))

# Query the table we just created, and there are only 3 rows
query <- dbGetQuery(con, "SELECT * FROM People")

Информация о сеансе

- Session info --------------------------------------------------------------------------------------------------------------------------------
 setting  value                       
 version  R version 3.5.2 (2018-12-20)
 os       Windows Server >= 2012 x64  
 system   x86_64, mingw32             
 ui       RStudio                     
 language (EN)                        
 collate  English_United States.1252  
 ctype    English_United States.1252  
 tz       America/New_York            
 date     2019-03-11                  

- Packages ------------------------------------------------------------------------------------------------------------------------------------
 package     * version date       lib source        
 assertthat    0.2.0   2017-04-11 [1] CRAN (R 3.5.2)
 backports     1.1.3   2018-12-14 [1] CRAN (R 3.5.2)
 base64enc     0.1-3   2015-07-28 [1] CRAN (R 3.5.2)
 bit           1.1-14  2018-05-29 [1] CRAN (R 3.5.2)
 bit64         0.9-7   2017-05-08 [1] CRAN (R 3.5.2)
 blob          1.1.1   2018-03-25 [1] CRAN (R 3.5.2)
 callr         3.1.1   2018-12-21 [1] CRAN (R 3.5.2)
 cli           1.0.1   2018-09-25 [1] CRAN (R 3.5.2)
 crayon        1.3.4   2017-09-16 [1] CRAN (R 3.5.2)
 DBI         * 1.0.0   2018-05-02 [1] CRAN (R 3.5.2)
 dbplyr      * 1.3.0   2019-01-09 [1] CRAN (R 3.5.2)
 desc          1.2.0   2018-05-01 [1] CRAN (R 3.5.2)
 devtools      2.0.1   2018-10-26 [1] CRAN (R 3.5.2)
 digest        0.6.18  2018-10-10 [1] CRAN (R 3.5.2)
 dplyr       * 0.8.0.1 2019-02-15 [1] CRAN (R 3.5.2)
 evaluate      0.13    2019-02-12 [1] CRAN (R 3.5.2)
 fansi         0.4.0   2018-10-05 [1] CRAN (R 3.5.2)
 fs            1.2.6   2018-08-23 [1] CRAN (R 3.5.2)
 glue          1.3.0   2018-07-17 [1] CRAN (R 3.5.2)
 hms           0.4.2   2018-03-10 [1] CRAN (R 3.5.2)
 htmltools     0.3.6   2017-04-28 [1] CRAN (R 3.5.2)
 httpuv        1.4.5.1 2018-12-18 [1] CRAN (R 3.5.2)
 jsonlite      1.6     2018-12-07 [1] CRAN (R 3.5.2)
 knitr         1.21    2018-12-10 [1] CRAN (R 3.5.2)
 later         0.8.0   2019-02-11 [1] CRAN (R 3.5.2)
 magrittr      1.5     2014-11-22 [1] CRAN (R 3.5.2)
 memoise       1.1.0   2017-04-21 [1] CRAN (R 3.5.2)
 mime          0.6     2018-10-05 [1] CRAN (R 3.5.2)
 odbc        * 1.1.6   2018-06-09 [1] CRAN (R 3.5.2)
 pillar        1.3.1   2018-12-15 [1] CRAN (R 3.5.2)
 pkgbuild      1.0.2   2018-10-16 [1] CRAN (R 3.5.2)
 pkgconfig     2.0.2   2018-08-16 [1] CRAN (R 3.5.2)
 pkgload       1.0.2   2018-10-29 [1] CRAN (R 3.5.2)
 prettyunits   1.0.2   2015-07-13 [1] CRAN (R 3.5.2)
 processx      3.2.1   2018-12-05 [1] CRAN (R 3.5.2)
 promises      1.0.1   2018-04-13 [1] CRAN (R 3.5.2)
 ps            1.3.0   2018-12-21 [1] CRAN (R 3.5.2)
 purrr       * 0.3.0   2019-01-27 [1] CRAN (R 3.5.2)
 R6            2.4.0   2019-02-14 [1] CRAN (R 3.5.2)
 Rcpp          1.0.0   2018-11-07 [1] CRAN (R 3.5.2)
 remotes       2.0.2   2018-10-30 [1] CRAN (R 3.5.2)
 rlang         0.3.1   2019-01-08 [1] CRAN (R 3.5.2)
 rmarkdown     1.11    2018-12-08 [1] CRAN (R 3.5.2)
 rprojroot     1.3-2   2018-01-03 [1] CRAN (R 3.5.2)
 rstudioapi    0.9.0   2019-01-09 [1] CRAN (R 3.5.2)
 sessioninfo   1.1.1   2018-11-05 [1] CRAN (R 3.5.2)
 shiny       * 1.2.0   2018-11-02 [1] CRAN (R 3.5.2)
 stringi       1.3.1   2019-02-13 [1] CRAN (R 3.5.2)
 stringr       1.4.0   2019-02-10 [1] CRAN (R 3.5.2)
 tibble        2.0.1   2019-01-12 [1] CRAN (R 3.5.2)
 tidyselect    0.2.5   2018-10-11 [1] CRAN (R 3.5.2)
 usethis       1.4.0   2018-08-14 [1] CRAN (R 3.5.2)
 utf8          1.1.4   2018-05-24 [1] CRAN (R 3.5.2)
 withr         2.1.2   2018-03-15 [1] CRAN (R 3.5.2)
 xfun          0.5     2019-02-20 [1] CRAN (R 3.5.2)
 xtable        1.8-3   2018-08-29 [1] CRAN (R 3.5.2)
 yaml          2.2.0   2018-07-25 [1] CRAN (R 3.5.2)

person drizzle123    schedule 11.03.2019    source источник
comment
Просматривая документ, я думаю, что парные значения, которые нужно вставить, должны выглядеть так ... list((1, "Mike"), c(2, "Hannah"). И не должны ли значения ID быть 4 & 5 соответственно для Mike и Hannah? Если вы создадите первичный ключ для ID, вы получите ошибку дублирования ключа.   -  person SS_DBA    schedule 11.03.2019
comment
Спасибо за ответ. Я добавляю правки в свой исходный пост, чтобы отразить то, что вы нашли. Чтобы ответить вам здесь: 1) Изменены значения ID. 2) Я правильно представил параметризованные запросы, и, надеюсь, это отражено в моем отредактированном исходном сообщении.   -  person drizzle123    schedule 12.03.2019
comment
Это все еще актуально 16.06.2020. dbExecute() не работает с SQL-сервером.   -  person vahvero    schedule 16.06.2020


Ответы (1)


Для dbGetQuery() и dbExecute() аргумент называется params. Это прискорбно и может быть изменено.

Проблема с GitHub: https://github.com/r-dbi/DBI/issues/235.

person krlmlr    schedule 12.03.2019
comment
К сожалению, в обоих случаях возникает одна и та же проблема. Для dbGetQuery я получаю ошибку Error in result_fetch(res@ptr, n, ...) : unused argument (param = list("Joe")), если использую параметр аргумента, или я получаю ошибку Error in result_fetch(res@ptr, n, ...) : unused argument (params = list("Joe")), если использую параметры аргумента. Для dbExecute (), независимо от того, использую ли я param или params, я все равно получаю 0, а затем последующие запросы к таблице показывают, что строки не были добавлены. - person drizzle123; 15.03.2019
comment
Да, кажется, что пакет odbc переопределяет dbGetQuery(). Не могли бы вы сейчас использовать dbBind() и сообщить о проблеме с репозиторием odbc GitHub по адресу github.com/r -dbi / odbc / issues? Пожалуйста, проверьте наличие дубликатов, прежде чем открывать новый выпуск. - person krlmlr; 16.03.2019
comment
Да, сейчас я буду использовать dbBind () и отправил проблему на github. github.com/r-dbi/odbc/issues/261 - person drizzle123; 19.03.2019
comment
@ drizzle123: Спасибо, очень признателен! - person krlmlr; 19.03.2019