DROP PROCEDURE [dbo].[BO_SEARCH_OBJ] GO CREATE PROCEDURE BO_SEARCH_OBJ ( @LOCMACHINE VARCHAR(30), @GUIDCLASS CHAR(22), @REQUEST VARCHAR(4000)) AS BEGIN --EXECUTE BO_SEARCH_OBJ 'USER', 'XIt5GrWQkPnCS.IfZ_kMMb', '[RI.GROUP.TIP] = ''Зенкер'' AND [RI.TYPESIZE.DS]>=10 AND [RI.TYPESIZE.LS]>20 AND [RI.TYPESIZE.DS]<=11' DECLARE @L_REQUEST VARCHAR(30); DECLARE @SYMBOL VARCHAR(10) DECLARE @GUIDPARENT CHAR(22) DECLARE @NOTION VARCHAR(100) DECLARE @NAMETABLE VARCHAR(35) DECLARE @NAMEID VARCHAR(71) DECLARE @NAMEFID VARCHAR(71) DECLARE @FLD VARCHAR(71) DECLARE @NAME_ROOTCLASES VARCHAR(35) DECLARE @NAME_CLASSES VARCHAR(35) DECLARE @NAME_ATTR VARCHAR(35) DECLARE @TEMPGUID CHAR(22) DECLARE @I INTEGER DECLARE @TYPEDATA INTEGER DECLARE @TYPEDATA_STR VARCHAR(30) DECLARE @ID_ATTR INTEGER DECLARE @ID_ATTR_CHECK INTEGER DECLARE @TEXT1 VARCHAR(1000) DECLARE @TEXT2 VARCHAR(1000) DECLARE @TEXT3 VARCHAR(1000) DECLARE @TEXT4 VARCHAR(1000) DECLARE @SQLTEXT VARCHAR(2000) DECLARE @SELECTSTR VARCHAR(2000) DECLARE @CHILDLINKS VARCHAR(71) DECLARE @FIELDVALUE VARCHAR(35) DECLARE @UP1 VARCHAR(10) DECLARE @UP2 VARCHAR(10) DECLARE @UP3 VARCHAR(10) SET @REQUEST = UPPER(@REQUEST) SET @UP1 = '' --переменные UP* используется для обрамления строковых атрибутов функцией UPPER SET @UP2 = '' SET @UP3 = '' DELETE FROM BO_FOUND_OBJ WHERE (LOCMACHINE = @LOCMACHINE) --чистим временную таблицу SELECT @CHILDLINKS = C.NAMETABLE + '.' + A.NAMEFIELD FROM BO_CLASSES C, BO_ATTR_CLASSES A WHERE (C.GUID = A.FGUID) AND (SUBSTRING(A.ARRAYMDATA, 2, 1) = '1') AND (C.GUID = @GUIDCLASS) SELECT TOP 1 @SYMBOL = SYMBOL from SPEC_SYMBOL SET @TEXT3 = 'WHERE ' SET @REQUEST = REPLACE(@REQUEST, ',', '.') SELECT @I = 1 SELECT @NAME_CLASSES = R.NAMEROOTCLASS + '.' + C.NAMECLASS FROM BO_ROOTCLASSES R, BO_CLASSES C WHERE (R.GUID=C.FGUID) AND (C.GUID=@GUIDCLASS) SELECT @TEXT1 = 'SELECT ''' + @LOCMACHINE + ''' + ' + C.NAMETABLE + '.' + A.NAMEFIELD + ', ''' + @LOCMACHINE + ''', ' + C.NAMETABLE + '.' + A.NAMEFIELD + ', ''' + @NAME_CLASSES + '''' FROM BO_CLASSES C, BO_ATTR_CLASSES A WHERE (C.GUID=A.FGUID) AND (C.GUID = @GUIDCLASS) AND (SUBSTRING(A.ARRAYMDATA, 2, 1) = '1') SELECT @NAMEFID = A.NAMEFIELD FROM BO_CLASSES C, BO_ATTR_CLASSES A WHERE (C.GUID=A.FGUID) AND (A.FGUID = @GUIDCLASS) AND (SUBSTRING(A.ARRAYMDATA, 1, 1) = '1') SELECT @NAMETABLE = C.NAMETABLE, @GUIDPARENT = C.GUIDPARENT FROM BO_CLASSES C WHERE (C.GUID = @GUIDCLASS) SET @TEXT2 = 'FROM ' + @NAMETABLE ------------- ЦИКЛ ПО ТАБЛИЦАМ БИЗНЕС-ОБЪЕКТОВ (вверх до 1 уровня)--------------- WHILE (@GUIDPARENT IS NOT NULL AND (@GUIDPARENT <> ' ')) BEGIN SET @TEXT3 = @TEXT3 + '(' + @NAMETABLE + '.' + @NAMEFID + ' = ' SELECT @TEMPGUID = C.GUID, @GUIDPARENT = C.GUIDPARENT, @NAMETABLE = C.NAMETABLE, @NAMEID = A.NAMEFIELD FROM BO_ROOTCLASSES R, BO_CLASSES C, BO_ATTR_CLASSES A WHERE (C.GUID=@GUIDPARENT) AND (R.GUID=C.FGUID) AND (C.GUID=A.FGUID) AND (SUBSTRING(A.ARRAYMDATA, 2, 1) = '1') SELECT @NAMEFID = A.NAMEFIELD FROM BO_ATTR_CLASSES A WHERE (A.FGUID = @TEMPGUID) AND (SUBSTRING(A.ARRAYMDATA, 1, 1) = '1') SET @TEXT2 = @TEXT2 + ', ' + @NAMETABLE SET @TEXT3 = @TEXT3 + @NAMETABLE + '.' + @NAMEID + ') AND ' END SET @TEXT4 = '' ----------------------- ЦИКЛ ПО СТРОКЕ ЗАПРОСА ------------------------------- WHILE (CHARINDEX('[', @REQUEST) > 0) BEGIN SET @TEXT4 = @TEXT4 + DBO.CUTDATA(1, @REQUEST , '[') -- левая часть SET @REQUEST = DBO.CUTDATA(0, @REQUEST , '[') -- правая часть -- здесь отключаю, перенес ниже /* --если строковый атрибут, то будем обрамлять имя поля функцией UPPER IF (DBO.CUTDATA(1, @REQUEST+'[' , '[') LIKE '%''%') SET @UP3 = 'UPPER(' ELSE SET @UP3 = '' */ SET @NOTION = DBO.CUTDATA(1, @REQUEST , ']') -- получили атрибут объекта -- добавлено определение типа атрибута по его полному имени SELECT @TYPEDATA_STR = FLDTYPE FROM GET_TYPE_ATTR(@NOTION) -- получили тип поля атрибута SET @REQUEST = DBO.CUTDATA(0, @REQUEST , ']') -- правая часть -- если тип атрибута TIMESTAMP надо привести эту дату к TIMESTAMP IF (@TYPEDATA_STR IN ('DATETIME', 'TIMESTAMP')) BEGIN SET @L_REQUEST = DBO.CUTDATA(1, @REQUEST , '''') -- в @L_REQUEST запоминаем знак сравнения SET @REQUEST = DBO.CUTDATA(0, @REQUEST , '''') -- отрезаем сравнение от @REQUEST SET @REQUEST = DBO.CUTDATA(1, @REQUEST , '''') -- отрезаем замыкающий апостроф от даты SET @REQUEST = CASE @TYPEDATA_STR WHEN 'DATETIME' THEN @L_REQUEST + 'CAST(''' + @REQUEST + ''' AS DATETIME)' WHEN 'TIMESTAMP' THEN @L_REQUEST + 'CAST(''' + @REQUEST + ''' AS TIMESTAMP)' END; END; -- перенес сверху, как в FB --если строковый атрибут, то будем обрамлять имя поля функцией UPPER IF @TYPEDATA_STR = 'STRING'--(DBO.CUTDATA(1, @REQUEST+'[' , '[') LIKE '%''%') SET @UP3 = 'UPPER(' ELSE SET @UP3 = '' SET @NAME_ROOTCLASES = DBO.CUTDATA(1, @NOTION , '.') SET @NAME_CLASSES = DBO.CUTDATA(1, (DBO.CUTDATA(0, @NOTION , '.')) , '.') SET @NAME_ATTR = DBO.CUTDATA(0, (DBO.CUTDATA(0, @NOTION , '.')), '.') SELECT TOP 1 @FLD = C.NAMETABLE + '.' + A.NAMEFIELD, @TYPEDATA = A.TYPEDATA FROM BO_ROOTCLASSES R, BO_CLASSES C, BO_ATTR_CLASSES A WHERE (R.GUID=C.FGUID) AND (c.GUID=A.FGUID) AND (R.NAMEROOTCLASS=@NAME_ROOTCLASES) AND (C.NAMECLASS=@NAME_CLASSES) AND (A.NAMEATTR = @NAME_ATTR) IF (@UP3 <> '') SET @FLD = @UP3 + @FLD + ')' --обрамляем имя поля функцией UPPER IF ((@TYPEDATA IS NULL) OR (@TYPEDATA = 0)) SET @TEXT4 = @TEXT4 + @FLD ELSE -- если атрибут динамический (есть тип данных) BEGIN SET @ID_ATTR_CHECK = 0 SET @FIELDVALUE = CASE @TYPEDATA WHEN 1 THEN '.VALUESTR' WHEN 2 THEN '.VALUEINT' WHEN 3 THEN '.VALUEDOUBLE' WHEN 4 THEN '.VALUETEXT' WHEN 5 THEN '.VALUEBLOB' WHEN 6 THEN '.VALUETIMESTAMP' END IF (@TYPEDATA = 1) --для строковых атрибутов используем обрамление функцией UPPER BEGIN SET @UP1 = 'UPPER('; SET @UP2 = ')'; END SELECT TOP 1 @ID_ATTR = A.ID FROM BO_ROOTCLASSES R, BO_CLASSES C, BO_ATTR_CLASSES A WHERE (R.NAMEROOTCLASS = @NAME_ROOTCLASES) AND (C.NAMECLASS = @NAME_CLASSES) AND (A.NAMEATTR = @NAME_ATTR) AND R.GUID = C.FGUID AND C.GUID = A.FGUID --Если предыдущий атрибут был тем же, то не линкуем еще раз BO_ATTR_EXEMPLAR, --а используем предыдущий BO_ATTR_EXEMPLAR, для чего уменьшаем счетчик на единицу IF (@ID_ATTR <> @ID_ATTR_CHECK) BEGIN SET @TEXT2 = @TEXT2 + ', BO_ATTR_EXEMPLAR E' + CAST(@I AS VARCHAR(3)) SET @TEXT3 = @TEXT3 + @CHILDLINKS + ' = E' + CAST(@I AS VARCHAR(3)) + '.GUIDOBJECT AND ' SET @TEXT4 = @TEXT4 + 'E' + CAST(@I AS VARCHAR(3)) + '.IDTYPEATTR = ' + CAST(@ID_ATTR AS VARCHAR(10)) + ' AND ' END ELSE SET @I = @I - 1 --SET @TEXT4 = @TEXT4 + ' E' + CAST(@I AS VARCHAR(3)) + @FIELDVALUE SET @TEXT4 = @TEXT4 + @UP1 + ' E' + CAST(@I AS VARCHAR(3)) + @FIELDVALUE + @UP2; --при склеивании используется обрамление UPPER (переменные UP1 и UP2) SET @ID_ATTR_CHECK = @ID_ATTR END SET @I = @I + 1 END SET @TEXT4 = @TEXT4 + @REQUEST SELECT @SELECTSTR = @TEXT1 + @SYMBOL + @TEXT2 + @SYMBOL + @TEXT3 + @SYMBOL + @TEXT4 SELECT @SQLTEXT = 'INSERT INTO BO_FOUND_OBJ (GUID, LOCMACHINE, GUIDOBJ, NAME_CLASS) ' + @SYMBOL + @TEXT1 + @SYMBOL + @TEXT2 + @SYMBOL + @TEXT3 + @SYMBOL + @TEXT4 EXEC (@SQLTEXT) --DELETE FROM BO_FOUND_OBJ WHERE (LOCMACHINE = @LOCMACHINE) AND (GUIDOBJ IN (SELECT GUID_BO FROM BO_NOAPPLY)) END GO