#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 должны экранировать апострофы, почему вы думаете, что это неэкранированный символ?