Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 расширенная хранимая процедура  [new]
АлексейК
Member

Откуда: http://www.msdatabase.ru , Moscow
Сообщений: 7683
Предыстория:

пробую различные варианты сравнения строк по созвучности.
перепробовал море вариантов, в том числе рекомендованные здесь

на текущий момент самый быстрый вариант сортирующий таблицу из
1000 строк по степени созвучности и сходства со строкой в 40 символов
работает 3-5 сек.

набрел на ДЛЛ в которой делается созвучное сравнение
http://vlak.webzone.ru/rus/projects/fuzzycmp.html

алиасная,
написана на С++ , есть исходный код

проверил из клиентского приложения - работает и дает нужный результат
быстродействие - 1000 циклов сравнения двух строк длинной в 40 символов - полсекунды

все бы хорошо,
если ее подключить к серваку

Проблема:

sp_addextendedproc '_similarity@12', 'similar.dll'

ОК

EXEC sp_helpextendedproc _similarity@12

Выдает что все в порядке


делаю так:

declare @retval float

declare @p1 int
declare @p2 varchar(50)
declare @p3 varchar(50)

set @p1 = 5
set @p2 = 'фигзнаеткаковский'
set @p3 = 'фигзнаеткаковский'


EXECUTE @retval = _similarity@12 @p1, @p2 , @p3
select @retval

выдает ошибку

ODBC: Msg 0, Level 20, State 1
Stored function '_similarity@12' in the library 'similar.dll' generated an access violation. SQL Server is terminating process 51.

Connection Broken


но ведь из клиентского приложения запускал - работает без ошибок!!!
с теми же параметрами


права доступа к файлу все есть
SQL сервис рестартовал

сервак MSSQL 2000 OS win2003 server Enterprise
23 апр 04, 11:10    [645469]     Ответить | Цитировать Сообщить модератору
 Re: расширенная хранимая процедура  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
автор
EXEC sp_helpextendedproc _similarity@12

В собаке посерелине - глубокий смысл? такое ощущение, что она там сидит и роется.
23 апр 04, 11:11    [645479]     Ответить | Цитировать Сообщить модератору
 Re: расширенная хранимая процедура  [new]
АлексейК
Member

Откуда: http://www.msdatabase.ru , Moscow
Сообщений: 7683
в собаке смысла нет,

я над этим думал еслиб я писал для сервера - убрал бы.

но исправить это не могу
хоть и есть исходники - нет сишного компилятора ))

если есть у кого компилятор
может поможете ?
23 апр 04, 11:15    [645492]     Ответить | Цитировать Сообщить модератору
 Re: расширенная хранимая процедура  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Наверное дело не в собаке...

BOL: Creating Extended Stored Procedures
23 апр 04, 11:29    [645563]     Ответить | Цитировать Сообщить модератору
 Re: расширенная хранимая процедура  [new]
iSestrin
Member

Откуда: Новосибирск
Сообщений: 3811
http://msdn.microsoft.com/visualc/vctoolkit2003/
23 апр 04, 11:29    [645565]     Ответить | Цитировать Сообщить модератору
 Re: расширенная хранимая процедура  [new]
rst
Member

Откуда: Йобурк
Сообщений: 1005
Похоже данная функция не предназначена для работы как extendedproc.
Надо писать свою dll - и там уже ее вызывать..
23 апр 04, 11:43    [645623]     Ответить | Цитировать Сообщить модератору
 Re: расширенная хранимая процедура  [new]
АлексейК
Member

Откуда: http://www.msdatabase.ru , Moscow
Сообщений: 7683
товарисчи !
Спасибо за ответы.


если честно, я закоренелый Vb - шник и будет мне нелегко ))

из полученных ответов я понял что неполохо бы хотя бы просто перекомпилировать.

для чего качаю компилятор.

единственная рекомендация по содержимому библиоткеки для сервака - наличие функции о версии - и то без нее будут проблемы при трассировке

попробую разобраться в чуждых для моего понмания кракозябах ))
23 апр 04, 11:58    [645689]     Ответить | Цитировать Сообщить модератору
 Re: расширенная хранимая процедура  [new]
Green2
Member

Откуда: skype: green2x2
Сообщений: 13749
В BOL написано

__declspec(dllexport) ULONG __GetXpVersion()

{
return ODS_VERSION;
}


А у вас '_similarity@12' - это значит, что библиотека компилировалась с параметрами по умолчанию.
23 апр 04, 12:23    [645796]     Ответить | Цитировать Сообщить модератору
 Re: расширенная хранимая процедура  [new]
