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

Откуда:
Сообщений: 40
Задача такая, есть дистрибутив, в который в бд входят хранимые процедуры. У каждого клиента могут быть небольшие особенности бизнес-процессов, что приводит к небольшим изменениям в хранимых процедурах. Чтобы эти изменения было легко отслеживать и управлять, решено сделать так - во всех процедурах по-умолчанию сделать проверку - если есть хп с суффиксом _Local, то перенапрявлять вызов в нее, иначе выполнять общий для всех код. Количество параметров у всех процедур, в которых возможен редирект - разное.

Как сделать универсальный редирект, чтобы не приходилось в каждой процедуре, для которой возможна локальная версия, явно прописывать переменные? Возможно небольшое ухудшение производительности, но не сильное ухудшение.
5 авг 08, 12:22    [6027869]     Ответить | Цитировать Сообщить модератору
 Re: Универсальный редирект вызова на другую хранимую процедуру  [new]
Crimean
Member

Откуда:
Сообщений: 13148
устал уже писать, но

вызовы писать не

exec @retcode = myproc
@param1 = @value1,...

а как-то типа такого:

declare @procname sysname
-- тут определение имени процедуры. как вариант - функция/проца с параметром @@PROCID :)
-- дальше все очень просто

exec @retcode = @procname
@param1 = @value1,...

причем exec @procname не считается динамикой со всеми вытекающими
5 авг 08, 12:40    [6027998]     Ответить | Цитировать Сообщить модератору
 Re: Универсальный редирект вызова на другую хранимую процедуру  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
SET NOCOUNT ON;
USE tempdb;
IF OBJECT_ID(N'P_Local','P') IS NOT NULL DROP PROCEDURE P_Local;
GO
CREATE PROCEDURE P_Local(@Par1 INT, @Par2 DATETIME) AS PRINT 'I am P_Local!';
IF OBJECT_ID(N'P','P') IS NOT NULL DROP PROCEDURE P;
GO
CREATE PROCEDURE P(@Par1 INT, @Par2 DATETIME) AS
DECLARE @Proc sysname;
SET @Proc=OBJECT_NAME(@@PROCID)+N'_Local';
IF OBJECT_ID(@Proc,'P') IS NOT NULL
 EXECUTE @Proc @Par1, @Par2;
GO
EXECUTE P 1, '20080709';
GO
5 авг 08, 12:46    [6028035]     Ответить | Цитировать Сообщить модератору
 Re: Универсальный редирект вызова на другую хранимую процедуру  [new]
4dept
Member

Откуда:
Сообщений: 40
iap
SET NOCOUNT ON;
USE tempdb;
IF OBJECT_ID(N'P_Local','P') IS NOT NULL DROP PROCEDURE P_Local;
GO
CREATE PROCEDURE P_Local(@Par1 INT, @Par2 DATETIME) AS PRINT 'I am P_Local!';
IF OBJECT_ID(N'P','P') IS NOT NULL DROP PROCEDURE P;
GO
CREATE PROCEDURE P(@Par1 INT, @Par2 DATETIME) AS
DECLARE @Proc sysname;
SET @Proc=OBJECT_NAME(@@PROCID)+N'_Local';
IF OBJECT_ID(@Proc,'P') IS NOT NULL
 EXECUTE @Proc @Par1, @Par2;
GO
EXECUTE P 1, '20080709';
GO

Угу, это понятно. Есть 100 процедур, у которых возможны локальные версии, при чем у них у всех разный набор входных параметров - у каждой не охота внутри явно прописывать EXECUTE @Proc @Par1, @Par2;

охота сделать что-то вроде Execute @Proc GetParams(), чтобы передавать все параметры текущей процедуры в локальную версию один-в-один
5 авг 08, 13:09    [6028211]     Ответить | Цитировать Сообщить модератору
 Re: Универсальный редирект вызова на другую хранимую процедуру  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
sys.parameters
5 авг 08, 13:21    [6028279]     Ответить | Цитировать Сообщить модератору
 Re: Универсальный редирект вызова на другую хранимую процедуру  [new]
Crimean
Member

Откуда:
Сообщений: 13148
> охота сделать что-то вроде Execute @Proc GetParams(), чтобы передавать все параметры текущей процедуры в локальную версию один-в-один

тогда ваша текущая процедура должна быть НЕ T-SQL, а ODS (extended) или CLR. в ODS точно можно передать "дальше" все полученные параметры. в CLR, возможно - точно не уверен
пример с ODS есть
ftp.lime-systems.com/pub/Tools/RemoteExec
но цена вопроса - переподключение к себе же из своей же DLL
но я еще не копал CLR в этом направлении
5 авг 08, 13:30    [6028339]     Ответить | Цитировать Сообщить модератору
 Re: Универсальный редирект вызова на другую хранимую процедуру  [new]
4dept
Member

Откуда:
Сообщений: 40
Crimean
> охота сделать что-то вроде Execute @Proc GetParams(), чтобы передавать все параметры текущей процедуры в локальную версию один-в-один

тогда ваша текущая процедура должна быть НЕ T-SQL, а ODS (extended) или CLR. в ODS точно можно передать "дальше" все полученные параметры. в CLR, возможно - точно не уверен
пример с ODS есть
ftp.lime-systems.com/pub/Tools/RemoteExec
но цена вопроса - переподключение к себе же из своей же DLL
но я еще не копал CLR в этом направлении

спасибо. попробую поразбираться..
5 авг 08, 13:54    [6028563]     Ответить | Цитировать Сообщить модератору
 Re: Универсальный редирект вызова на другую хранимую процедуру  [new]
4dept
Member

Откуда:
Сообщений: 40
Knyazev Alexey
sys.parameters

Видел это представление, а как предлагаете сделать?
5 авг 08, 13:55    [6028575]     Ответить | Цитировать Сообщить модератору
 Re: Универсальный редирект вызова на другую хранимую процедуру  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
4dept
Knyazev Alexey
sys.parameters

Видел это представление, а как предлагаете сделать?

проверять такие же ли параметры у пользовательской процедуры и если совпадают - тогда выполнять
5 авг 08, 13:58    [6028593]     Ответить | Цитировать Сообщить модератору
 Re: Универсальный редирект вызова на другую хранимую процедуру  [new]
Crimean
Member

Откуда:
Сообщений: 13148
SergSuper
4dept
Knyazev Alexey
sys.parameters

Видел это представление, а как предлагаете сделать?

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


ээ.. а значения-то откуда брать?

> охота сделать что-то вроде Execute @Proc GetParams(),
> чтобы передавать все параметры текущей процедуры в локальную версию один-в-один

интересно было бы посмотреть на пример реализации на T-SQL!
5 авг 08, 14:09    [6028712]     Ответить | Цитировать Сообщить модератору
 Re: Универсальный редирект вызова на другую хранимую процедуру  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
Лучше
INFORMATION_SCHEMA.PARAMETERS
5 авг 08, 14:23    [6028829]     Ответить | Цитировать Сообщить модератору
 Re: Универсальный редирект вызова на другую хранимую процедуру  [new]
PavelPS
Member

Откуда: петербург
Сообщений: 84
наверно надо что то типа
create PROC test123 
@a INT,
@b INT
AS

BEGIN
	DECLARE @text VARCHAR (max)
	DECLARE @text2 VARCHAR (max)
	IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.PARAMETERS p
		WHERE	p.SPECIFIC_CATALOG 	= db_name() 
		AND	p.SPECIFIC_SCHEMA 	= 'dbo'
		AND	p.SPECIFIC_NAME 	= 'Local_'+OBJECT_NAME(@@PROCID))
		BEGIN
			SET @text = 'EXEC '+'Local_'+OBJECT_NAME(@@PROCID) 
			SET @text2 = ''
			select  @text = @text + ' '+p.PARAMETER_NAME +'= ' +p.PARAMETER_NAME +',',@text2 = @text2 + p.PARAMETER_NAME +','
		FROM	INFORMATION_SCHEMA.PARAMETERS p
		WHERE	p.SPECIFIC_CATALOG 	= db_name() 
		AND	p.SPECIFIC_SCHEMA 	= 'dbo'
		AND	p.SPECIFIC_NAME 		IN('Local_'+OBJECT_NAME(@@PROCID),OBJECT_NAME(@@PROCID)) 
		GROUP BY p.PARAMETER_NAME
		HAVING COUNT(*)=2
			PRINT @text+'--'+@text2
		END
		
	ELSE 
		PRINT 'нет' 
END 
GO
CREATE PROC Local_test123  
@a INT,
@b INT
AS
PRINT 'ii' 
GO
EXEC test123   6,7



естественно место

PRINT @text+'--'+@text2

надо юзать
sp_executesql

