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