Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 由于字段长度,在链接表(从MS Access到SQL Server)上插入失败_Sql Server_Vba_Ms Access - Fatal编程技术网

Sql server 由于字段长度,在链接表(从MS Access到SQL Server)上插入失败

Sql server 由于字段长度,在链接表(从MS Access到SQL Server)上插入失败,sql-server,vba,ms-access,Sql Server,Vba,Ms Access,我正在尝试将MS Access中的追加查询添加到SQL server中。SQL server列是varchar(max),我认为这意味着它可以接受超过4000个字符 在MS Access中从VBA运行此查询时,我遇到以下错误 运行时错误3155 ODBC-在链接表上插入 [Microsoft][SQL Server本机客户端10.0]{SQL Server]安装失败 参数“@P6”的大小(7596)超过了允许的最大值 (4000)。(2717) 添加我的查询 此查询基于链接的outlook文件夹

我正在尝试将MS Access中的追加查询添加到SQL server中。SQL server列是
varchar(max)
,我认为这意味着它可以接受超过4000个字符

在MS Access中从VBA运行此查询时,我遇到以下错误

运行时错误3155 ODBC-在链接表上插入 [Microsoft][SQL Server本机客户端10.0]{SQL Server]安装失败 参数“@P6”的大小(7596)超过了允许的最大值 (4000)。(2717)

添加我的查询

此查询基于链接的outlook文件夹“已删除邮件”

SELECT Trim(Mid([contents],InStr([contents],"Short Description: ")+19,(InStr([contents],"Requestor: ")-1)-(InStr([contents],"Short Description: ")+19)-3)) AS ShortDesc, Trim(Mid([contents],InStr([contents],"Requestor: ")+10,(InStr([contents],"Requestor EMail: ")-1)-(InStr([contents],"Requestor: ")+10)-3)) AS Requester, Trim(Mid(Mid([contents],InStr([contents],"Office Location: ")+3),InStr(Mid([contents],InStr([contents],"Office Location: ")),"Description:")+13,(InStr(Mid([contents],InStr([contents],"Office Location: ")),"Assigned Task: ")-1)-(InStr(Mid([contents],InStr([contents],"Office Location: ")),"Description:")+13)-3)) AS Description, Trim(Mid([contents],InStr([contents],"Request Item: ")+14,12)) AS TicketNoText, Val(Mid([contents],InStr([contents],"Request Item: ")+19,7)) AS TicketNo, Val(Mid([contents],InStr([contents],"Assigned Task: ")+19,7)) AS TaskNo, Mid([contents],InStr([contents],"Delivery Date: ")+15,10) AS DeliveryDate, Trim(Mid([contents],InStr([contents],"Requestor EMail: ")+17,(InStr([contents],"Office Location: ")-1)-(InStr([contents],"Requestor EMail: ")+17)-3)) AS RequesterEMail
FROM [Deleted Items]
WHERE ((([Deleted Items].From)="xxxxxxx@service-now.com") AND (([Deleted Items].Subject)="you just assigned a ticket to yourself"));
然后,追加查询基于此查询和其他几个查询

INSERT INTO PROJECTS ( TaskNo, RequesterID, Description, TicketNo, ProjectFolderLink, SNLink, OpenedOn, DateDue )
SELECT QSNNew.taskno, cmbRequesters.RequesterID, "SHORT DESCRIPTION: " & [shortdesc] & Chr(13) & Chr(10) & Chr(13) & Chr(10) & "DESCRIPTION: " & [Description] AS Expr4, QSNNew.TicketNo, "#\\link to a network folder" & lpad([ticketno],"0",7) & "\#" AS Expr1, "#https://xxxx.service-now.com/nav_to.do?uri=sc_task.do?sysparm_query=number=TASK" & lpad([taskno],"0",7) & "#" AS Expr2, Now() AS Expr3, Mid([DeliveryDate],6,2) & "/" & Right([DeliveryDate],2) & "/" & Left([DeliveryDate],4) AS Expr5
FROM (QSNNew LEFT JOIN PROJECTS ON QSNNew.TicketNo = PROJECTS.TicketNo) LEFT JOIN cmbRequesters ON QSNNew.[Requester] = cmbRequesters.RequesterName
WHERE (((PROJECTS.TicketNo) Is Null));
如果有人想知道我在做什么,我现在正在从Service Now将票证加载到Access数据库中,除了解析票证分配给我时从Service Now收到的通知电子邮件之外,别无其他方法。
因此,我正在解析这些电子邮件,并创建自己的版本,其中包含指向ServiceNow页面的链接、票证的网络文件夹等。

这是您问题的答案

在这个链接上,如果您不能减少应用程序中的字段大小,Microsoft建议使用ADODB而不是ODBC


ODBC协议通常用于大数据——sql server——它使用“消防水带”bandwith。Access使用(我的术语)garden Hope bandwith(充分尊重mini RDBMS),因为Access基本上是一个基于文件的mini RDBMS(关系数据库管理系统)。除非所有内容(前端/后端)设置完美,条件理想--您将遇到您遇到的问题。Microsoft提出了ADODB作为解决此问题的方法。当我必须在sql server和Access之间进行接口时,我使用ADODB。这已被证明在小型和大型RDBMS之间更加可靠和一致。下面是一些ADO示例用于从Access读取和写入Sql Server的DB代码

“--在工具/对Microsoft ActiveX数据对象2.x库的引用中添加引用”-(2.5或更高版本) …

Access“Long Text”列可以包含一个最大为千兆字节的文本字符串。消息说您正在尝试将7596个字符放入4000个字符的字段中

如果是这样,SQL server数据库应该公开ODBC LongVarChar列,而不是VarChar列


LongVarChar是一种ODBC类型。映射由ODBC驱动程序完成。如果使用映射VarChar(MAX)的ODBC驱动程序对于VarChar ODBC列,您可以使用不同的驱动程序,也可以使用SQL SERVER“TEXT”列。TEXT是旧的SQL SERVER列类型,从VarChar只能到4000。旧的ODBC驱动程序可以识别文本列映射到LongVarChar。

我认为错误消息非常有用。
您正在尝试匹配长度为7596的字符串,而最大varchar长度为4000。
我猜您要么将其截断,要么将其存储为blob。

这是驱动程序的问题(SQL本机客户端和ODBC驱动程序17限制为4000个字符)。如果使用SQL Server驱动程序(10.09.18362.01),则限制为64000个字符

正如yu2所建议的那样,ADODB查询可以避免这种情况(ODBC传递也应该这样做)


参数@P6由ODBC生成请参见

该列可能是varchar(max),但参数(@P6)用于插入数据显然不是。你有权访问执行插入的代码吗?如果有,请发布。另请参见此问题:@Dale Burrell这是一些查询,一个来自另一个,其基础是outlook收件箱)))总体混乱,但没有其他选项可以完成此操作。我将在明天发布其中两个的代码。谢谢你u!!@dale burrell我用查询更新了原始内容我在代码中的任何地方都看不到参数
@P6
,这就是错误所在。嗨@yu2,只有链接的答案不适用于SO,将被删除。答案可能会引用链接,但需要独立,以防将来链接断开。请更正此错误。它不太近varchar(max)列和ODBC链接表都很简单。我认为varchar(max)可以处理4000多个。我会发布我的查询,一旦我发布了,似乎有人会给出答案