Могу ли я передать таблицу в качестве параметра при выполнении сохраненного процесса? - PullRequest
3 голосов
/ 28 октября 2009

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

Пожалуйста, помогите.

Ответы [ 3 ]

1 голос
/ 28 октября 2009

В sql server 2005, №

Вы можете использовать xmldocs или строку с разделителями-запятыми (используя функцию разделения)

CREATE FUNCTION [dbo].[SplitString]
(
        @String VARCHAR(8000) ,
        @Delimiter  VARCHAR(10)
)
RETURNS @RetTable TABLE(
        String varchar(1000)
)
AS 
BEGIN
    DECLARE @i INT ,
            @j INT
    SELECT  @i = 1
    WHILE @i <= LEN(@String)
    BEGIN
        SELECT  @j = CHARINDEX(@Delimiter, @String, @i)
        IF @j = 0
        BEGIN
            SELECT  @j = LEN(@String) + 1
        END
        INSERT  @RetTable SELECT SUBSTRING(@String, @i, @j - @i)
        SELECT  @i = @j + LEN(@Delimiter)
    END
    RETURN
END

см. Также

прохождение-листы к SQL-Server-2005-с-XML-параметров

и

начало-SQL-сервер 2005-XML-программирование

0 голосов
/ 28 октября 2009

Если вы не используете SQL Server 2008 (где вы можете использовать табличные параметры ), то вы можете получить некоторые другие идеи для обмена данными между хранимыми процедурами из замечательной статьи Эрланда:

http://www.sommarskog.se/share_data.html

Эрланд также говорит о табличных параметрах и углубляется в объяснение, почему текущая реализация (только для чтения) не достаточно хороша:

http://www.sommarskog.se/tableparam.html

0 голосов
/ 28 октября 2009

В Oracle вы можете использовать ВИДЫ и ОБЪЕКТЫ для достижения этого IIRC. Не могли бы вы использовать CURSOR / LOOP? Если причина, по которой вы это делаете, заключается в захвате динамических данных?

   CURSOR c_my_cursor IS
      SELECT * 
      FROM my_table;

BEGIN

   FOR x IN c_my_c LOOP
       IF x.employeeID IS NULL THEN
          .....
       END IF;
   END LOOP;
END;
...