SQL Server存储过程插入长字符串时出错:字符串后引号未闭合
Posted
技术标签:
【中文标题】SQL Server存储过程插入长字符串时出错:字符串后引号未闭合【英文标题】:SQL Server Stored procedure error inserting long strings: Unclosed quotation mark after the character string 【发布时间】:2017-02-27 22:15:16 【问题描述】:我正在尝试使用存储过程将 JSON 格式的长字符串(即#jsonLayoutProperties#
)插入到 MS SQL Server 表中。字符串可能很长,例如10,000 个字符+。我应该在存储过程中使用哪个cfsqltype
? cf_sql_longvarchar
似乎是唯一的选择,似乎没有映射到 nvarchar(max)
的 cfsqltype
。
我得到的错误如下。看来该字符串正在被截断。非常欢迎任何帮助。
错误:
执行数据库查询时出错。
[Macromedia][SQLServer JDBC 驱动程序][SQLServer]不闭引号 在字符串之后。
CFStoredproc:
<cfstoredproc datasource="docs" procedure="UpdateLayout">
<cfprocparam cfsqltype="cf_sql_varchar" type="in" value="#Session.Userdata['ID']#"> <!--- @AccountID --->
<cfprocparam cfsqltype="cf_sql_integer" type="in" value="#ObjectID#"> <!--- @ObjectID --->
<cfprocparam cfsqltype="cf_sql_longvarchar" type="in" value="#jsonLayoutProperties#"> <!--- @Properties --->
<cfprocparam cfsqltype="cf_sql_varchar" type="in" value="0"> <!--- @Revision --->
<cfprocparam cfsqltype="cf_sql_integer" type="in" value="#Session.Userdata['ID']#"> <!--- @UpdatedID --->
<cfprocparam cfsqltype="cf_sql_integer" type="inout" value="0" variable="LayoutID"> <!--- @ID --->
</cfstoredproc>
【问题讨论】:
(编辑)如果您在SSMS中运行执行过程(具有相同的值),它是否执行成功? RE:似乎没有映射到 nvarchar(max) 的 cfsqltype 有,而且几乎是你猜到的:cf_sql_longnvarchar
(注意中间的“n”代表 n varchar)
【参考方案1】:
这可能不是类型问题。
Unclosed quotation mark after the character string.
对我来说意味着你的字符串中可以有未转义的引号。你能检查一下吗?
【讨论】:
变量是有效的 json (isJSON = YES) 所以我认为字符串本身是好的。该错误是由于 cf_sql_longvarchar 仅将前 n 个字符传递给数据库而引起的(我认为)。 @Paul 你试过用 CF_SQL_NVARCHAR 代替吗?重读后发现你用的是nvarchar而不是varchar 我已经尝试过 cf_sql_nvarchar、cf_sql_longvarchar、cf_sql_text 和“cf_sql_max”,只是为了看看发生了什么,结果都是一样的。 你用更短的字符串成功了吗?我会尝试较短的数据类型,然后尝试使用有效的数据类型,并尝试确定它中断的长度 鉴于 procparams 应该转义撇号,为什么你会认为它是一个未转义的字符?以上是关于SQL Server存储过程插入长字符串时出错:字符串后引号未闭合的主要内容,如果未能解决你的问题,请参考以下文章
在 SQL Server 存储过程中将 varchar 转换为 int 时出错
从视图调用时未插入表的存储过程 - SQL Server 2014