如何批量更改#temp_table列的数据类型和最大长度?

时间:2014-07-09 12:27:10

标签: sql sql-server sql-server-2008

考虑以下临时表#tbl

select * from tempdb.sys.columns where [object_id] = object_id('tempdb..#tbl')

-- results into:

object_id  name    system_type_id  max_length   collation_name
----------------------------------------------------------------------------
1          fieldA  231             510          SQL_Latin1_General_CP1_CI_AS
2          fieldB  104               1          NULL
3          fieldC  231             400          SQL_Latin1_General_CP1_CI_AS
4          fieldD  231              -1          SQL_Latin1_General_CP1_CI_AS
5          fieldE  104               1          NULL
.
.
n          fieldF  231             450          SQL_Latin1_General_CP1_CI_AS

我在#tbl中有很多列,需要在所有列上批量更改数据类型,maxlength和collat​​ion类型,以便最终结果为:

object_id  name    system_type_id  max_length   collation_name
----------------------------------------------------------------------------
1          fieldA  231             510          SQL_Latin1_General_CP1_CI_AS
2          fieldB  231             510          SQL_Latin1_General_CP1_CI_AS
3          fieldC  231             510          SQL_Latin1_General_CP1_CI_AS
4          fieldD  231             510          SQL_Latin1_General_CP1_CI_AS
5          fieldE  231             510          SQL_Latin1_General_CP1_CI_AS
.
.
n          fieldF  231             510          SQL_Latin1_General_CP1_CI_AS

这样我就可以将列转换为行(这是我的客户在会议中使用的报告所需要的。)

因为每次运行脚本时#tbl中的列数可能不同(并且可能有不同的字段),所以我想动态地执行此操作 - 一次性使用。

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:0)

可以通过2种方式创建临时表:

使用SELECT INTO

SELECT Col1, COl2
INTO #temp
FROM [YOUR_TABLE]

此方法将根据Col1定义中的数据类型和大小创建Col2[YOUR_TABLE],并且排序将基于数据库服务器的默认值。因此,如果您想使用此方法更改其类型/大小,则必须更改基础表定义或在INSERT期间执行一些数据转换:

SELECT CAST(Col1 as nvarchar(max)) as Col1, CAST(Col2 as nvarchar(max)) as Col2
INTO #temp
FROM [YOUR_TABLE]

使用表格变量

另一种选择是预先声明一个表变量,它可以控制列类型和大小:

DECLARE @TEMP TABLE (Col1 nvarchar(max), Col2 nvarchar(max))

INSERT INTO @TEMP
SELECT Col1, Col2
FROM [YOUR_TABLE]

答案 1 :(得分:0)

怎么样:

ALTER TABLE #tbl ALTER COLUMN fieldA VARCHAR(510) COLLATE SQL_Latin1_General_CP1_CI_AS

对每个领域只做一次。