.net 为什么查询的列类型会根据其值而变化?

.net 为什么查询的列类型会根据其值而变化?,.net,sql-server,tsql,sql-server-2008-r2,.net,Sql Server,Tsql,Sql Server 2008 R2,我有一个存储函数,用于计算价格并以浮点形式返回: ALTER FUNCTION [dbo].[product_get_GrossPrice] (@pid INTEGER) RETURNS FLOAT AS BEGIN DECLARE @ret AS FLOAT SELECT @ret = (ROUND((price * (CAST(1 AS FLOAT) + (CAST(ISNULL(tax, 0) AS FLOAT) / CAST(100 AS FLOAT

我有一个存储函数,用于计算价格并以浮点形式返回:

ALTER FUNCTION [dbo].[product_get_GrossPrice] (@pid INTEGER) 
RETURNS FLOAT
AS BEGIN
    DECLARE @ret AS FLOAT 

    SELECT
        @ret = (ROUND((price * (CAST(1 AS FLOAT) + (CAST(ISNULL(tax, 0) AS FLOAT) / CAST(100 AS FLOAT)))), 0))
    FROM
        products
    WHERE
        id = @pid

    RETURN @ret
END
此函数用于以下查询:

SELECT
    p.*, dbo.product_get_GrossPrice(p.id) as gross_price
FROM 
    products
ORDER BY 
    id
在web服务器上,以下代码用于读取“总价”列:

我以前从未遇到过这个问题,它让我的胃有一种奇怪的感觉


问题:这里发生了什么?我是否必须将每一列强制转换为其所需的数据类型,以确保强制转换不会中断?

我怀疑问题出在您未向我们展示的代码中-任何特定查询都应始终生成具有固定形状的结果集-列的数量、名称和类型。你能创建一个演示这个问题的视图吗?@Damien_the_unsiever:为了简单起见,我删除的唯一一件事是将查询存储为视图。这会有所不同吗?请提供一些显示这种行为的示例数据。好的,不要丢失太多SQL代码。但在我们将变量dataRow分配给数据库中有用的东西之前,肯定有相当多的代码。不要认为问题出在SQL端而不是C端。运行此查询以检查类型视图列:选择v.name、v.schema\u id、C.name、C.column\u id、C.system\u type\u id,来自sys.views的t.name作为v internal JOIN sys.columns作为c在v.object\u id=c.object\u id内部JOIN sys.types作为t在c.system\u type\u id=t.system\u type\u id,其中v.name=“[您的视图名称]”
double? grossPrice = dataRow.Field<double?>("gross_price");
select p.*, cast(dbo.product_get_GrossPrice(p.id) as float) as gross_price
from products
order by id