Как выбрать значения из временной таблицы и передать их в качестве параметра в SP - PullRequest
0 голосов
/ 28 марта 2012

У меня есть SelectSP, который возвращает набор результатов, который я храню во временной таблице.Теперь я хочу вызвать другой SP с именем InsertSP и передать значения из этой временной таблицы в качестве параметра для него.

Вот код, который у меня есть:

CREATE TABLE #tempTable
(
    Field1 VARCHAR(255),
    Field2 VARCHAR(255),
    Field3 VARCHAR(255),
    Field4 VARCHAR(255),
    Field5 VARCHAR(255),
    Field6 VARCHAR(255),
    Field7 VARCHAR(255)
        .
        .
        .

)

INSERT INTO #tempTable exec 
usp_SelectSP 'p1' ,'p2', 'p3'

Теперь я хочувыполнить еще один SP и передать Field1, Field2, Field3 tempTable в качестве параметра этому SP.

Я думал что-то вроде этого

usp_InsertSP
  @param1 = Field1
  @Param2 = Field2
  @Param3 = Field3

FROM #tempTable.

Каков наилучший способ сделать это?

Ответы [ 2 ]

2 голосов
/ 28 марта 2012

Если вы не можете изменить вызываемый SP, то, вероятно, проще всего будет использовать курсор:

DECLARE @f1 VARCHAR(255), @f2 VARCHAR(255) --, ...

DECLARE c CURSOR 
  LOCAL STATIC READ_ONLY FORWARD_ONLY
  FOR SELECT Field1, Field2 --, ...
    FROM #tempTable;

OPEN c;

FETCH NEXT FROM c INTO @f1, @f2 --, ...

WHILE @@FETCH_STATUS <> -1
BEGIN
  EXEC usp_InsertSP
    @param1 = @f1,
    @param2 = @f2 --, ...

  FETCH NEXT FROM c INTO @f1, @f2 --, ...
END

CLOSE c;
DEALLOCATE c;

Однако я настоятельно рекомендую изменить вызываемую процедуру.Существует почти абсолютно более эффективный способ работы с данными в этой таблице #temp, если вы можете изменить вызываемую процедуру для ее непосредственного использования.

EDIT

Демонстрациячто вызываемый процесс может видеть таблицу #temp, созданную вызывающей стороной.

CREATE PROCEDURE dbo.proc1
AS
BEGIN
    SET NOCOUNT ON;

    CREATE TABLE #t1(a INT);

    INSERT #t1 SELECT 1 UNION SELECT 2;

    EXEC dbo.proc2;

    DROP TABLE #t1;
END
GO

CREATE PROCEDURE dbo.proc2
AS
BEGIN
    SET NOCOUNT ON;

    SELECT a FROM #t1;
END
GO

EXEC dbo.proc1;

Результаты:

a
-
1
2
1 голос
/ 28 марта 2012

ПРОСТО РАЗДЕЛИТЕ СТОЛ #TEMP !!!

Вам нужно прочитать Как обмениваться данными между хранимыми процедурами от Erland Sommarskog

Все таблицы #temp, созданные в родительской хранимой процедуре, доступны для всех вложенных вызываемых процедур, см. Совместное использование временной таблицы из статьи, указанной выше

из статьи:

The method itself is as simple as this:

CREATE PROCEDURE called_procedure @par1 int,
                                  @par2 bit,
                                  ... AS
   ...
   INSERT/UPDATE/DELETE #tmp
go
CREATE PROCEDURE caller AS
   DECLARE ...
   CREATE TABLE #mytemp (col1 int     NOT NULL,
                         col2 char(5) NULL,
                        ...)
   ...
   EXEC called_procedure @par1, @par2 ...
   SELECT * FROM #mytemp
go
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...