АлексейК
Member

Откуда: http://www.msdatabase.ru , Moscow
Сообщений: 7683
2 Green2

прошу не пинать ногами ну не сишник я что делать..

насколько понял нужно дописать эту функцию в конец ..
так?

/*

Project : Fuzzy string comparision. Нечёткое сравнение строк.
Date : 21.12.1996
Author : Kiva Vladimir <vlak@glasnet.ru>, http://www.glasnet.ru/~vlak
Phile name : similar.c
Description:
Notes : Comments are in Russian (CP1251).
Перед использованием кода ознакомьтесь, пожалуйста, с лицензионным соглашением,
licence.txt, находящемся в составе комплекта поставки.
Modified By Reason
04.07.1998 vlak Слегка подчистил исходный текст, привёл к возможной компиляции
для Unicode.
*/


// NB: Если компилируется UNICODE-версия модуля, то следующая строка не должна
// быть закомментирована; в случае, когда она закомментирована, используются
// однобайтовые строки.
//#define _UNICODE

#include "tchar.h" // TCHAR, _TEXT
#include <stddef.h> // NULL

/*
Структура CompResult используется для передачи результата подсчёта
общего числа подстрок и числа совпадений в функции processStrings.
*/

typedef struct
{
int iVariantsQty; // Общее число подстрок.
int iMatchesQty; // Число совпадений.
} CompResult;

/*
Функция processStrings подсчитывает общее число подстрок длины iSubLen+1 в
строках, на которые указывают pcA и pcB, а также число совпадающих подстрок
указанной длины из строки pcB в строке pcA.
Примечание: pcA и pcB должны указывать на начало сравниваемых строк,
iSubLen должно не меньше 0 и должно быть меньше длины любой из сравниваемых
строк.
*/

CompResult processStrings (TCHAR* pcA, TCHAR* pcB, int iSubLen)
{
CompResult result;
result.iVariantsQty = 0;
result.iMatchesQty = 0;

while (pcB[iSubLen])
{ // Для всех подстрок B длины iSubLen+1.
TCHAR* pcCurA = pcA;
while (pcCurA[iSubLen])
{ // Перемещаемся по строке A до тех пор, пока не дойдём до её конца
// или не найдём подстроку, совпадающую с текущей подстрокой B.
int i;
for (i = 0; i <= iSubLen; i++)
if (pcB[i] != pcCurA[i]) // Сравниваем подстроки посимвольно.
{ // Несовпадение хотя бы одного символа достаточно для того,
// чтобы считать две строки не совпадающими. Берём следующую
// подстроку A и снова сравниваем её с той же подстрокой B.
pcCurA++;
goto ContinueInnerWhileLoopLabel;
}
result.iMatchesQty++; // Сюда попадаем, когда подстроки совпадают.
break; // Выходим из цикла перебора подстрок A, поскольку для
// текущей подстроки B нашлась совпадающая подстрока в A.
ContinueInnerWhileLoopLabel:;
}
result.iVariantsQty++;
pcB++;
}
return result;
}

/*
Функция similarity возвращает коэффициент "похожести" двух строк.
Находится длина минимальной строки, а затем подсчитывается общее число
подстрок длины, не превосходящей найденную или iMaxLen, а также число
совпадающих подстрок. Отношение двух найденных величин есть искомая
"похожесть".
Объявление функции отличается для компиляторов. Я пользовался BC 4.5,
Watcom 11.0, MSVC 5.0. Если нужно компилировать этот код не для DLL,
но в составе EXE проекта, нужно в объявлении функции оставить только
double.
*/

#ifdef __BORLANDC__
double __stdcall __export similarity (int iMaxLen, TCHAR* pcA, TCHAR* pcB)
#else // for Watcom or Microsoft
__declspec (dllexport) double __stdcall similarity (int iMaxLen, TCHAR* pcA, TCHAR* pcB)
#endif // __BORLANDC__
{
CompResult total;
int iCurSubLen = 0; // Текущая длина подстроки.

if (iMaxLen <= 0 || pcA == NULL || pcB == NULL)
return 0; // Передан недопустимый аргумент.

total.iVariantsQty = total.iMatchesQty = 0;

while (iCurSubLen < iMaxLen && pcA[iCurSubLen] && pcB[iCurSubLen])
{
CompResult res;

// Сравниваем строку A со строкой B.
res = processStrings (pcA, pcB, iCurSubLen);
total.iVariantsQty += res.iVariantsQty;
total.iMatchesQty += res.iMatchesQty;
// Сравниваем строку B со строкой A.
res = processStrings (pcB, pcA, iCurSubLen);
total.iVariantsQty += res.iVariantsQty;
total.iMatchesQty += res.iMatchesQty;

iCurSubLen++;
}
if (total.iVariantsQty == 0)
return 0; // Вырожденный случай.

return (double)total.iMatchesQty / (double)total.iVariantsQty;
}