последние запятые убрать ...
5 авг 08, 14:55    [6029063]     Ответить | Цитировать Сообщить модератору
 Re: Универсальный редирект вызова на другую хранимую процедуру  [new]
4dept
Member

Откуда:
Сообщений: 40
PavelPS
наверно надо что то типа
create PROC test123 
@a INT,
@b INT
AS

BEGIN
	DECLARE @text VARCHAR (max)
	DECLARE @text2 VARCHAR (max)
	IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.PARAMETERS p
		WHERE	p.SPECIFIC_CATALOG 	= db_name() 
		AND	p.SPECIFIC_SCHEMA 	= 'dbo'
		AND	p.SPECIFIC_NAME 	= 'Local_'+OBJECT_NAME(@@PROCID))
		BEGIN
			SET @text = 'EXEC '+'Local_'+OBJECT_NAME(@@PROCID) 
			SET @text2 = ''
			select  @text = @text + ' '+p.PARAMETER_NAME +'= ' +p.PARAMETER_NAME +',',@text2 = @text2 + p.PARAMETER_NAME +','
		FROM	INFORMATION_SCHEMA.PARAMETERS p
		WHERE	p.SPECIFIC_CATALOG 	= db_name() 
		AND	p.SPECIFIC_SCHEMA 	= 'dbo'
		AND	p.SPECIFIC_NAME 		IN('Local_'+OBJECT_NAME(@@PROCID),OBJECT_NAME(@@PROCID)) 
		GROUP BY p.PARAMETER_NAME
		HAVING COUNT(*)=2
			PRINT @text+'--'+@text2
		END
		
	ELSE 
		PRINT 'нет' 
END 
GO
CREATE PROC Local_test123  
@a INT,
@b INT
AS
PRINT 'ii' 
GO
EXEC test123   6,7



естественно место

PRINT @text+'--'+@text2

надо юзать
sp_executesql

последние запятые убрать ...

Получить-то список параметров не проблема, а как передать текущие значения параметров?
5 авг 08, 14:58    [6029088]     Ответить | Цитировать Сообщить модератору
 Re: Универсальный редирект вызова на другую хранимую процедуру  [new]
4dept
Member

Откуда:
Сообщений: 40
SergSuper
4dept
Knyazev Alexey
sys.parameters

Видел это представление, а как предлагаете сделать?

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

Не, считаем что сигнатура хп абсолютно такая же, только имя хп другое.
Списко параметров можно получить из представления, а как сформировать строку для выполнения для sp_executesql? Не представляю, как можно обратиться ко всем ТЕКУЩИМ параметрам функции динамически, заранее не зная имени и типа?
5 авг 08, 15:05    [6029164]     Ответить | Цитировать Сообщить модератору
 Re: Универсальный редирект вызова на другую хранимую процедуру  [new]
PavelPS
Member

Откуда: петербург
Сообщений: 84
вобщето я перестарался
разве сложно получить такую строку?
'EXECUTE '+@Proc+' 
@Param1 = '+CONVERT(VARCHAR()),@Param1)+ -- здесь немного подумать про null..
'@Param2 = '+
5 авг 08, 15:07    [6029184]     Ответить | Цитировать Сообщить модератору
 Re: Универсальный редирект вызова на другую хранимую процедуру  [new]
4dept
Member

Откуда:
Сообщений: 40
Вот! Требуется что-то вроде GetParameter(@param_name), а @param_name брать из представления
и уже с ними формировать строку вида @param_name = GetParam(@param_name)
5 авг 08, 15:08    [6029189]     Ответить | Цитировать Сообщить модератору
 Re: Универсальный редирект вызова на другую хранимую процедуру  [new]
4dept
Member

Откуда:
Сообщений: 40
PavelPS
вобщето я перестарался
разве сложно получить такую строку?
'EXECUTE '+@Proc+' 
@Param1 = '+CONVERT(VARCHAR()),@Param1)+ -- здесь немного подумать про null..
'@Param2 = '+


Тут ты знаешь, что должен быть @Param1 и @Param2, то есть в каждой процедуре придется ручками прописывать код, который зависит от того, в какой процедуре используется.

Ищу универсальный способ, чтобы можно было вставить его в начало каждой процедуры, который бы перенапрявлял вызов процедуры на другую со всеми параметрами вызова.
5 авг 08, 15:11    [6029210]     Ответить | Цитировать Сообщить модератору
 Re: Универсальный редирект вызова на другую хранимую процедуру  [new]
PavelPS
Member

