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

Откуда:
Сообщений: 23
Всем привет, можете подсказать как переделать эту процедуру так что бы она принимала на вход любое количество аргументов?
Будь то:
- EXEC selectCarInfo 'Mersedes'
- EXEC selectCarInfo 'Mersedes' , 'Honda' , ... , 'Nissan'


CREATE PROCEDURE selectCarInfo
@Mark varchar(35)
AS
SELECT
a.auto_ID as "ID автомобиля" ,
m.make as "Марка автомомбиля" ,
md.model as "Модель",
w.wheel as "Расположение руля",
a.manufactureDate as "Дата выпуска"

FROM auto as a ,
make as m,
wheel as w,
model as md

WHERE m.make_ID = a.make_ID
AND
w.wheel_ID = a.wheel_ID
AND
md.model_ID = a.model_ID
AND
@Mark = m.make
19 дек 16, 18:25    [20023908]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры с переменным количеством аргументов  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
ba3uk,

на вход xml и дальше его разбирать
19 дек 16, 18:26    [20023914]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры с переменным количеством аргументов  [new]
ba3uk
Member

Откуда:
Сообщений: 23
TaPaK

на вход xml и дальше его разбирать

TaPaK , прости,но я даже не представляю как это делать
19 дек 16, 18:34    [20023963]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры с переменным количеством аргументов  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
ba3uk
TaPaK
на вход xml и дальше его разбирать

TaPaK , прости,но я даже не представляю как это делать

прощаю, что именно? подавать, принимать, разбирать? :)
19 дек 16, 18:34    [20023971]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры с переменным количеством аргументов  [new]
ba3uk
Member

Откуда:
Сообщений: 23
TaPaK
ba3uk
пропущено...

подавать, принимать, разбирать? :)

Не умею делать с xml ничего :с
19 дек 16, 18:44    [20024045]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры с переменным количеством аргументов  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
ba3uk,
гугл поможет :)
http://www.itworld.com/article/2960645/development/tsql-how-to-use-xml-parameters-in-stored-procedures.html
19 дек 16, 18:47    [20024061]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры с переменным количеством аргументов  [new]
o-o
Guest
Use Table-Valued Parameters (Database Engine)
19 дек 16, 18:48    [20024074]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры с переменным количеством аргументов  [new]
o-o
Guest
зачем ему xml, если он просто кучу марок машин передает?
поле -- одно. значений -- уйма.
передавать в переменной типа table и джойнить с ней.
все
19 дек 16, 18:51    [20024087]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры с переменным количеством аргументов  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
o-o,

TVP богомерзкая штука :)
19 дек 16, 18:52    [20024091]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры с переменным количеством аргументов  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
как и xml :) я за временные таблицы :)
19 дек 16, 18:53    [20024093]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры с переменным количеством аргументов  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
ba3uk,

+ ацкий говнокод:)
CREATE PROCEDURE selectCarInfo
@Mark varchar(35) = '',
@Mark1 varchar(35) = '',
@Mark2 varchar(35) = '',
@Mark3 varchar(35) = '',
@Mark4 varchar(35) = '',
@Mark5 varchar(35) = '',
@Mark6 varchar(35) = '',
@Mark7 varchar(35) = '',
@Mark8 varchar(35) = '',
@Mark9 varchar(35) = '',
@Mark10 varchar(35) = ''
AS
SELECT 
a.auto_ID as "ID автомобиля" ,
m.make as "Марка автомомбиля" ,
md.model as "Модель",
w.wheel as "Расположение руля",
a.manufactureDate as "Дата выпуска"

FROM 
    auto as a
    join make as m on m.make_ID = a.make_ID 
    join wheel as w on w.wheel_ID = a.wheel_ID
    join model as md on md.model_ID = a.model_ID

WHERE 
    m.make in (@Mark, @Mark1, @Mark2, @Mark3, @Mark4, @Mark5, @Mark6,  @Mark7, @Mark8, @Mark9, @Mark1)
19 дек 16, 18:54    [20024104]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры с переменным количеством аргументов  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
ba3uk
- EXEC selectCarInfo 'Mersedes'
- EXEC selectCarInfo 'Mersedes' , 'Honda' , ... , 'Nissan'

Правильный ответ - нельзя. А если очень хочется, то как и написали выше
XML, TVP
Но я бы посоветовал пересмотреть бизнес-логику, возможно хватит inline function
19 дек 16, 18:56    [20024109]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры с переменным количеством аргументов  [new]
o-o
Guest
TaPaK
TVP богомерзкая штука :)

для <= сотни значений в самый раз
19 дек 16, 18:57    [20024113]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры с переменным количеством аргументов  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Руслан Дамирович
ba3uk
- EXEC selectCarInfo 'Mersedes'
- EXEC selectCarInfo 'Mersedes' , 'Honda' , ... , 'Nissan'

Правильный ответ - нельзя. А если очень хочется, то как и написали выше
XML, TVP
Но я бы посоветовал пересмотреть бизнес-логику, возможно хватит inline function

а в "inline function" по вашему как передавать?
19 дек 16, 18:57    [20024115]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры с переменным количеством аргументов  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
TaPaK
Руслан Дамирович
пропущено...

Правильный ответ - нельзя. А если очень хочется, то как и написали выше
XML, TVP
Но я бы посоветовал пересмотреть бизнес-логику, возможно хватит inline function

а в "inline function" по вашему как передавать?

Ну сама постановка задачи подразумевает начальную подготовку запроса - на что и ориентированы ваши решения в том числе.
Так что накидываем что есть "на вентилятор".
А поскольку у ТС уже есть процедура, поэтому могу посоветовать INSERT INTO EXEC и Dynamic T-SQL
CREATE TABLE #info (
  "ID автомобиля" INT,
  "Марка автомомбиля" NVARCHAR(200),
  "Модель" NVARCHAR(500),
  "Расположение руля" TINYINT,
  "Дата выпуска" DATE{TIME2(0)}
)
INSERT INTO #info
EXEC selectCarInfo @mark = 'Mersedes'
INSERT INTO #info
EXEC selectCarInfo @mark = 'Honda'
... 
INSERT INTO #info
EXEC selectCarInfo @mark = 'Nissan' 
...
SELECT
  *
FROM
  #info
19 дек 16, 19:08    [20024168]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры с переменным количеством аргументов  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Руслан Дамирович,

А inline при чем здесь.... К этому...
19 дек 16, 20:34    [20024459]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры с переменным количеством аргументов  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
TVP зло, гемора по рефакторингу намного больше, чем с XML. Но выбор, конечно, за каждым...
Такие вот гибкие запросы - также зло, они порождают массу вопросов у опимизатора плюс заполняют кэш планов мусором, что опять же, сбивает с толку оптимизатор.
Наименьшим злом в данной ситуации было бы использование OLAP сервисов в том или ином проявлении. Все зависит от контекста выполнения задачи.
20 дек 16, 10:31    [20025784]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры с переменным количеством аргументов  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
И ниодного правильного ответа... :)

Произвольное кол-во мож и нельзя, но произвольное кол-во непустых параметров можно.
Списки можно передавать временными таблицами (работают быстрее табличных переменных).
Упрощенный пример:

and (@x is null or ID=@x)
and (@y is null or (ID2=@y and @x <> 0))
and exists(select * from #TTT where #TTT.id = MyTable.ID3 and @x is null)

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

зы: а разбор ХМЛ все равно упрется либо в динамический СКЛ либо см. выше. :)
20 дек 16, 11:12    [20026034]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры с переменным количеством аргументов  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
LSV
И ниодного правильного ответа... :)

Произвольное кол-во мож и нельзя, но произвольное кол-во непустых параметров можно.
Списки можно передавать временными таблицами (работают быстрее табличных переменных).
Упрощенный пример:
зы: а разбор ХМЛ все равно упрется либо в динамический СКЛ либо см. выше. :)

1) Временные таблицы как вариант указаны
2) "а разбор ХМЛ все равно упрется либо в динамический СКЛ" новое в sql xml...

автор
Списки можно передавать временными таблицами (работают быстрее табличных переменных).

уже сказали - вопрос в количестве значений
20 дек 16, 11:15    [20026060]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры с переменным количеством аргументов  [new]
o-o
Guest
LSV
И ниодного правильного ответа... :)

Произвольное кол-во мож и нельзя, но произвольное кол-во непустых параметров можно.
Списки можно передавать временными таблицами (работают быстрее табличных переменных).
Упрощенный пример:

and (@x is null or ID=@x)
and (@y is null or (ID2=@y and @x <> 0))
and exists(select * from #TTT where #TTT.id = MyTable.ID3 and @x is null)

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

зы: а разбор ХМЛ все равно упрется либо в динамический СКЛ либо см. выше. :)

кроме неправильного словесного описания
ТС привел еще и свой код.
из которого ясно видно, что у него не куча параметров,
а куча значений одного и того же параметра.
что есть не одно и то же.
поэтому как раз ваш ответ совершенно не в тему:
фильтрует он всего одно поле типа марка автомобиля,
и передавать туда хочет более одного значения, хонду и мерседес сразу
20 дек 16, 11:37    [20026211]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры с переменным количеством аргументов  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
ТС привел еще и свой код.
из которого ясно видно, что у него не куча параметров,
а куча значений одного и того же параметра.
И куча есть и список.
Дык было же сказано: для списков - времянки. Работают удобно и быстро.

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

Минус данного подхода - привязка к МССКЛ.
20 дек 16, 11:58    [20026330]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры с переменным количеством аргументов  [new]
Владислав Колосов
Member

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

а нет разницы как создавать временную таблицу - в процедуре или клиентом. Данные точно так же передавать на сервер. Ваши "времянки" не самозарождаются.
20 дек 16, 12:06    [20026373]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры с переменным количеством аргументов  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Большой минус в том, что если создавать с клиента, то клиент должен иметь прямой доступ к таблицам.
20 дек 16, 12:08    [20026378]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры с переменным количеством аргументов  [new]
PaulWist
Member

Откуда:
Сообщений: 2231
Владислав Колосов
Большой минус в том, что если создавать с клиента, то клиент должен иметь прямой доступ к таблицам.


К каким таблицам? (в какой БД?)
20 дек 16, 12:14    [20026405]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры с переменным количеством аргументов  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
Владислав Колосов
LSV,
а нет разницы как создавать временную таблицу - в процедуре или клиентом.. Данные точно так же передавать на сервер.
Если не учитывать, что иногда времянка может быть нужна в неск. разных ХП. Тогда есть разница, где создавать (внутри ХП или с клиента).

Список данных не всегда нужно передавать (с клиента) на сервер. Достаточно передать условия выборки для заполнения времянки.

Но произвольный набор ID таки надо как-то передать с клиента...
20 дек 16, 12:15    [20026412]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить