我需要将存储过程的结果集存储在临时表中(使用SQL Server 2000)。从我所读到的,这个(构造不良的例子)应该起作用:
create table #tempTable (TempId int primary key, Column1 varchar(100),
Column2 varchar(100), DateCreated datetime)
insert into #tempTable (TempId, Column1, Column2, DateCreated)
exec sproc_Select_Stuff_By_DateCreated @Date1 = '1/1/2009', @Date2 = '1/2/2009'
但我明白了: “插入错误:列名或提供的值数与表定义不匹配。”
检查程序(我无法编辑)显示:
CREATE PROCEDURE sproc_Select_Stuff_By_DateCreated
@Date1 datetime,
@Date2 datetime
AS
BEGIN
SELECT TempId, Column1, Column2, DateCreated
FROM ReallyHugeMessOfJoinsAndCalculatedColumns
WHERE DateCreated between @Date1 and @Date2
SELECT @Date1 as Date1, @Date2 as Date2
END
所以它实际上回显了作为第二个结果集传递给它的参数。 (我不明白为什么;我认为任何调用该过程的东西都会知道它传入了什么数据。)
我的测试让我认为第二个结果集导致插入失败 - 就像SQL试图将结果集合并在一起并失败。
我只需要保存到临时表的第一个结果集。我怎么能这样做?
修改
感谢您指出CLR存储过程,但该功能是在SQL 2005中引入的 - 它不适用于2000.(但我以前没有意识到它们,看起来它们对我们来说会很有用升级。)
因为唯一的其他答案看起来是“你不能” - 我想它会回到我的绘图板上。
答案 0 :(得分:2)
因为您无法更改存储过程,所以只有两个选项:
答案 1 :(得分:1)
通常,在纯SQL中这是不可能的。 Brannon的链接使用CLR提供了一种可能的解决方法。
另一方面,如果重新分解是一个选项,请考虑在其自己的存储过程中使第一个查询成为原子。然后可以从现有存储过程和任何其他代码调用它。您的代码仍然只在一个地方,没有任何内容被破坏,并且您可以从纯SQL中更容易地使用它。根据其功能,SP的第一部分甚至可能是内联表值函数的良好候选者(我发现这些函数具有良好的性能和灵活性)。然后你甚至不需要将输出捕获到临时表中,以便在进行其他处理时将其用作表格(尽管如果你想多次使用它,你可能想要这样做)! p>
答案 2 :(得分:0)
以下是您正在讨论的完整,有效(针对SQL 2005)的示例。
坏消息是,我不相信有任何办法可以做你想做的事情。抱歉。看起来SP作家让它变得不可能。
如果有人提出一些创造性的方法来完成这项工作,那太好了!
IF OBJECT_ID('tempdb..#tempTable') IS NOT NULL
DROP TABLE #tempTable
GO
IF EXISTS (SELECT * FROM sys.procedures WHERE name = 'sproc_Select_Stuff_By_DateCreated')
DROP PROCEDURE dbo.sproc_Select_Stuff_By_DateCreated
GO
CREATE PROCEDURE dbo.sproc_Select_Stuff_By_DateCreated
@Date1 datetime,
@Date2 datetime
AS BEGIN
;WITH t AS (
SELECT
1 AS TempId,
'Column1-val1' AS Column1,
'Column2-val1' AS Column2,
'2009-01-01 10:00:00' AS DateCreated
UNION ALL
SELECT
2,
'Column1-val2',
'Column2-val2',
'2009-01-01 11:00:00'
)
SELECT
TempId,
Column1,
Column2,
DateCreated
FROM t -- ReallyHugeMessOfJoinsAndCalculatedColumns
WHERE DateCreated between @Date1 and @Date2
SELECT @Date1 as Date1, @Date2 as Date2
END
GO
create table #tempTable (
TempId int primary key,
Column1 varchar(100),
Column2 varchar(100),
DateCreated datetime
)
insert into #tempTable (TempId, Column1, Column2, DateCreated)
exec dbo.sproc_Select_Stuff_By_DateCreated
@Date1 = '1/1/2009',
@Date2 = '1/2/2009'
--SELECT * FROM #tempTable
----------------------------------------
Msg 213, Level 16, State 7, Procedure sproc_Select_Stuff_By_DateCreated, Line 26
Insert Error: Column name or number of supplied values does not match table definition.
答案 3 :(得分:-1)
INSERT EmployeeSales
EXECUTE uspGetEmployeeSales;
GO