Как вставить указанные столбцы из хранимой процедуры в #tempTable - PullRequest
0 голосов
/ 10 января 2020

Все примеры, когда нужно вставить данные из хранимой процедуры, делают так:

INSERT INTO #tempTable
EXEC storedProcedureName @parameter1

Боюсь, что то, что я хочу, невозможно ... псевдокод ниже того, что я ' м после. Я хочу включить с моей Вставкой в ​​TempTable параметры, которые я использовал при вызове хранимой процедуры. Было бы также неплохо, если бы у меня была возможность НЕ вставлять ВСЕ столбцы, возвращаемые хранимой процедурой:

INSERT INTO #tempTable (sp_column1, sp_column2, @parameter1)
    EXEC storedProcedureName @parameter1 (column1, column2)

Или, возможно, это выглядело бы так при использовании ключевого слова VALUES:

INSERT INTO #tempTable (sp_column1, sp_column2, @parameter1)
    EXEC storedProcedureName @parameter1 VALUES (column1, column2)

1 Ответ

0 голосов
/ 11 января 2020

Чтобы INSERT из хранимой процедуры и добавить / удалить столбцы, возвращенные из этой хранимой процедуры, мне нужно было использовать две временные таблицы. Невозможно добавить или выбрать столбцы в INSERT при выполнении из хранимой процедуры.

Код объяснил

Я хотел создать обобщенный пример функционирования c, имитирующий использование хранимой процедуры. Единственная разница в этом коде и моем рабочем коде - это смоделированные данные, которые я использую вместо своей хранимой процедуры. Мне удалось это с помощью временной таблицы, которую я назвал #StoredProc, и я вставил в нее некоторые поддельные данные с идентификаторами.

1: Первая временная таблица, использованная для фактического подтверждения концепции и для тестирование называется #Report. Он используется для хранения столбцов по умолчанию, возвращаемых хранимой процедурой. Эти столбцы ДОЛЖНЫ совпадать точно с 1 по 1, что отчасти является проблемой, с которой я столкнулся. Хранимая процедура принимает в качестве параметра FieldID, однако возвращенный набор результатов НЕ включает FieldID или любые другие идентификаторы. Вот откуда возникла моя проблема, поскольку я хотел сохранить во временной таблице оба результата вместе с любыми параметрами, которые я использовал для получения этих данных.

2: Вторая временная таблица #ReportwithID используется для хранения данных из временной таблицы #Report. Когда данные перемещаются в временную таблицу #ReportwithID, я могу включить параметры. При вставке в таблицу #ReportwithID я включаю параметр FieldID, который хранится внутри переменной @ReportID внутри курсора, пока l oop. После этого у меня наконец-то есть данные, которые я извлекаю из хранимой процедуры вместе с любыми другими столбцами, которые я хочу записать ... в этом случае я хочу увидеть каждую возвращенную запись вместе с параметрами, которые получили эти данные.

Последнее: , когда курсор в то время, как l oop завершил цикл по всем идентификаторам и сохранил данные во временной таблице #ReportwithID I SELECT * данных из него, поэтому я можете просмотреть его.

Блок кода ниже можно запустить в любой SQL базе данных сервера, если у вас есть все необходимые разрешения для этого, например, создание временных таблиц ... et c.

/* --- BEGIN Create fake data to simulate the data being pulled back by a stored procedure --- */
DROP TABLE IF EXISTS #StoredProc;

CREATE TABLE #StoredProc
(
    fieldID INT,
    fName   VARCHAR(200),
    lName   VARCHAR(50),
);
GO

INSERT INTO #StoredProc
    SELECT 1 AS fieldID, 'Jimmy'      AS fName, 'Fallon'   AS lName UNION ALL
    SELECT 2 AS fieldID, 'Jason'      AS fName, 'Fick'     AS lName UNION ALL
    SELECT 3 AS fieldID, 'Dilly'      AS fName, 'Dally'    AS lName UNION ALL
    SELECT 4 AS fieldID, 'Jim'        AS fName, 'Jacko'    AS lName UNION ALL
    SELECT 5 AS fieldID, 'Brina'      AS fName, 'Burton'   AS lName UNION ALL
    SELECT 6 AS fieldID, 'Tim'        AS fName, 'McMally'  AS lName UNION ALL
    SELECT 7 AS fieldID, 'Sam'        AS fName, 'Bateman'  AS lName UNION ALL
    SELECT 8 AS fieldID, 'Nelly'      AS fName, 'Newsome'  AS lName UNION ALL
    SELECT 9 AS fieldID, 'J-Schwilly' AS fName, 'McNilly'  AS lName
