Sql 如何批量更改#temp_表列的数据类型和maxlength?
考虑以下临时表Sql 如何批量更改#temp_表列的数据类型和maxlength?,sql,sql-server,sql-server-2008,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 ----------------------------------------------------------------------------
#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和排序规则类型,以便最终结果是:
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
中的列数可能会有所不同(并且可能有不同的字段),所以我希望动态地执行此操作—一次完成
有没有办法做到这一点 可以通过两种方式创建临时表: 使用
选择进入:
SELECT Col1, COl2
INTO #temp
FROM [YOUR_TABLE]
此方法将根据[YOUR_TABLE]
定义中的数据类型和大小创建Col1
和Col2
,排序规则将基于数据库服务器的默认值。因此,如果要使用此方法更改其类型/大小,则必须更改基础表定义,或在插入过程中执行一些数据转换:
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]
那么:
ALTER TABLE #tbl ALTER COLUMN fieldA VARCHAR(510) COLLATE SQL_Latin1_General_CP1_CI_AS
只需对每个字段执行一次。如何创建这些临时表?
选择[stuff]进入#temp from[db_table1]left join[db_table2]代码>