表变量问题的存储过程

时间:2009-07-24 17:00:18

标签: sql sql-server stored-procedures

我要做的是从存储过程中获取结果并将它们放入临时表...

看起来像这样:

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,它将一个值写入临时表,与上面相同,也许你可以嵌套存储过程写入的级别数有一些限制临时表?

2 个答案:

答案 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')

显示返回的确切内容(用返回的列值替换“cast(12345.6789 AS decimal(9,4)”)。只需从存储过程输出这些值并使表的列匹配,然后给出试一试。

答案 1 :(得分:0)

我找到了一个解决方法,我更改了所需的存储过程以返回标量输出而不是数据集......不是我想要的,而是意味着结束!