/*
Насколько я понял для SQL нужно это:

*/



__declspec(dllexport) ULONG __GetXpVersion()
{
return ODS_VERSION;
}



компилятор скачал. но что - то не могу разобраться как его подключить к студио NET

может можно как то скормить компилятору
эти 4 файла чтоб он сделал dll ?


SIMILAR.C
similar.rc
TCHAR.H
resource.h
23 апр 04, 12:52    [645933]     Ответить | Цитировать Сообщить модератору
 Re: расширенная хранимая процедура  [new]
rst
Member

Откуда: Йобурк
Сообщений: 1005
Обратите ваше внимание на следующую ссылку :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odssql/ods_6_con_01_1ptb.asp
А так же :
An extended stored procedure is a function with a prototype:

SRVRETCODE xp_extendedProcName (SRVPROC *);


_similarity@12 всего навсего означает, что экспортируется функция similarity с размером параметров в стэке 12 байт (3 параметра по 4 байта).

Насколько я понимаю - просто так ее подключить к серваку не удастся.
Необходимо писать dll с функцией с указаным выше прототипом и в ней уже вызывать эту самую similarity(из внешней dll - либо из подкомпиленых сырцов)
23 апр 04, 13:10    [646017]     Ответить | Цитировать Сообщить модератору
 Re: расширенная хранимая процедура  [new]
iSestrin
Member

Откуда: Новосибирск
Сообщений: 3811
>компилятор скачал. но что - то не могу разобраться как его подключить к студио NET <

хм, если была студия, то компилятор качать было не обязательно - он там есть, я ссылку давал, основываясь на вот этом факте: "хоть и есть исходники - нет сишного компилятора )) "
23 апр 04, 13:17    [646050]     Ответить | Цитировать Сообщить модератору
 Re: расширенная хранимая процедура  [new]
SeVa
Member [заблокирован]

Откуда: Москва
Сообщений: 4324
В VC++ есть специально обученный wizard для создания расширенных процедур, который автоматически генерит всю необходимую обвязку.
Остается только добавить свой код. Примеры можно посмотреть в
в директории 80\Tools\DevTools\Samples\ods
23 апр 04, 15:41    [646744]     Ответить | Цитировать Сообщить модератору
 Re: расширенная хранимая процедура  [new]
АлексейК
Member

Откуда: http://www.msdatabase.ru , Moscow
Сообщений: 7683
2 SeVa
спасибо за совет

ох и худо мне, никак не читается сишный код.

собрал длл , вставил туда

__GetXpVersion()

долго он ругался на недекларированное

ODS_VERSION

все было правильно, оказалось что важен порядок указания библиотек у компилятора - переместил наверх папку с заголовками сервака и после этого скомпилировалось

но по прежнему similarity дает ту же ошибку, собака как оказалось зарыта не в собаке))

а если вызвать __GetXpVersion() - то число возвращается.

в демопримере как - то станно передается параметр
не так как в классическую длл - видимо в этом все дело?
23 апр 04, 20:02    [647506]     Ответить | Цитировать Сообщить модератору
 Re: расширенная хранимая процедура  [new]
АлексейК
Member

Откуда: http://www.msdatabase.ru , Moscow
Сообщений: 7683
вроде немного разобрался с методикой работы с ддл для хранимых процедур.
но вот в чем заткнулся - третий день ничего сделать не могу:



1. есть процедура получения параметров из хранимой процедуры
насколько я понял она сохраняет параметры в массив указателей
PBYTE* ppbData; (взято из примера входные параметры)

КАК ПРЕОБРАЗОВАТЬ ТИПЫ ДАННЫХ?

2. есть функция которой нужно передать одно числовое и 2 строковых аргумента а на выходе она дает дабл - значение

double similarity (int iMaxLen, TCHAR* pcA, TCHAR* pcB)


нужно в выходной параметр установить результат функции

ppbData[3] = similarity (ppbData[0], ppbData[1], ppbData[2]);

подскажите пожалуста как это сделать?
неужели никто из присутствующих не пишет расширенные хранимые процедуры ?
3 дня в С++ висел топик с вопросом так никто и не ответил?
или у меня неправильный подход?
27 апр 04, 09:36    [651030]     Ответить | Цитировать Сообщить модератору
 Re: расширенная хранимая процедура  [new]
Toking
Member

Откуда: Ковров>>Королев
Сообщений: 234
Привет!

у нас эта функция реализована на клиенте (я просто переписал код с си на VB)

Что касается ХР, то есть функции для загрузки параметров
Очень полезно будет разобрать пример, который приведен в MSDN:


#include <srv.h>
// Macros -- return codes

#define XP_NOERROR 0
#define XP_ERROR 1

SRVRETCODE xp_hello (SRV_PROC* pSrvProc)
{
char szText[15] = "Hello World!";
BYTE bType;
long cbMaxLen;
long cbActualLen;
BOOL fNull;
int ret;
int paramCount;

// Count the number of parameters.
paramCount = srv_rpcparams(pSrvProc);
if (1 != paramCount)
return (XP_ERROR);

// Use srv_paraminfo to get data, type, and length information of the parameter.
ret = srv_paraminfo(pSrvProc, 1, &bType, &cbMaxLen, &cbActualLen, NULL, &fNull);

// Set the output parameter.
if (cbMaxLen < strlen(szText))
return XP_ERROR;
else
ret = srv_paramsetoutput(pSrvProc, 1, szText, strlen(szText), FALSE);


// Describe one row with one column of type BIGVARCHAR
ret = srv_describe(pSrvProc, 1, "Column 1", SRV_NULLTERM, SRVBIGVARCHAR,
strlen(szText), SRVBIGVARCHAR, strlen(szText), szText);


// Send the row.
ret = srv_sendrow(pSrvProc);


// Send results completion message.
ret = srv_senddone(pSrvProc, (SRV_DONE_COUNT | SRV_DONE_MORE), 0, 1);

return (XP_NOERROR);

}


Xp_hello.def
The .def file used in the xp_hello sample exports the xp_hello function. This is in a sample only available if you select Dev Tools during setup.

LIBRARY XP_HELLO

DESCRIPTION 'Sample SQL Server Extended Stored Procedure DLL'

EXPORTS
xp_hello



Тут описана в качестве примера функция xp_hello ...
Как мы видим, что она имеет параметр - указатель на некоторую структуру, в которой и хранятся параметры ...

Первое что делается в этой функции - проверка количества параметров:

paramCount = srv_rpcparams(pSrvProc);

if (1 != paramCount) return (XP_ERROR);


Далее берется информация о параметре (тип, длина):
ret = srv_paraminfo(pSrvProc, 1, &bType, &cbMaxLen, &cbActualLen, NULL, &fNull);


функции srv_rpcparams, srv_paraminfo и структура описаны в подключаемой библиотеке, которую есть в дистрибутиве MS SQL

Также посмотри помощь к SQL - у меня этот файлик лежит здесь: c:\mssql7\books\sqlbol.chm ... в поиске набери "Creating Extended Stored Procedures" и найди соответствующий раздел ...
27 апр 04, 16:45    [652633]     Ответить | Цитировать Сообщить модератору
 Re: расширенная хранимая процедура  [new]
АлексейК
Member

Откуда: http://www.msdatabase.ru , Moscow
Сообщений: 7683
Привет Toking !!

безумно рад что хоть кто - то откликнулся !!!

автор
у нас эта функция реализована на клиенте (я просто переписал код с си на VB)


у меня тоже реализовано на клиенте - только изменил алгоритм (более человеческий поиск схожести выходит) но оставил сишную длл - работает раз в 10 быстрее аналогов в VB - почему - догадываюсь но точно не знаю

автор
Что касается ХР, то есть функции для загрузки параметров
Очень полезно будет разобрать пример, который приведен в MSDN:


да, да да так именно и делаю:

вот код из примера
            if (srv_paraminfo(pSrvProc, nParam+1, &bType, &cbMaxLen,

&cbActualLen, ppbData[nParam], &fNull) == FAIL)
{
rc = XP_ERROR;
break;
}

насколько мне хватает мозгов:
он присваивает массиву указателей значения переменных

а мне для функции нужно строковые переменные а не указатели на массив байт

типа TCHAR* !!!

в этом весь и вопрос как указатели на массив байт преобразовать в строку ?
в число?
27 апр 04, 17:43    [652782]     Ответить | Цитировать Сообщить модератору
 Re: расширенная хранимая процедура  [new]
SeVa
Member [заблокирован]

Откуда: Москва
Сообщений: 4324

// NB: Если компилируется UNICODE-версия модуля, то следующая строка не должна
// быть закомментирована; в случае, когда она закомментирована, используются
// однобайтовые строки.
//#define UNICODE
#ifdef UNICODE
typedef wchar TCHAR
#else
typedef char TCHAR
#endif
//#include "tchar.h"
RETCODE __declspec(dllexport) xp_similarity(SRV_PROC *srvproc)

{

int iMaxLen;
TCHAR* pcA, pcB;
CompResult total;
int iCurSubLen = 0; // Текущая длина подстроки.

//!!!!!!!!!!!!!!!!!!!!! fix me добавить проверку параметров !!!!!!!!!!!!!!!!

pcA = (TCHAR*) srv_paramdata(srvproc, 1);
pcb = (TCHAR*) srv_paramdata(srvproc, 2);
iMaxLen = *((int *)srv_paramdata(srvproc, 3));

if (iMaxLen <= 0 || pcA == NULL || pcB == NULL)
srv_paramset (srvproc, 4, (void*) 0.0, sizeof(double)); // Передан недопустимый аргумент.

total.iVariantsQty = total.iMatchesQty = 0;

while (iCurSubLen < iMaxLen && pcA[iCurSubLen] && pcB[iCurSubLen])
{
CompResult res;

// Сравниваем строку A со строкой B.
res = processStrings (pcA, pcB, iCurSubLen);
total.iVariantsQty += res.iVariantsQty;
total.iMatchesQty += res.iMatchesQty;
// Сравниваем строку B со строкой A.
res = processStrings (pcB, pcA, iCurSubLen);
total.iVariantsQty += res.iVariantsQty;
total.iMatchesQty += res.iMatchesQty;

iCurSubLen++;
}
if (total.iVariantsQty == 0)
srv_paramset (srvproc, 4, (void*) 0.0, sizeof(double))// Вырожденный случай.
else
srv_paramset (srvproc, 4, (void*)((double)total.iMatchesQty / (double)total.iVariantsQty), sizeof(double));
}
27 апр 04, 20:43    [653045]     Ответить | Цитировать Сообщить модератору
 Re: расширенная хранимая процедура  [new]
АлексейК
Member

Откуда: http://www.msdatabase.ru , Moscow
Сообщений: 7683
спасибо Сева !

буду пробовать твой вариант ...

я сделал немного по другому, но нарвался на трудности - почему то при циклическом запросе функции вылетает с ошибкой переполнения при преобразовании с плавабщей точкой ... (если 5 циклов - ок 1000 циклов 100% ошибка)

QA:
while @i<1000
begin
EXECUTE master.dbo.xp_stringcompare @p1 output, @p2 output , @p3 output set @i = @i + 1
end

если в хранимке делать тоже самое - работает

может связано с моим тугоумством в области С++
а может остобенности расширенных хранимых процедур ...
28 апр 04, 13:27    [654354]     Ответить | Цитировать Сообщить модератору
 Re: расширенная хранимая процедура  [new]
SeVa
Member [заблокирован]

Откуда: Москва
Сообщений: 4324
Как я понимаю, в процедуре должно присутсвовать три входных параметра и один выходной. В приведенном примере вызова процедуры я этого не увидел.
PS.
Для жесткости не помешает строка

