Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Создание XP  [new]
Grayscale
Member

Откуда: Спб
Сообщений: 1642
Добрый день! Есть такая нестандартная задача: получить из ХП с 2мя параметрами ХП с одним параметром. Вижу как решение 2 варианта:
1. создавать xpSource и вносить значение второго параметра в текст выборки каждый раз когда оно потребуется.
2. оставить xpSource как есть и обернуть ее в xpSource2 у которой будет текст
CREATE PROC xpSource2 (@param INT)
AS
EXEC xpSource @param,4 -- 4ка в качестве второго параметра

я знаю что при сохранении процедуры сервер рисуует что-то типа плана выполнения... подскажите будет ли второй вариант лучше или значения не имеет?
24 июн 09, 12:49    [7337095]     Ответить | Цитировать Сообщить модератору
 Re: Создание XP  [new]
iljy
Member

Откуда:
Сообщений: 8711
Grayscale,

а параметр по умолчанию вас не устроит??
24 июн 09, 12:54    [7337122]     Ответить | Цитировать Сообщить модератору
 Re: Создание XP  [new]
Grayscale
Member

Откуда: Спб
Сообщений: 1642
А это как?
24 июн 09, 12:58    [7337154]     Ответить | Цитировать Сообщить модератору
 Re: Создание XP  [new]
iljy
Member

Откуда:
Сообщений: 8711
Grayscale,

CREATE PROC xpSource (@param1 INT, @param2 INT = 4)
24 июн 09, 13:02    [7337191]     Ответить | Цитировать Сообщить модератору
 Re: Создание XP  [new]
Grayscale
Member

