Как передать список в качестве параметра процедуры?
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Как передать список в качестве параметра... Expand / Collapse
Автор
Сообщение
28.12.2005 15:24
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 19.10.2008 12:14
Сообщ.: 693, Visits: 7 081
С Наступающим!!!
Есть вот такая Stored Procedure:
ALTER PROCEDURE dbo.spFileToService
(
@PrmIN nvarchar(400)
)
AS
SELECT * FROM vwFileToService
WHERE Emp_ID In (@PrmIN)
RETURN

Если я в параметр передаю только одно значение, например Vasia – все срабатывает.
Eсли в параметр передаю тоже самое значение, но в апострофах, например 'Vasia' – не работает.
А если мне надо передать список из 2-х или более значений, например 'Vasia', 'Kuku', 'Yoyo' – и близко не работает.

Моя цель – передать в процедуру параметр, содержащий список и выбрать из таблицы все соответствующее списку (конечно, если в таблице таковое присутствует).
Как это сделать?

Можешь срочно помочь?
Спасибо!


Спасибо!
Евгений Боуден
Сообщ. #887890
28.12.2005 17:20


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 27.03.2008 15:26
Сообщ.: 701, Visits: 7 028
По-моему так нельзя сделать.
Но может свалить список во временную таблицу, а
в процедуре брать данные из неё?
Я бы так сделал.
Сообщ. #887900
28.12.2005 18:00
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
Решаемая задача :)

Пишем код который разбирает строку на части и вставляет их во временную таблицу. Для удобства можно это оформить в виде пользовательской функции. Вот пример разбора строки чисел разделенных запятыми. Не составит большого труда переделать ее для работы со строками.

CREATE FUNCTION [dbo].[fn_splitIDstring_tbl] (
@sIDs AS varchar (8000),
@separator AS char(1) = ','
)
RETURNS @IDsTable TABLE (iID decimal (10,0), iOrder int)
AS
BEGIN

DECLARE @strlen int
DECLARE @curPos int
DECLARE @nextPos int
DECLARE @a_id decimal (10, 0)
DECLARE @a_order int

SET @sIDs = REPLACE(@sIDs, ' ', '')
SET @strlen = LEN (@sIDs)
SET @curPos = 0
SET @a_order = 1

WHILE @curPos <= @strlen
BEGIN
SET @nextPos = CHARINDEX (@separator, @sIDs, @curPos)
IF @nextPos = 0 SET @nextPos = @strlen + 1
SET @a_id = CAST ( SUBSTRING (@sIDs, @curPos, @nextPos - @curPos) AS decimal (10,0))

INSERT @IDsTable VALUES (@a_id, @a_order)

SET @curPos = @nextPos + 1
SET @a_order = @a_order + 1
END

RETURN
END


Использовать можно будет примерно так
SELECT * FROM someTable WHERE Emp_ID In (SELECT iID FROM dbo.fn_splitIDstring_tbl(@PrmIN))

То есть к результату такой функции можно применять обычные операторы SQL.
Сообщ. #887909
29.12.2005 12:46
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 19.10.2008 12:14
Сообщ.: 693, Visits: 7 081
Спасибо от всей души!
С наступающим Новым Годом!
Всем счастья, здоровья и успехов во всем!


Спасибо!
Евгений Боуден
Сообщ. #887946
29.12.2005 13:11


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 27.03.2008 15:26
Сообщ.: 701, Visits: 7 028
Ну если идти этим путем, то тогда уж проще так:

ALTER PROCEDURE dbo.spFileToService
(
@PrmIN nvarchar(400)
)
AS
DECLARE @sql as nvarchar(500)
SELECT @sql = "SELECT * FROM vwFileToService WHERE Emp_ID In (" + @PrmIN + ")"
exec(@sql)
RETURN
Сообщ. #887949
29.12.2005 13:17
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
Это тоже выход. Но использование динамического sql неэффективно так как sql server не сможет план запроса заранее построить. Кроме того лично мне решение с пользовательской функцией кажется более гибким в плане повторного использования.
Сообщ. #887950
29.12.2005 13:55


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 27.03.2008 15:26
Сообщ.: 701, Visits: 7 028
Следует учитывать, что вариант с пользовательскими функциями не будет работать в SQL 7.0.
Сообщ. #887955
29.12.2005 15:53
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
Им кто-то еще пользуется? ;)

А если серьезно, то на SQL 7 можно переписать пользовательскую функцию в хранимую процедуру работающую через временную таблицу.
Сообщ. #887968
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl, Alexey Spirin