Ошибка хранимой процедуры SQL Server вставка длинных строк: незакрытая кавычка после символьной строки

#stored-procedures #coldfusion #sqldatatypes

#хранимые процедуры #coldfusion #sqldatatypes

Вопрос:

Я пытаюсь вставить длинную строку в формате JSON, т.Е. #jsonLayoutProperties# В таблицу MS SQL Server, используя хранимую процедуру. Строка может быть длинной, например, 10 000 символов . Что cfsqltype я должен использовать в своей хранимой процедуре? cf_sql_longvarchar кажется, это единственный вариант, похоже, что нет a cfsqltype , который сопоставляется nvarchar(max) .

Ошибка, которую я получаю, приведена ниже. Похоже, что строка усекается. Любая помощь будет очень приветствоваться.

Ошибка:

Ошибка при выполнении запроса к базе данных.

[Macromedia] [Драйвер JDBC SQLServer] [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>
  

Комментарии:

1. (Редактировать) Если вы запустите выполнить процедуру (с теми же значениями) в SSMS, выполняется ли она успешно? RE: похоже, что не существует cfsqltype, который сопоставляется с nvarchar(max) Существует, и это почти то, о чем вы догадались: cf_sql_longnvarchar (обратите внимание на средний «n» для n varchar)

Ответ №1:

Возможно, это не проблема типа.

 Unclosed quotation mark after the character string.
  

Для меня это означает, что в вашей строке могут быть неэкранированные кавычки. Вы можете это проверить?

Комментарии:

1. Допустимая переменная json (isJSON = YES), поэтому я думаю, что сама строка в порядке. Ошибка вызвана (я думаю) тем, что cf_sql_longvarchar передает в базу данных только первые n символов.

2. @Paul вы пробовали использовать CF_SQL_NVARCHAR вместо этого? После перечитывания я увидел, что вы использовали nvarchar, а не varchar

3. Я пробовал cf_sql_nvarchar, cf_sql_longvarchar, cf_sql_text и фактически «cf_sql_max», просто чтобы посмотреть, что произошло, все с тем же исходным результатом.

4. Удалось ли вам с более короткими строками? Я бы попробовал короткие и поработал с типом данных, который работает, и попытался определить, на какой длине он прерывается

5. Учитывая, что procparams должны экранировать апострофы, почему вы думаете, что это неэкранированный символ?