SQL服务器,使用强制转换中的变量作为数字(@变量,2)

时间:2014-10-22 17:09:23

标签: sql-server variables casting

我有一个大桌子,其中包括一列浮子(150万行),我加入一个稍小的桌子(15k行),它也有浮子,然后我乘以各种花车。

我发现使用数字而不是大表中的浮点数可以获得显着的性能提升(快10倍以上)。

麻烦是我事先不知道浮点数的大小所以我希望计算最大浮点数的长度,然后使用该信息使用声明中的变量将浮点数转换为数字,即{{ 1}}

似乎我不允许这样做(语法错误不正确)所以有替代方案吗?

下面是一些代码,显示了我想要做的事情 - 最终陈述是错误所在。

非常感谢你的帮助, 西蒙

cast(MyFloatColumn as numeric(@varInt,2))

(@ precisionofbiggest在这个例子中将是7,所以如果它有效,我会得到

CREATE TABLE dbo.MyTable
(
  MyFloatColumn float
);
GO
INSERT INTO dbo.MyTable VALUES (12345.12041);
INSERT INTO dbo.MyTable VALUES (123.1);
GO

declare @precisionofbiggest int

SELECT @precisionofbiggest = sizeofintpart + 2 
FROM   (SELECT TOP (1) Len(Cast(Cast(myfloatcolumn AS BIGINT) AS VARCHAR)) AS 
                              sizeofintpart 
        FROM   dbo.mytable 
        ORDER  BY myfloatcolumn DESC) AS atable 

SELECT cast(myfloatcolumn AS numeric(@precisionofbiggest,2)) AS anewnumericcolumn 
FROM   dbo.mytable

1 个答案:

答案 0 :(得分:1)

最后一个语句应该是动态的,以获得变量值

declare @sql nvarchar(max)

SET @sql = 'SELECT cast(myfloatcolumn AS numeric(' 
           + CONVERT(VARCHAR(20), @precisionofbiggest) 
           + ',2)) AS anewnumericcolumn      FROM   dbo.mytable' 

exec sp_executesql @sql