为了从存储过程中INSERT 并添加/删除从该存储过程返回的列,我需要使用两个临时表。从存储过程执行时,无法向INSERT 添加或选择列。
代码解释
我想创建一个通用功能示例来模拟存储过程的使用。这段代码和我的生产代码的唯一区别是我用模拟数据代替了我的存储过程。我使用一个名为#StoredProc 的临时表来管理它,并在其中插入了一些带有 ID 的假数据。
1:用于实际概念验证和测试的第一个临时表称为#Report。它用于存储存储过程返回的默认列。这些列必须完全匹配 1 到 1,这部分是我面临的问题。存储过程将FieldID 作为其参数,但是返回的结果集不包括FieldID 或任何其他ID。这就是我最初的问题所在,因为我想将结果以及用于获取该数据的任何参数都存储在我的临时表中。
2: 第二个临时表#ReportwithID 用于存储来自#Report 临时表的数据。当数据移动到#ReportwithID 临时表时,我可以包含参数。当插入#ReportwithID 表时,我将FieldID 参数包含在游标while 循环内的@ReportID 变量中。有了这个,我终于有了从存储过程中提取的数据以及我想要捕获的任何其他列......在这种情况下,我希望查看每个返回的记录以及获取此数据的参数。
最后:当光标 while 循环完成遍历所有 ID 并将数据存储到 #ReportwithID 临时表中时,我将 SELECT * 的数据从中取出,以便我可以查看它。
下面的代码块可以在任何 SQL Server 数据库中运行,前提是您拥有执行此操作的所有适当权限,例如创建临时表...等。
/* --- 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
;