evgenybe
1

Как передать список в качестве параметра процедуры?

06.03.2012, 16:01. Показов 18259. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
С Наступающим!!!
Есть вот такая Stored Procedure:
T-SQL
1
2
3
4
5
6
7
8
ALTER PROCEDURE dbo.spFileToService
            (
            @PrmIN nvarchar(400) 
            )
AS
SELECT * FROM vwFileToService 
WHERE Emp_ID In (@PrmIN)
            RETURN
Если я в параметр передаю только одно значение, например Vasia – все срабатывает.
Eсли в параметр передаю тоже самое значение, но в апострофах, например 'Vasia' – не работает.
А если мне надо передать список из 2-х или более значений, например 'Vasia', 'Kuku', 'Yoyo' – и близко не работает.

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

Можешь срочно помочь?
Спасибо!
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.03.2012, 16:01
Ответы с готовыми решениями:

Как передать в качестве параметра результат динамического запроса?
Здравствуйте! есть процедура: ALTER PROCEDURE @SourceTable nvarchar(100) ...

Как в качестве параметра запроса передать значение переменной?
Запрос типа SELECT TOP 10 * FROM TABLENAMEКак в качестве параметра 10 передать значение...

передать таблицу значений в качестве параметра в динамический список на упр форме
Добрый день всем, как передать таблицу значений для выборки из неё значения в динамический список...

Как передать функцию в качестве параметра?
Помгите плиз, не получается передать одну функцию как параметр другой я пробовал так: в...

7
Silver
06.03.2012, 17:57 2
По-моему так нельзя сделать.
Но может свалить список во временную таблицу, а
в процедуре брать данные из неё?
Я бы так сделал.
85 / 61 / 69
Регистрация: 15.03.2007
Сообщений: 6,906
06.03.2012, 18:37 3
Решаемая задача

Пишем код который разбирает строку на части и вставляет их во временную таблицу. Для удобства можно это оформить в виде пользовательской функции. Вот пример разбора строки чисел разделенных запятыми. Не составит большого труда переделать ее для работы со строками.
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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
Использовать можно будет примерно так
T-SQL
1
SELECT * FROM someTable WHERE Emp_ID In (SELECT iID FROM dbo.fn_splitIDstring_tbl(@PrmIN))
То есть к результату такой функции можно применять обычные операторы SQL.
0
evgenybe
07.03.2012, 13:23 4
Спасибо от всей души!
С наступающим Новым Годом!
Всем счастья, здоровья и успехов во всем!
Silver
07.03.2012, 13:48 5
Ну если идти этим путем, то тогда уж проще так:
T-SQL
1
2
3
4
5
6
7
8
9
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
85 / 61 / 69
Регистрация: 15.03.2007
Сообщений: 6,906
07.03.2012, 13:54 6
Это тоже выход. Но использование динамического sql неэффективно так как sql server не сможет план запроса заранее построить. Кроме того лично мне решение с пользовательской функцией кажется более гибким в плане повторного использования.
0
Silver
07.03.2012, 14:32 7
Следует учитывать, что вариант с пользовательскими функциями не будет работать в SQL 7.0.
85 / 61 / 69
Регистрация: 15.03.2007
Сообщений: 6,906
07.03.2012, 16:30 8
Им кто-то еще пользуется?

А если серьезно, то на SQL 7 можно переписать пользовательскую функцию в хранимую процедуру работающую через временную таблицу.
0
07.03.2012, 16:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.03.2012, 16:30
Помогаю со студенческими работами здесь

Как передать коллекцию в качестве параметра ?
Как передать коллекцию в качестве параметра, при условии что тип коллекции должен быть произвольным...

Как передать функцию в качестве параметра?
Как передать функцию в качестве параметра?

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

Как передать итератор в качестве параметра функции?
хочу вызвать функцию как-то так: show_string(std::cout, line.begin(), line.end()); в качестве...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru