我需要的东西是
的逻辑等价物select cast(* as numeric IF data_type='decimal') from table_name
我不知道该怎么做,所以我试图将其分为两步:
select * from table_name where data_type!='decimal'
select cast(* as numeric) from table_name where data_type='decimal'
但我意识到我也不知道该怎么做。由于SO,我可以找到十进制的列名列表,但由于这是一个批处理过程,我无法将其拆分为两个步骤
我正在尝试做什么?我只想获得一组列,但如果它们是十进制的,则将它们转换为double。
谢谢!
答案 0 :(得分:2)
你必须像这样显式地转换每一列:
SELECT CAST(Col1 AS INT),CAST(Col2 AS INT)..
FROM Table
答案 1 :(得分:2)
或者,您可以按如下方式创建一个函数(信用转到列出的海报here):
/****** Object: UserDefinedFunction [dbo].[udf_getColumnDataType] Script Date: 8/4/2014 10:59:23 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/***************************************************************************
Code stolen from here:
http://bit.ly/1v26PmM
****************************************************************************/
CREATE FUNCTION [dbo].[udf_getColumnDataType] (@TableName varchar(64), @ColumnName varchar(64) )
RETURNS varchar(64)
AS
BEGIN
DECLARE @DataType VARCHAR(10)
SELECT @DataType =
t.Name --'Data type'
FROM
sys.columns c
INNER JOIN
sys.types t ON c.user_type_id = t.user_type_id
LEFT OUTER JOIN
sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id
LEFT OUTER JOIN
sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
WHERE
c.object_id = OBJECT_ID(@TableName)
and c.name = @ColumnName
return @DataType
END
然后,您可以检查每个列并进行相应的转换。只需传递表名和列名(作为字符串),它就会将其返回给您。
Select iif(
dbo.udf_getColumnDataType('your table name', 'your column name') ='decimal',
cast(your_column_name as numeric),
your_column_name
) as col1
from your_table_name
我试图在SQL Fiddle上创建它,但似乎我无法在其页面上创建函数。在SQL Server 2012中进行测试时,它对我有用。希望它不是一条很长的路径,但值得发布。