Откуда: петербург
Сообщений: 84
4dept
PavelPS
вобщето я перестарался
разве сложно получить такую строку?
'EXECUTE '+@Proc+' 
@Param1 = '+CONVERT(VARCHAR()),@Param1)+ -- здесь немного подумать про null..
'@Param2 = '+


Тут ты знаешь, что должен быть @Param1 и @Param2, то есть в каждой процедуре придется ручками прописывать код, который зависит от того, в какой процедуре используется.

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

понял
как вариант -
получить этот код для всех процедур и вставить его:)
5 авг 08, 15:23    [6029315]     Ответить | Цитировать Сообщить модератору
 Re: Универсальный редирект вызова на другую хранимую процедуру  [new]
4dept
Member

Откуда:
Сообщений: 40
PavelPS
4dept
PavelPS
вобщето я перестарался
разве сложно получить такую строку?
'EXECUTE '+@Proc+' 
@Param1 = '+CONVERT(VARCHAR()),@Param1)+ -- здесь немного подумать про null..
'@Param2 = '+


Тут ты знаешь, что должен быть @Param1 и @Param2, то есть в каждой процедуре придется ручками прописывать код, который зависит от того, в какой процедуре используется.

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

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

Не, мы не ищем легких путей. Нам лень)
5 авг 08, 15:39    [6029432]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Универсальный редирект вызова на другую хранимую процедуру  [new]
reiterix
Member

Откуда: nizhniynovgorod
Сообщений: 36
Аж через 5 лет присоединяюсь к данному вопросу, может за данный промежуток времени нашли способ создания универсального редиректа?
24 июл 13, 15:08    [14611060]     Ответить | Цитировать Сообщить модератору
 Re: Универсальный редирект вызова на другую хранимую процедуру  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Особо не врубаюсь в эту всю хренотень и говно-решения. Но чем SYNONYM-ы не угодили?
24 июл 13, 20:52    [14613331]     Ответить | Цитировать Сообщить модератору
 Re: Универсальный редирект вызова на другую хранимую процедуру  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31430
reiterix
Аж через 5 лет присоединяюсь к данному вопросу, может за данный промежуток времени нашли способ создания универсального редиректа?
Не нашёл в исходном обсужлдении - откуда беруться параметры для редиректа? Ведь если у каждой вызываемой процедуры параметры разные, то и общая процедура тоже должна каждый раз вызываться с разными параметрами, а T-SQL такого не позволяет.
24 июл 13, 21:16    [14613386]     Ответить | Цитировать Сообщить модератору
 Re: Универсальный редирект вызова на другую хранимую процедуру  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
alexeyvg
общая процедура тоже должна каждый раз вызываться с разными параметрами, а T-SQL такого не позволяет.
CREATE PROC dbo.spUniversal
 @Param1 SqlVariant = NULL
,@Param2 SqlVariant = NULL
,...
,@Param100500 SqlVariant = NULL
AS BEGIN
...
END
GO
EXEC @Result = @ProcName @Param1, @Panam2, ..., @ParamN
Можно придумать любое подходящее условие задачи (с кучу ограничений), особенно описанное так же размыто в выражениях.
Тут это уже освещалось.
И тема набита столькой всякой хрени, что лучше её похоронить от греха подальше.

reiterix, если вам так приспичило - то откройте новую тему и опишите что это зверь такой "редирект".
25 июл 13, 00:10    [14613967]     Ответить | Цитировать Сообщить модератору
 Re: Универсальный редирект вызова на другую хранимую процедуру  [new]
reiterix
Member

Откуда: nizhniynovgorod
Сообщений: 36
Mnior
reiterix, если вам так приспичило - то откройте новую тему и опишите что это зверь такой "редирект".


Да цель то главная проста - хранить историю вызова каждой процедуры. profiler не предлагать) :)

Можно узнать названия и количество параметров каждой процедуры, а вот как в момент вызова узнать в самой процедуре значения параметров, вот это загадка...
27 июл 13, 23:28    [14627527]     Ответить | Цитировать Сообщить модератору
 Re: Универсальный редирект вызова на другую хранимую процедуру  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31430
reiterix
а вот как в момент вызова узнать в самой процедуре значения параметров, вот это загадка...
Вам же сам вызов лигтрующей процедуры всё равно нужно вставлять в логируемую процедуру?
Вот и передавайте те параметры, которые есть. А логирующая процедура будет их записывать.
28 июл 13, 01:27    [14627833]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить