选择列,但是转换给定类型的所有列

时间:2014-08-04 15:10:23

标签: sql

我需要的东西是

的逻辑等价物
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。

谢谢!

2 个答案:

答案 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中进行测试时,它对我有用。希望它不是一条很长的路径,但值得发布。