Юникод текст

Здравствуйте. Помогите пожалуйста разобраться со следующей задачей:

В запросе sq, для определенной колонки грида, создала SQL Text Column и использую scalar-valued sql function, которая возвращает имена через запятую. Тип возвращаемого значения sql функции - returns nvarchar(max). В sql редакторе ответ нормальный, а в террасофт - ??????,??????,???

Тип поля в датасете - строковое поле, кодировка - DEFAULT_CHARSET

Спасибо.

Нравится

15 комментариев

Какая у Вас версия Terrasoft?

Может как-то можно преобразовать возвращаемое значение в теле sql функции, чтобы террасофт смог прочесть ?

Попробуйте явно указать Collation.

Павел, явно указала collation базы данных не помогло.
Нашла ссылку http://www.community.terrasoft.ru/forum/topic/14248,
здесь похожая проблема была, но и эта статья не помогла

Здравствуйте, Марина!

В статье, ссылку на которую Вы привели выше, рекомендуется обновление до версии не ниже 3.4.0.
Вы обновились до этой версии, а проблема всё также осталась?

В качестве решения проблемы попробуйте вместо колонки в Select Query добавить вычисляемую колонку в Dataset, на обработчик события OnDatasetCalcFields программного выполнять вызов вашей функции и устанавливать возвращаемое значение для вычисляемого поля.

К сожалению, невозможно обновить версию.

var CategoriesIDs = Dataset.Values('CategoryIDs');
var sSQL = " select dbo.fn_GetIncidentCategoriesNames('" + CategoriesIDs + "') ";
var array = GetSimpleSQLResult(sSQL);
Dataset.Values('CategoriesNames') = Trim(array[0]);

sSQL = " select dbo.fn_GetIncidentCategoriesNames('{AB95C3C8-707D-440C-BB95-66E43227815F},{2BB56227-FF73-4B51-A8F9-E3A94035ADD9},{DAD3CD74-9CBC-40A5-805D-12DBDA781217}') "

Выдает следующую ошибку:
[16/07/18 18/39/14.354] (W) Invalid object name 'FN_GETINCIDENTCATEGORIESNAMES'

функция точно существует. Рисунок вычесляемого поля прикреплен.

Если функция точно есть, но её не видно из кода, то дело может быть в правах на неё на уровне SQL-сервера. Посмотрите, какие выданы права на другие функции. См. тут, тут и тут.

включила доступ:
GRANT EXECUTE ON fn_GetIncidentCategoriesNames TO public

результат:
fn_GetIncidentCategoriesNames public

выдает ошибку:
[16/07/19 10/44/43.241] (W) Invalid object name 'FN_GETINCIDENTCATEGORIESNAMES'

Странно, что с коде написано
var sSQL = " select dbo.fn_GetIncidentCategoriesNames ('" + CategoriesIDs + "') ";
через dbo., а в ошибке нет dbo.

Марина,

Проверьте, какой запрос уходит в базу данных.

поймала через профайлер

declare @p3 varchar(8000)
set @p3=NULL
exec sp_executesql N' select top 1 @P1 = DBO.FN_GETINCIDENTCATEGORIESNAMES (''{AB95C3C8-707D-440C-BB95-66E43227815F}, {2BB56227-FF73-4B51-A8F9-E3A94035ADD9}, :P2 = {DAD3CD74-9CBC-40A5-805D-12DBDA781217}'') FROM FN_GETINCIDENTCATEGORIESNAMES (''{AB95C3C8-707D-440C-BB95-66E43227815F},{2BB56227-FF73-4B51-A8F9-E3A94035ADD9},{DAD3CD74-9CBC-40A5-805D-12DBDA781217}'')',N'@P1 varchar(8000) OUTPUT',@p3 output
select @p3
go

в SQL редакторе та же ошибка, что и в террасофт
Msg 208, Level 16, State 3, Line 1
Invalid object name 'FN_GETINCIDENTCATEGORIESNAMES'.

нашла ссылку: http://www.community.terrasoft.ru/blogs/2171
и реализовала эту часть:

CREATE FUNCTION tsf_TestScalar(@a int, @b int)
returns int
AS
begin
RETURN 5 + @a + @b
end

код в Террасофте:

var sSQL = " select dbo.tsf_TestScalar(1, 2) " ;
var array = GetSimpleSQLResult(sSQL);

GRANT EXECUTE ON tsf_TestScalar TO public

профайлер:
declare @p3 varchar(8000)
set @p3=NULL
exec sp_executesql N' select top 1 @P1 = DBO.TSF_TESTSCALAR(1, 2) FROM TSF_TESTSCALAR(1, 2)',N'@P1 varchar(8000) OUTPUT',@p3 output
select @p3

Msg 208, Level 16, State 3, Line 1
Invalid object name 'TSF_TESTSCALAR'.

(1 row(s) affected)

Разобралась, все дело было в том, что GetSimpleSQLResult не совсем корректно отрабатывала sql текст, я поменяля тело функции GetSimpleSQLResult на код, который был написан в http://www.community.terrasoft.ru/blogs/2171 и запрос заработал.
Но, к сожалению, изначальная проблема языка осталась, снова читает ?????? знаки.

Боюсь, что в таком случае Вам нужно будет либо всё-таки обновиться, либо изменить подход к решению задачи и отказаться от такой реализации.

Хорошо. Спасибо большое !

Показать все комментарии