|
|
|
Supreme 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' – и близко не работает.
Моя цель – передать в процедуру параметр, содержащий список и выбрать из таблицы все соответствующее списку (конечно, если в таблице таковое присутствует).
Как это сделать?
Можешь срочно помочь?
Спасибо!
Спасибо! Евгений Боуден
|
|
|
|
|
Supreme Being
      
участник
Last Login: 27.03.2008 15:26
Сообщ.: 701,
Visits: 7 028
|
|
По-моему так нельзя сделать.
Но может свалить список во временную таблицу, а
в процедуре брать данные из неё?
Я бы так сделал.
|
|
|
|
|
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.
|
|
|
|
|
Supreme Being
      
участник
Last Login: 19.10.2008 12:14
Сообщ.: 693,
Visits: 7 081
|
|
Спасибо от всей души!
С наступающим Новым Годом!
Всем счастья, здоровья и успехов во всем!
Спасибо! Евгений Боуден
|
|
|
|
|
Supreme 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
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
| Это тоже выход. Но использование динамического sql неэффективно так как sql server не сможет план запроса заранее построить. Кроме того лично мне решение с пользовательской функцией кажется более гибким в плане повторного использования.
|
|
|
|
|
Supreme Being
      
участник
Last Login: 27.03.2008 15:26
Сообщ.: 701,
Visits: 7 028
|
|
Следует учитывать, что вариант с пользовательскими функциями не будет работать в SQL 7.0.
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
Им кто-то еще пользуется? ;)
А если серьезно, то на SQL 7 можно переписать пользовательскую функцию в хранимую процедуру работающую через временную таблицу.
|
|
|
|