在SSMS中执行名为[s_sspCallSharePointWebService]
的存储过程后,我得到了返回的数据
DECLARE @sWebAddr AS NVARCHAR(MAX),
@bAPISuccess AS NVARCHAR(10),
@objSharePointXML AS XML
SET @sWebAddr = 'http://...'
EXEC [s_sspCallSharePointWebService] @sWebAddr, @bAPISuccess OUTPUT, @objSharePointXML OUTPUT
我想知道如何保存 变量中的数据,而不是返回下面的表。
---------------------------------------
| (No column name) | (No column name) |
---------------------------------------
| True | <XMLRoot>.... |
---------------------------------------
此外,由于在EXEC sp_OAGetProperty @objecttoken, 'responseText'
中有[s_sspCallSharePointWebService]
的结果,然后已经将响应文本插入到临时表中,因此无法在此处将数据插入临时表中。
那会导致错误:
不能嵌套INSERT EXEC语句
答案 0 :(得分:0)
(对我来说)这很丑陋,但这可以使用临时表来完成。临时表对当前作用域中的所有例程可见。
因此,您可以像这样嵌套:
EXEC SP1
...
EXEC SP2
...
EXEC SP3
...
假设EXEC SP2
返回执行SELECT
语句的行集。那么,问题是如何实现它?
CREATE PROCEDURE dbo.SP1
AS
BEGIN;
SELECT 'SP1' AS [Caller];
EXEC dbo.SP2;
END;
GO
CREATE PROCEDURE dbo.SP2
AS
BEGIN;
SELECT 'SP2' AS [Caller];
INSERT INTO #TEST
SELECT 1;
END;
GO
CREATE TABLE #TEST
(
[ID] INT
);
EXEC dbo.SP1;
SELECT *
FROM #TEST;
此想法是在外部范围内创建临时表,并执行该过程以确保已创建此表并填充该表。然后,使用初始调用方中的表。
对我来说这很丑陋,因为如果未定义此表,则例程将导致错误:
消息208,级别16,状态0,过程dbo.SP2,行8 [批处理开始 第0行]无效的对象名称“ #TEST”。
,在某些情况下可能很难调试。
答案 1 :(得分:0)
您可以只使用一个表变量,然后从中进行SELECT分配,而不是这样做。这是一个带有简单proc并返回一行的示例:
USE tempdb;
GO
CREATE OR ALTER PROC dbo.ReturnsOneRow
AS
BEGIN
SELECT 1 AS FirstColumn, 'Hello' AS SecondColumn, 4 AS ThirdColumn;
END;
GO
EXEC dbo.ReturnsOneRow;
GO
DECLARE @FirstColumn int;
DECLARE @SecondColumn varchar(20);
DECLARE @ThirdColumn int;
DECLARE @Row TABLE
(
FirstColumn int,
SecondColumn varchar(20),
ThirdColumn int
);
INSERT @Row
(
FirstColumn, SecondColumn, ThirdColumn
)
EXEC dbo.ReturnsOneRow;
SELECT TOP(1) @FirstColumn = r.FirstColumn,
@SecondColumn = r.SecondColumn,
@ThirdColumn = r.ThirdColumn
FROM @Row AS r;
-- Check the values
SELECT @FirstColumn, @SecondColumn, @ThirdColumn;
在这种情况下,表变量将比临时表好得多,并且您在其他位置的可见性也没有问题,也不必清理它(批处理结束时就没有了)。