Проблемы StoredProc у SQL server

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Автор: David Gecawich

Обнаруженная мною проблема заключается в ненормальной работе BDE с TStoredProc, когда хранимая процедура SQL получает на входе параметр типа String. Как я понял, BDE/SQL Links перед вызовом хранимой процедуры заносит в строку управляющие символы. Чтобы обойти эту проблему, Borland предлагает использовать TQuery. Конечно, ничего не стоит перевести TStoredProcs в TQuerys (с сохранением полного набора характеристик и без потери скорости), но мне стала интересна причина такого поведения компонента, и я решил покопаться в TStoredProc насколько это было мне возможно и интересно, для чего я добавил дополнительный параметр к хранимой процедуре, позволяющий указывать длину передаваемой процедуре строки. Затем, уже в процедуре, если реальная длина строки оказывалась больше, с помощью дополнительно передаваемого параметра бралась, и в дальнейшем использовалась только левая часть строки, а остальные управляющие символы игнорировались.

Вот пример:

Приведенная ниже процедура SQL Server возвращает 1 если таблица существует, и 2 в противном случае.

CREATE PROCEDURE up_TableExists

( @TableName varchar(50), @TableNameLen int = null)

AS

declare @CleanTblName varchar(50)

if @TableNameLen is not null

select @CleanTblName = SubString(@TableName,1,@TableNameLen)

else

select @CleanTblName = @TableName

if EXISTS (SELECT name FROM sysobjects WHERE name = @CleanTblName)

RETURN 1

else

RETURN 2

Поехали…

В Delphi, прежде чем вызвать ExecProc, установите параметр длины строки… вот пример вызова хранимой процедуры в Delphi…

var

sTableName: string;

rc: Boolean;

begin

sTableName := ‘MyTable’;

with StoredProc1 do

begin

ParamByName(‘@TableName’).AsString := sTableName;

{ обход проблемы: передаем длину строки SQL Server для

обработки хранимой процедурой }

ParamByName(‘@TableNameLen’).AsInteger := Length(sTableName);

Prepare;

ExecProc;

rc := ParamByName(‘Result’).AsInteger = 1; {rc True если result = 1}

if rc then

….

end;

end;

{/codecitation}

Добавить комментарий