GO
/* --- END Creating Fake stored procedure data --- */

/* If the temp tables exists we want to remove it before we start inserting records. */
DROP TABLE IF EXISTS #Report;
DROP TABLE IF EXISTS #ReportwithID;

/* Stored procedure Physician Report Fields for Temp Table */
CREATE TABLE #Report
(
    fName VARCHAR(200),
    lName VARCHAR(50),
);

/* Stored procedure Physician Report Fields for Temp Table */
CREATE TABLE #ReportwithID
(
    fieldID INT,
    fName   VARCHAR(200),
    lName   VARCHAR(50),
);

/* Turns Off the Servers return of the Rows affected back to the Client */
SET NOCOUNT ON;

/* --- CURSOR STUFF --- */
/* Declare Variables to store data retrieved back from the Cursor */
DECLARE @RecordID   INT;

/* Declare Cursor */
DECLARE cur_FakeReportData CURSOR LOCAL STATIC FORWARD_ONLY READ_ONLY --In order to make my cursors as efficient as possible, Use the following declarations
FOR /* Build up Fake IDs to Loop Over */
    SELECT 1 AS fieldID UNION ALL
    SELECT 2 AS fieldID UNION ALL
    SELECT 3 AS fieldID UNION ALL
    SELECT 4 AS fieldID UNION ALL
    SELECT 5 AS fieldID UNION ALL
    SELECT 6 AS fieldID UNION ALL
    SELECT 7 AS fieldID UNION ALL
    SELECT 8 AS fieldID UNION ALL
    SELECT 9 AS fieldID
;

/* When we are ready to use the Cursor we must first OPEN it */
OPEN cur_FakeReportData;

/* Fetch a row from the cursor into one or more variables */
FETCH NEXT FROM cur_FakeReportData INTO @RecordID;

PRINT 'Fetch_Status: ' + CAST(@@FETCH_STATUS AS Varchar);

/* While Loop: If the Previous Fetch Was successful enter the Loop.
 |  0   The FETCH statement was successful.
 | -1   The FETCH statement failed or the row was beyond the result set.
 | -2   The row fetched is missing.
 | -9   The cursor is not performing a fetch operation.
*/
WHILE @@FETCH_STATUS = 0

    BEGIN
        BEGIN TRY
            PRINT(@RecordID);
            INSERT INTO #Report
            --EXEC report.Report @RecordID;
            SELECT fName, lName FROM #StoredProc WHERE fieldID = @RecordID; /* Simulating pulling data from a STORED Proc */

            INSERT INTO #ReportwithID
            SELECT @RecordID AS fieldID, r.*
            FROM #Report r;

            DELETE FROM #Report;

        END TRY
        BEGIN CATCH
            SELECT  
                  ERROR_NUMBER()    AS ErrorNumber  
                , ERROR_SEVERITY()  AS ErrorSeverity  
                , ERROR_STATE()     AS ErrorState  
                , ERROR_PROCEDURE() AS ErrorProcedure  
                , ERROR_LINE()      AS ErrorLine  
                , ERROR_MESSAGE()   AS ErrorMessage
                , @RecordID         AS RecordID;
        END CATCH

        /* FETCH NEXT Record FROM Cursor */
        FETCH NEXT FROM cur_FakeReportData INTO @RecordID;
    END
;

PRINT 'Fetch_Status: ' + CAST(@@FETCH_STATUS AS Varchar) +' Rows: '+ CAST(@@CURSOR_ROWS AS Varchar)

/* Use the below to View status of ALL Cursors by Session ID */
--SELECT * FROM sys.dm_exec_cursors(@@SPID) -- Use 0 to view ALL Sessions

/* When you are done with the Cursor be sure to CLOSE it */
CLOSE cur_FakeReportData;
/* Deallocate the cursor to release it from memory. */
DEALlOCATE cur_FakeReportData;

--SELECT * FROM #Report;

SELECT *
FROM #ReportwithID
;
...