Откуда: Спб
Сообщений: 1642
нет(( значение может быть любым((
24 июн 09, 13:10    [7337257]     Ответить | Цитировать Сообщить модератору
 Re: Создание XP  [new]
iljy
Member

Откуда:
Сообщений: 8711
Grayscale,
?
это полный эквивалент кода
CREATE PROC xpSource2 (@param INT)
AS
EXEC xpSource @param,4
вы вообще знаете, что такое параметр по умолчанию?
24 июн 09, 13:12    [7337269]     Ответить | Цитировать Сообщить модератору
 Re: Создание XP  [new]
Grayscale
Member

Откуда: Спб
Сообщений: 1642
iljy
вы вообще знаете, что такое параметр по умолчанию?

Да, я знаю
dim l as long
Public sub form_load
l=random(100000) ' допустим уникально
runSQlStr "Create procedure random" & l & "(@param INT) AS EXEC oldSP @param," & openArgs
end sub
Public sub form_unload
runSQlStr "DROP procedure random" & l 
end sub
Это очень условное пояснение...
24 июн 09, 13:20    [7337314]     Ответить | Цитировать Сообщить модератору
 Re: Создание XP  [new]
iljy
Member

Откуда:
Сообщений: 8711
Grayscale,

как-то оно слишком условно... параметром по умолчанию во всех языках программирования называют параметр, значение которого может не указываться при вызове процедуры или функции. И в случае, который я вам предложил (CREATE PROC xpSource (@param1 INT, @param2 INT = 4)) - именно это и используется. при этом процедуру xpSource можно вызывать как вот так:
exec xpSource 1,2
так и вот так:
exec xpSource 1
при этом во втором случае внутри процеду @Param2 будет иметь значение 4.
24 июн 09, 13:26    [7337355]     Ответить | Цитировать Сообщить модератору
 Re: Создание XP  [new]
Grayscale
Member

Откуда: Спб
Сообщений: 1642
Не понимаешь про, что я зачем пишешь? Я совсем на другую тему вопрос задал
iljy
Grayscale,
а параметр по умолчанию вас не устроит??

Grayscale
нет(( значение может быть любым((
24 июн 09, 13:59    [7337609]     Ответить | Цитировать Сообщить модератору
 Re: Создание XP  [new]
vov@
Member

Откуда: Днепропетровск
Сообщений: 110
попробуй перефразировать вопрос.
действительно не понятно зачем тебе дополнительная процедура?

это решение то что тебе нужно
iljy
Grayscale,

CREATE PROC xpSource (@param1 INT, @param2 INT = 4)
24 июн 09, 14:10    [7337695]     Ответить | Цитировать Сообщить модератору
 Re: Создание XP  [new]
iljy
Member

Откуда:
Сообщений: 8711
Grayscale,
как же тебя понять коль ты ничего не говоришь! (С)
насколько я понял из примера кода - из проги на васике хочется вызывать процедуру, в которую вместо всех параметров передавать только один, а остальные задать при создании формы? я правда не очень понимаю, что мешает вызывать исходную, подставляя в нее параметры, т.е. формировать вызов
"EXEC oldSP " & param &"," & openArgs
ну да ладно.
всякие ады и адонеты допускают формирование команды с параметром. Создаешь в форме объект SqlCommand с текстом "EXEC oldSP @param," & openArgs, в нем один именованный параметр- и будет тебе щастье.
24 июн 09, 14:20    [7337781]     Ответить | Цитировать Сообщить модератору
 Re: Создание XP  [new]
Grayscale
Member

Откуда: Спб
Сообщений: 1642
В аксе есть такая штука как ResyncCommand оч полезная и прям-таки необходимая штука, но хранимки она понимает только с одним параметром, а форма работает так, что как ни крути 2 параметра надо. Поскольку сис-ма многопользовательская 2 открытых клиента хотят иметь доступ к oldProc 2,4 и oldProc 2,17 одновременно. Но передать ей oldProc никак нельзя, можно ток генерить XP динамически и убирать за собой... Вот и чтоб не перегружать сервер думаю, если я буду генерить сложную хранимку для каждого юзера не займет ли это слишком много времени, но и пачкать кучей оберток код не хочется. Потому спрашиваю как поведет себя оптимизатор (ведь есть такая тема что при создании ХП или вьюхи намечает что-то типа плана выполнения и дальше всегда с ним работает?) если я буду клепать каждый раз мелкую обертку для большой хзранимки? Не будет ли он разворачивать обе хранимки в один план? Тогда смысла клепать обертки не вижу... Примерно так вопрос звучит...
24 июн 09, 14:59    [7338084]     Ответить | Цитировать Сообщить модератору
 Re: Создание XP  [new]
iljy
Member

Откуда:
Сообщений: 8711
Grayscale,

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

с аксесом не работал, этот компонент только хранимки понимает, т.е. требует имя, или можно параметризованный запрос ему сунуть?
24 июн 09, 15:14    [7338226]     Ответить | Цитировать Сообщить модератору
 Re: Создание XP  [new]
ветерочек
Member

Откуда: СПБ
Сообщений: 153
?
CREATE PROC xpSource2 (@param VARCHAR(100))
AS
--- @param = STR(@par)+'.'+STR(@par2)
DECLARE @par INT
DECLARE @par2 INT
SET @par =PARSENAME('3.4',2)
SET @par2 =PARSENAME('3.4',1)
EXEC xpSource @par,@par2 
24 июн 09, 15:23    [7338337]     Ответить | Цитировать Сообщить модератору
 Re: Создание XP  [new]
Grayscale
Member

Откуда: Спб
Сообщений: 1642
"параметризованный запрос" это как? Вариант с передачей в тексте конечно можно...
24 июн 09, 17:05    [7339302]     Ответить | Цитировать Сообщить модератору
 Re: Создание XP  [new]
iljy
Member

Откуда:
Сообщений: 8711
Grayscale
"параметризованный запрос" это как? Вариант с передачей в тексте конечно можно...


EXEC oldSP @param, 2

это запрос с одним параметром. sp_executesql такие понимает:

sp_executesql N'exec dbo.GetStatuses_Points ''20070101'', ''20090528'', @Param1, 1',
			  N'@Param1 int', @Param1 = 20

у меня такое работает. если компонент работает через вызов этой хранимки - значит и вам повезет.
24 июн 09, 17:24    [7339466]     Ответить | Цитировать Сообщить модератору
 Re: Создание XP  [new]
Grayscale
Member

Откуда: Спб
Сообщений: 1642
Поковыряю, Спасибо))
24 июн 09, 17:33    [7339537]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить