T-SQL——關於表數據的復制插入


志銘-2021年10月2日 22:21:00

0. 復制表中一列插入到另外一列

--將col2列值復制給col1
UPDATE table_name SET col1_name=col2_name
WHERE col1_condition


1. 復制表結構和數據到自動創建的一張新表中——select into

當需要備份某張表的記錄的時候,常常需要根據現有的表復制一個備份表

下面示例,從表table1復制出一張表table2

  • table_name2 會自動創建,所以不需要 也不可以 事先創建好
  • 從table1復制到table2中的僅僅是指定字段和字段的值,不包含主鍵、索引、約束和觸發器,所以千萬不要通過此種方式創建一個相同字段,相同功能的表(若是需要還是選中表右鍵-->編寫腳本為-->create到
--復制部分的字段
SELECT col1,col2,col3…… INTO table_name2 FROM table_name1
--復制所以的字段
SELECT * INTO table_name2 FROM table_name1
--復制部分記錄
SELECT * INTO table_name2 FROM table_name1 WHERE table_name1_col_conditionc
--只復制表的字段名,不復制數據(即:創建一個空表)
SELECT * INTO table_name2 FROM table_name1 WHERE 1<>1
SELECT TOP 0 INTO table_name2 FROM table_name1
  • SELECT INTO語句可以復制數據到一個自動創建的臨時表中
  • SELECT INTO語句不支持表變量,既不能自動創建一個表變量,也不能將數據復制到一個已聲明的表變量中
IF OBJECT_ID('tempdb.. #tempTable') IS NOT NULL
BEGIN
    DROP TABLE #tempTable;
END;

SELECT * INTO  #tempTable
FROM table1;

SELECT * FROM #tempTable
DROP TABLE #tempTable


2. 復制表中一些字段值插入到另外一張表中——insert into

復制表table1中某幾列數據插入(更新)到表table2中的某幾列

  • table2必須已經存在,其字段不需要和table1中一樣
  • table2可以是已創建的臨時表,也可以是已聲明的表變量
INSERT INTO table2_name(col1,col2,col3)
SELECT col1,col2,col3 FROM table1
WHERE table1_condition


3. 將存儲過過程結果保存在臨時表或表變量中

將存儲過程的結果保存在臨時表,需要使用insert into,即需要使用先創建臨時表的方式

  • 注意一定:定義的臨時表的字段需要和存儲過程返回的結果集的字段完全一樣,不能多也不能少

示例:

  1. 准備測試表及數據
--准備測試表及數據
CREATE TABLE Person
(
    [Id] INT,
    [Name] NVARCHAR(50),
    [Age] INT,
    [ClassId] NVARCHAR(50)
);
INSERT INTO Person
VALUES
(2, N'Jerry', 7, N'11'),
(3, N'Bob', 7, N'11'),
(4, N'Allen', 7, N'11'),
(5, N'Andy', 8, N'22'),
(6, N'Beck', 8, N'22'),
(7, N'Billy', 8, N'22');

  1. 創建一個簡單的存儲過程
--創建一個存儲過程
CREATE PROCEDURE pro_GetPerson
AS
BEGIN
    SELECT Name,Age FROM Person
END    
  1. 執行存過並將結果保存到臨時表
--執行存儲過程將結果保存在臨時表中
----創建臨時表
IF OBJECT_ID('tempdb..#Person') IS NOT NULL
BEGIN 
DROP TABLE #Person
END
CREATE TABLE #Person
(
    Name NVARCHAR(50),
    AGE INT
)
----執行存儲過程並保存到臨時表中
INSERT INTO #Person Exec pro_GetPerson
SELECT * FROM #Person
  1. 執行存過並將結果賦值給表變量
----定義表變量並將存儲過程的結果賦值給表變量
DECLARE @Person TABLE
(
    Name NVARCHAR(50),
	Age INT
)
INSERT INTO	@Person EXEC dbo.pro_GetPerson
SELECT * FROM @Person

若是希望避免手動建表或手動創建表變量,而使用select into的方式
則需要通過OPENROWSET方法。

除非純粹就是臨時從一個表往另外一個表導數據,不要在存儲過程中使用以下方法

  • 注意:使用OPENROWSET執行存儲過程是無法執行帶有參數的存儲過程的

示例:

IF OBJECT_ID('tempdb..#temp') IS NOT NULL
BEGIN
DROP TABLE #temp
END

SELECT * INTO #temp
FROM
    OPENROWSET('sqloledb', 'server=severname;uid=uid;pwd=password', 'exec 數據庫名.dbo.pro');--注:此方法執行存儲過程無法帶參數
SELECT * FROM #temp;



4. 將動態SQL語句的結果保存在臨時表中

實現方法和上述執行存儲過程保存到臨時表和表變量的方法一樣

--動態SQL語句
DECLARE @sqlStr VARCHAR(5000) = 'SELECT Name FROM Company';
--表變量
DECLARE @tableVar TABLE
(
    Name VARCHAR(100)
);
--執行動態SQL將結果保存在表變量中
INSERT INTO @tableVar
EXEC (@sqlStr);

SELECT * FROM @tableVar;


5. 參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM