2009-07-24 42 views
1

我试图做的是采取从存储过程的结果,并把它们放到一个临时表...存储过程,以表变量问题

是这样的:

DECLARE @Table TABLE(
[ID] int, 
[CostA] real, 
[CostB] real, 
[CostC] real 
) 

INSERT INTO @Table 
EXECUTE [dbo].[CostProcedure] 
     @RootId = 123 
     @Rate = 20 

--THEN: 
SELECT * FROM @Table  -- Gives Me: 

ID  CostA CostB CostC 
10  0  0  0 

-- HOWEVER 
EXECUTE [dbo].[CostProcedure] 
     @RootId = 123 
     @Rate = 20 

--GIVES ME 
ID  CostA CostB CostC 
10  1.0987 0.9837 0.65463 

所以我的问题是,由于存储过程显然返回正确的结果,为什么当我将它们插入到表变量中时,它只插入结果的第一列,并在后续列上给出全零?有没有这个我不知道的一些已知问题?我甚至尝试:

INSERT INTO @Table([ID],[CostA],[CostB],[CostC]) 
EXECUTE [dbo].[CostProcedure] 
      @RootId = 123 
      @Rate = 20 

它得到相同的结果...
我甚至尝试倒退,并试图临时表(创建表#whatever)......还是一样的结果......什么我错过了吗?

我只是想知道...如果CostProcedure里面有一个StoredProcedure,它将一个值写入临时表,就像上面一样,也许在存储过程的写入级别上有一些限制到临时表?

+0

这是我的一个铸造问题吗?存储过程结果集中列的数据类型是什么? – MyItchyChin 2009-07-24 17:44:24

+1

我确定这不是问题,但@RootId = 123之后不应该有逗号? – devuxer 2009-07-24 17:51:08

回答

0

我找到了解决方法,我更改了所需的存储过程,以返回标量输出而不是数据集。 ..不是我想要的,而是达到目的!

2

那里可能有一个奇怪的数据转换问题。存储过程是否返回像表一样定义的REAL,或者它们是NUMERIC还是其他?

确保数据类型一致。

,你可以在存储过程中使用这样的事情做一些测试:

SELECT SQL_VARIANT_PROPERTY(cast(12345.6789 AS decimal(9,4))+cast(5.678912 AS decimal(9,6)), 'BaseType') 
SELECT SQL_VARIANT_PROPERTY(cast(12345.6789 AS decimal(9,4))+cast(5.678912 AS decimal(9,6)), 'Precision') 
SELECT SQL_VARIANT_PROPERTY(cast(12345.6789 AS decimal(9,4))+cast(5.678912 AS decimal(9,6)), 'Scale') 

告诉你到底是返回什么(更换“剧组(12345.6789为十进制(9,4)”与您返回的列值),只是从存储过程中输出这些值,并使表中的列匹配,然后再试一试