关于Insert Into ... Select
表一 T1
ID Col1 Col2 .......
1 A ... .......
2 B ... .......
3 C ... .......
4 D ... .......
表二 T2
ID Col1 Col2 .......
1 E ... .......
2 F ... .......
如何得到
ID Col1 Col2 .......
1 A ... .......
2 B ... .......
3 C ... .......
4 D ... .......
5 E ... .......
6 F ... .......
考虑到扩展性,只知道T1和T2的结构相同,但具体字段的名称和个数并不清楚,考虑用 Insert Into T1 Select * From T2实现,看来可行.但如果有一字段,例如上面的ID是标识列 IDENTITY(1,1)便会有错,如何 Insert?
查看过 SET IDENTITY_INSERT ,但如何保证ID的递增,因为不一定从 5 开始.
感慨:SQL中应有类似 except 子句 :
Select * except IDENTITYCOL From T2 ,即选择全部字段 除某些特定字段.
---------------------------------------------------------------
blackhawk_yps(原来是这样) :
我沒亂講。這其實是一個很古老的問題,很久前就已經有討論過了。
T1跟T2的結構若是一樣,而且每一個欄位都是對應的話,就可以采用Dynamic SQL.
這樣通用性會很好。
SQL Server 2K:
Declare @Col_table1 nvarchar(4000)
,@Col_Table2 nvarchar(4000)
,@DySQL nvarchar(4000)
SELECT @Col_table1='',@Col_Table2=''
SELECT @Col_table1=@Col_table1+COLUMN_NAME+',' From INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='Table1' AND COLUMNPROPERTY(Object_ID('table1'),COLUMN_NAME,'IsIdentity')=0 ORDER BY ORDINAL_POSITION
SELECT @Col_table2=@Col_table2+COLUMN_NAME+',' From INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='table2' AND COLUMNPROPERTY(Object_ID('table2'),COLUMN_NAME,'IsIdentity')=0 ORDER BY ORDINAL_POSITION
SELECT @Col_Table1=LEFT(@Col_Table1,LEN(@Col_Table1)-1),@Col_Table2=LEFT(@Col_Table2,LEN(@Col_Table2)-1)
SET @DySQL=' INSERT INTO table1 (' +@Col_Table1+') SELECT '+@Col_Table2 +' From table2 '
EXEC (@DySQL)