我有一个可以正常工作的存储过程,但它里面有三个“select”s。
选择不是来自内部临时表。
这主要是程序的格式:
ALTER PROCEDURE [dbo].[STProce]
@param1 int,
@param2 int,
@param3 int,
@param4 int,
@param5 int
AS
select @param1 as p1, @param2 as p2, @param3 as p3
.
.
.
select @param4 as p4
.
.
.
select @param5 as p5
我正在从另一个程序执行该程序,需要在那里捕获它。
我创建了一个表,并在其中插入了程序中的“exec”,如下所示:
CREATE TABLE #stalledp
(
RowNumber INT,
fldid INT,
fldLastUpdated datetime,
fldCreationDate datetime,
fldName nvarchar(255),
fldPending nvarchar(255)
)
INSERT INTO #stalledp (RowNumber,fldid,fldLastUpdated,fldCreationDate,fldName,fldPending)
EXEC spDebuggerViews_GetStuckWorkflowInstances @workflowSpaceId='00000000-0000-0000-0000-000000000000',@pageNum=1,@pageSize=100000,@orderByColumn=N'fldid',@sortOrder=1,@workflowInstanceId=0,@stuckInstanceType=1,@createdDateFrom='1900-01-01 00:00:00',@createdDateTo='9999-01-01 23:59:59',@updatedDateFrom='1900-01-01 00:00:00',@updatedDateTo='9999-01-01 23:59:59'
之后我收到此错误:
Column name or number of supplied values does not match table definition.
表的列的顺序和名称与过程返回的完全相同。
是否有可能仅捕获该过程返回的一个表并避免另一个表?我根本无法改变程序。
我尝试声明一个表与第一个选择的程序相同的字段,我得到一个错误说
提前谢谢!
答案 0 :(得分:-1)
有一种方法可以获得第一套记录,但其他人,我担心,你运气不好。
EXEC sp_addlinkedserver @server = 'LOCALSERVER', @srvproduct = '',
@provider = 'SQLOLEDB', @datasrc = @@servername
SELECT * FROM OPENQUERY(LOCALSERVER, 'EXEC testproc2')
编辑:如果您只需要检查列的其他结果集是否为null,则可以预定义预期结果集,如下所示:
EXEC testproc2 WITH RESULT SETS (
(a VARCHAR(MAX) NOT NULL, b VARCHAR(MAX) NOT NULL),
(a VARCHAR(MAX) NOT NULL)
);
如果存储过程中的查询返回空值,则会在过程中的该点引发异常。这只适用于sql server 2012及更高版本。