考虑以下临时表#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和collation类型,以便最终结果为:
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
中的列数可能不同(并且可能有不同的字段),所以我想动态地执行此操作 - 一次性使用。
有没有办法做到这一点?
答案 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
对每个领域只做一次。