Чтобы 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
;