Здравствуйте. Помогите пожалуйста разобраться со следующей задачей:
В запросе sq, для определенной колонки грида, создала SQL Text Column и использую scalar-valued sql function, которая возвращает имена через запятую. Тип возвращаемого значения sql функции - returns nvarchar(max). В sql редакторе ответ нормальный, а в террасофт - ??????,??????,???
Тип поля в датасете - строковое поле, кодировка - DEFAULT_CHARSET
Спасибо.
Нравится
Может как-то можно преобразовать возвращаемое значение в теле sql функции, чтобы террасофт смог прочесть ?
Павел, явно указала 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'
функция точно существует. Рисунок вычесляемого поля прикреплен.
включила доступ:
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 и запрос заработал.
Но, к сожалению, изначальная проблема языка осталась, снова читает ?????? знаки.
Боюсь, что в таком случае Вам нужно будет либо всё-таки обновиться, либо изменить подход к решению задачи и отказаться от такой реализации.