iMaxLen = MIN(iMaxLen, MIN(srv_paramlen(srvproc, 1), srv_paramlen(srvproc, 2));
28 апр 04, 14:50    [654722]     Ответить | Цитировать Сообщить модератору
 Re: расширенная хранимая процедура  [new]
SeVa
Member [заблокирован]

Откуда: Москва
Сообщений: 4324
Более внятный вариант

// NB: Если компилируется UNICODE-версия модуля, то следующая строка не должна

// быть закомментирована; в случае, когда она закомментирована, используются
// однобайтовые строки.
//#define UNICODE
#ifdef UNICODE
typedef wchar TCHAR
#else
typedef DBCHAR TCHAR
#endif
//#include "tchar.h"
RETCODE __declspec(dllexport) xp_similarity(SRV_PROC *srvproc)

{

int iMaxLen;
TCHAR* pcA, pcB;
CompResult total;
int iCurSubLen = 0; // Текущая длина подстроки.
double dblResult = 0.0;
//!!!!!!!!!!!!!!!!!!!!! fix me добавить проверку параметров !!!!!!!!!!!!!!!!

pcA = (TCHAR*) srv_paramdata(srvproc, 1);
pcb = (TCHAR*) srv_paramdata(srvproc, 2);
iMaxLen = *((int *)srv_paramdata(srvproc, 3));
iMaxLen = MIN(iMaxLen, MIN(srv_paramlen(srvproc, 1), srv_paramlen(srvproc, 2));
if (iMaxLen > 0 && pcA != NULL && pcB != NULL)
{

total.iVariantsQty = total.iMatchesQty = 0;

while (iCurSubLen < iMaxLen && pcA[iCurSubLen] && pcB[iCurSubLen])
{
CompResult res;

// Сравниваем строку A со строкой B.
res = processStrings (pcA, pcB, iCurSubLen);
total.iVariantsQty += res.iVariantsQty;
total.iMatchesQty += res.iMatchesQty;
// Сравниваем строку B со строкой A.
res = processStrings (pcB, pcA, iCurSubLen);
total.iVariantsQty += res.iVariantsQty;
total.iMatchesQty += res.iMatchesQty;

iCurSubLen++;

}
if (total.iVariantsQty > 0.0)
dblResult = (double)total.iMatchesQty / (double)total.iVariantsQty);
}
srv_paramset (srvproc, 4, (void*) &dblResult, sizeof(double));
}
28 апр 04, 14:58    [654758]     Ответить | Цитировать Сообщить модератору
 Re: расширенная хранимая процедура  [new]
SeVa
Member [заблокирован]

Откуда: Москва
Сообщений: 4324
Кроме того,цикл

while (pcB[iSubLen])

{ // Для всех подстрок B длины iSubLen+1.

pcB++;
}


никогда не завершитсяб, если pcB[iSubLen] != NULL . Это полная туфта.Кроме того, эти функции все равно нужно переделывать ,тк SQL передает строки не в сишном виде, те без NULL в конце строки.
28 апр 04, 15:22    [654847]     Ответить | Цитировать Сообщить модератору
 Re: расширенная хранимая процедура  [new]
АлексейК
Member

Откуда: http://www.msdatabase.ru , Moscow
Сообщений: 7683
2 seva

цикл заверштся - там брейк внутри

а алгоритм изначально - голимый безусловно

у меня есть своя методика определения степени речевой созвучности
просто взял куски кода за основу и на них осваиваю С++ в контексте XP

Огромнейшее тебе спасибо!
просто супер!

а что там насчет нула в конце ?
может его надо как нибудь добавить?
28 апр 04, 15:43    [654929]     Ответить | Цитировать Сообщить модератору
 Re: расширенная хранимая процедура  [new]
SeVa
Member [заблокирован]

Откуда: Москва
Сообщений: 4324
Выход по break будет только для внутреннего while(pcA).
Преобразовывать в сишный вид можно следующим образом:


if (srv_paraminfo(srvproc, iParamCnt, &bType, &cbMaxLen, &cbActualLen,

szParam, &fNull) == FAIL)
{
sendError (srvproc, "srv_paraminfo failed...");
return (XP_ERROR);
}
// Terminate parameter string with NULL.
memcpy(szTable, srv_paramdata(srvproc, iParamCnt), srv_paramlen(srvproc, iParamCnt));
szParam[cbActualLen] = '\0';


Но для скорости лучше этого не делать, а определять min длину(см мой код выше) и все счетчики сравнивать с этим значением.
28 апр 04, 16:26    [655105]     Ответить | Цитировать Сообщить модератору
 Re: расширенная хранимая процедура  [new]
АлексейК
Member

Откуда: http://www.msdatabase.ru , Moscow
Сообщений: 7683
а как быть с такой заразой?

если я запиховаю вызов в функцию и запускаю выборку по большому количеству записей то явно видно что функция врет - дает следующему значению часть значения от предыдущего вызова...

а именно если отдельно запустить сравнение двух несовпадающих строк
то результат 0

если последовательно сравнить совпадающие строки а затем несовпадающие то несовпадающие в результате не 0

причем такая же функция сделанная для клиентского приложения на VB - не врет


как бы сделать так чтобы функция запускалась в изолированном пространстве?
28 апр 04, 19:28    [655664]     Ответить | Цитировать Сообщить модератору
 Re: расширенная хранимая процедура  [new]
SeVa
Member [заблокирован]

Откуда: Москва
Сообщений: 4324
Гадать на кофейной гуще не умею. Давай исходники.
28 апр 04, 19:46    [655693]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить