目錄
志銘-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,即需要使用先創建臨時表的方式
- 注意一定:定義的臨時表的字段需要和存儲過程返回的結果集的字段完全一樣,不能多也不能少
示例:
- 准備測試表及數據
--准備測試表及數據
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');
- 創建一個簡單的存儲過程
--創建一個存儲過程
CREATE PROCEDURE pro_GetPerson
AS
BEGIN
SELECT Name,Age FROM Person
END
- 執行存過並將結果保存到臨時表
--執行存儲過程將結果保存在臨時表中
----創建臨時表
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
- 執行存過並將結果賦值給表變量
----定義表變量並將存儲過程的結果賦值給表變量
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;