select into 臨時表再使用過程中所遇到的問題和相應的解決方案
使用中發現 select into 臨時表 很麻煩,下面是使用中發現的一些注意事項(一下以mssqlserver為例):
1,一般使用
create table person (id int ,name varchar(20),birthday datetime)
讀取資料到臨時表中 select * into #tb_tmp from person where ....
使用臨時表中的資料 select name from #tb_tmp where id = 1
使用之後不要忘記刪除臨時表(drop table #tb_tmp),否則下次使用時會報錯如:
訊息 2714,級別 16,狀態 6,第 1 行
There is already an object named '#tb_tmp' in the database.
2,常見問題
select '' as col into #tb_tmp
會包如下錯誤:
訊息 2731,級別 16,狀態 1,第 2 行
Column 'col' has invalid width: 0.
解決以上問題有兩種方法:
解決方案一,''->null
select null as col into #tb_tmp
解決方案二,''->ltrim(' ') or ''->rtrim(' ')
select rtrim(' ') as col into #tb_tmp
解決方案一引發的問題:
插入問題:只能插入int數字或數字類字串(其中插入帶小數的數字,小數部分會被自動去除)
如果插入數字以外的字串,如:insert into #tb_tmp values('asdfsadf')會報如下錯誤:
訊息 245,級別 16,狀態 1,第 3 行
Syntax error converting the varchar value 'asdfsadf' to a column of data type int.
解決方案二引發的問題:
插入問題:只能插入 "('空格數')"中指定空格數範圍內數量的字串,當字串中個數大於括號中指定空格數時報如下錯誤:
訊息 8152,級別 16,狀態 9,第 2 行
String or binary data would be truncated.
The statement has been terminated.
總結:select into 所引發的問題不能很好解決,建議使用臨時表前先定義臨時表的完整結構,並再定義列時加上(COLLATE
DATABASE_DEFAULT)屬性,否則某些系統中使用中文時會出現亂碼.