簡體   English   中英

如何大規模更改#temp_table列的數據類型和maxlength?

[英]How can I mass-change the datatype and maxlength of #temp_table columns?

考慮以下臨時表#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的列數可能會有所不同(並且可能具有不同的字段),所以我想動態地執行此操作-1次執行。

有什么辦法嗎?

臨時表可以通過兩種方式創建:

使用SELECT INTO

SELECT Col1, COl2
INTO #temp
FROM [YOUR_TABLE]

此方法將根據[YOUR_TABLE]定義中的數據類型和大小創建Col1Col2 ,而歸類將基於數據庫服務器的默認值。 因此,如果要使用此方法更改其類型/大小,則必須在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]

怎么樣:

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

只需對每個字段執行一次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM