如何做一个;选择*from";使用odbc进行查询
我使用的是in R,我有一个SQL Server数据库,它的表有一个如何做一个;选择*from";使用odbc进行查询,r,sql-server,odbc,R,Sql Server,Odbc,我使用的是in R,我有一个SQL Server数据库,它的表有一个Name列,它是nvarchar(max),还有一个PublishStatus列,它是一个整数 此代码不起作用: library(odbc) library(DBI) library(tidyverse) con_string="Driver=ODBC Driver 11 for SQL Server;Server=myServer; Database=MyDatabase; trusted_connection=yes" co
Name
列,它是nvarchar(max)
,还有一个PublishStatus
列,它是一个整数
此代码不起作用:
library(odbc)
library(DBI)
library(tidyverse)
con_string="Driver=ODBC Driver 11 for SQL Server;Server=myServer; Database=MyDatabase; trusted_connection=yes"
con=dbConnect(odbc::odbc(), .connection_string =con_string)
query="select * from MyTable"
result=NULL
result=dbSendQuery(con,query) %>% dbFetch
head(result)
它只是生成错误消息
获取结果时出错(res@ptr,n,…):
nanodbc/nanodbc.cpp:2890:07009:[Microsoft][SQL Server的ODBC驱动程序11]描述符索引无效
如果我再次尝试查询,则会收到不同的错误消息,并且尽我所能,如果不关闭R并重新打开,则无法恢复:
错误:“选择PublishStatus,MyTable中的名称”
nanodbc/nanodbc.cpp:1587:HY000:[Microsoft][ODBC驱动程序11 for SQL Server]连接正忙于处理另一个命令的结果
因为R和R的odbc都有非常糟糕的名称,所以很难搜索这个包中的错误。在中,列的顺序似乎很重要,它要求在查询中首先指定整数列
所以这是有效的
query="select PublishStatus,Name from MyTable"
result=NULL
result=dbSendQuery(con,query) %>% dbFetch
head(result)
但这并不是:
query="select Name,PublishStatus from MyTable"
result=NULL
result=dbSendQuery(con,query) %>% dbFetch
head(result)
而select*
查询不起作用
因此,我的问题是:
select*
查询李>
无效描述符索引
错误时,有没有办法在不重新启动R的情况下恢复select*from
查询,不考虑列的顺序
library(RODBC)
con=odbcDriverConnect(ConnectionString_Hemonc)
result=sqlQuery(con,query,stringsAsFactors=FALSE)
close(con)
head(result)
我以前放弃RODBC是因为
看起来,他们构建了odbc
以更快地读取数据,其副作用是现在对读取数据的顺序非常挑剔。不幸的是,这破坏了我的用例——我不能要求只懂基本SQL的人使用将完全有效的SQL视为无效的工具
我猜读取数据的是RODBC
,写入数据的是odbc
。哎呀
编辑2:我在连接字符串中尝试了用于SQL Server的
ODBC驱动程序13
,而不是ODBC驱动程序11
,它没有解决问题,但至少速度快得多。我希望下面的代码和文章能对您有所帮助
想法:如果将列名包装在[]中会发生什么?我尝试在每个列名周围添加[],但没有效果我似乎记得odbc驱动程序(在尝试时)有一个错误,这意味着所有nvarchar(max)字段都需要成为表中的最终字段。因此,尝试将字段的顺序更改为
PublishStatus
,然后更改为Name
,然后看看会发生什么。祝你好运
set-psdebug -strict
$ErrorActionPreference = "stop"
$ExcelFilePath='MyPath\pubs.xlsx' #the full path of the excel workbook
if (!(Test-Path $ExcelFilePath))
{
Write-Error "Can't find '$($ExcelFilePath)'. Sorry, can't proceed because of this"
exit
}
try {
$Connection = New-Object system.data.odbc.odbcconnection
$Connection.ConnectionString = 'Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ='+$ExcelFilePath+'; Extended Properties="Mode=ReadWrite;ReadOnly=false; HDR=YES"'
$Connection.Open()
}
catch
{
$ex = $_.Exception
Write-Error "whilst opening connection to $ExcelFilePath : Sorry, can't proceed because of this"
exit
}
try {
$Query = New-Object system.data.odbc.odbccommand
$Query.Connection = $connection
$Query.CommandText = @'
SELECT title, SUM(qty) AS sales,
COUNT(*) AS orders
FROM [titles$] t
INNER JOIN [sales$] s ON t.title_id=s.title_id
WHERE title like '%?'
GROUP BY title
ORDER BY SUM(qty) DESC
'@
$Reader = $Query.ExecuteReader([System.Data.CommandBehavior]::SequentialAccess) #get the datareader and just get the result in one gulp
}
catch
{
$ex = $_.Exception
Write-Error "whilst executing the query '$($Query.CommandText)' $ex.Message Sorry, but we can't proceed because of this!"
$Reader.Close()
$Connection.Close()
Exit;
}
Try
{
$Counter = $Reader.FieldCount #get it just once
$result=@() #initialise the empty array of rows
while ($Reader.Read()) {
$Tuple = New-Object -TypeName 'System.Management.Automation.PSObject'
foreach ($i in (0..($Counter - 1))) {
Add-Member `
-InputObject $Tuple `
-MemberType NoteProperty `
-Name $Reader.GetName($i) `
-Value $Reader.GetValue($i).ToString()
}
$Result+=$Tuple
}
$result | Format-Table
}
catch
{
$ex = $_.Exceptio
Write-Error "whilst reading the data from the datatable. $ex.Message"
}
$Reader.Close()
$Connection.Close()