共計(jì) 5894 個(gè)字符,預(yù)計(jì)需要花費(fèi) 15 分鐘才能閱讀完成。
這篇文章給大家介紹 SQL Server 中怎么實(shí)現(xiàn)數(shù)據(jù)行批量插入腳本的存儲(chǔ),內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
本存儲(chǔ)運(yùn)行于 SQL Server 2005 或以上版本,T-SQL 代碼如下:
IF OBJECT_ID(N dbo.usp_GetInsertSQL , P) IS NOT NULL BEGIN DROP PROCEDURE dbo.usp_GetInsertSQL; END GO --================================== -- 功能: 獲取數(shù)據(jù)表記錄插入的 SQL 腳本 -- 說明: 具體實(shí)現(xiàn)闡述 -- 作者: XXX -- 創(chuàng)建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改內(nèi)容描述 --================================== CREATE PROCEDURE dbo.usp_GetInsertSQL ( @chvnTable NVARCHAR(), -- 數(shù)據(jù)表名稱 (建議只使用表名稱,不要帶有分隔符[]) @chvnWhere NVARCHAR() = N , -- where 查詢條件(不帶 WHERE 關(guān)鍵字) @bitIsSingleRow BIT = -- 是否單行模式,默認(rèn)為單行模式(單行模式為單行 INSERT INTO VALUES 格式;非單行模式(多行模式)為多行 INSERT INTO SELECT 格式) ) --$Encode$-- AS BEGIN SET NOCOUNT ON; SET @bitIsSingleRow = ISNULL(@bitIsSingleRow, ); DECLARE @intTableID AS INT, @chvnSchemaTableName NVARCHAR();/* 格式:[schema].[table]--++++++(各部分對(duì)應(yīng)字符數(shù))*/ SELECT @intTableID = , @chvnSchemaTableName = N SELECT @intTableID = object_id ,@chvnSchemaTableName = QUOTENAME(SCHEMA_NAME(schema_id)) + N . + QUOTENAME(@chvnTable) /* 組合架構(gòu)名稱和表名稱的連接 */ FROM sys.objects WHERE name = @chvnTable AND type = U DECLARE @chvnColumnNames NVARCHAR(), -- 字段列名集,多個(gè)以逗號(hào) , 分隔,格式如:[column_name],[column_name],... @chvnColumnValues AS NVARCHAR(MAX); -- 字段列值集,多個(gè)以逗號(hào) , 分隔 DECLARE @chvnTSQL AS NVARCHAR(MAX), -- TSQL 腳本變量 @chvnInsertIntoBoday AS NVARCHAR(); -- InsertInto 主體變量 SELECT @chvnTSQL = N , @chvnInsertIntoBoday = N SELECT @chvnColumnNames = ISNULL(@chvnColumnNames + N , , N) + QUOTENAME(T.column_name) ,@chvnColumnValues = ISNULL(@chvnColumnValues + N + , + , N) + CAST(T.column_value AS NVARCHAR()) FROM (SELECT name AS column_name /* 字段列名 */ /* 字段列值 */ ,column_value = CASE WHEN system_type_id IN (, , , , , , , , , , ) /* 數(shù)字?jǐn)?shù)據(jù)類型:整數(shù)數(shù)據(jù)類型(bit、tinyint、smallint、int、bigint),帶精度和小數(shù)的數(shù)據(jù)類型(decimal、numeric) 和貨幣數(shù)據(jù)類型(monery 和 smallmoney*/ THEN CASE WHEN + name + IS NULL THEN NULL ELSE CAST( + name + AS VARCHAR) END WHEN system_type_id IN (, , , , ) /* 日期和時(shí)間數(shù)據(jù)類型:datetime、smalldatetime(兼容 sql server 新增 date、datetime 和 time)*/ THEN CASE WHEN + name + IS NULL THEN NULL ELSE + REPLACE(CONVERT(VARCHAR(), + name + , ), ::. , ) + END WHEN system_type_id IN () /* 字符串?dāng)?shù)據(jù)類型:varchar*/ THEN CASE WHEN + name + IS NULL THEN NULL ELSE + REPLACE( + name + , , ) + END WHEN system_type_id IN () /*Unicode 字符串?dāng)?shù)據(jù)類型:nvarchar*/ THEN CASE WHEN + name + IS NULL THEN NULL ELSE N + REPLACE( + name + , ,) + END WHEN system_type_id IN () /* 字符串?dāng)?shù)據(jù)類型:char*/ THEN CASE WHEN + name + IS NULL THEN NULL ELSE + CAST(REPLACE( + name + , ,) AS CHAR( + CAST(max_length AS VARCHAR) + )) + END WHEN system_type_id IN () /*nicode 字符串?dāng)?shù)據(jù)類型:nchar*/ THEN CASE WHEN + name + IS NULL THEN NULL ELSE N + CAST(REPLACE( + name + , ,) AS CHAR( + CAST(max_length AS VARCHAR) + )) + END ELSE NULL END FROM sys.columns WHERE object_id = @intTableID ) AS T; SET @chvnInsertIntoBoday = N INSERT INTO + @chvnSchemaTableName + N ( + @chvnColumnNames + N) -- 方式一、代碼格式使用了 GOTO 和 Label --BEGIN -- IF @bitIsSingleRow = /* 多行模式 */ -- BEGIN -- SET @chvnTSQL = N SELECT SELECT + + @chvnColumnValues + AS RowData, ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS RowNum FROM + @chvnSchemaTableName -- -- 此處不能使用 GOTO WhereCondition;, 因?yàn)橹蟮拇a不會(huì)被執(zhí)行 -- IF @chvnWhere -- BEGIN -- SET @chvnTSQL = @chvnTSQL + WHERE + @chvnWhere; -- END -- -- 處理多行模式,需要使用 ROW_NUMBER 窗口函數(shù) -- SET @chvnTSQL = N SELECT CASE WHEN T.rownum = THEN REPLICATE(N , LEN(N UNION ALL ) + ) + T.RowData ELSE N UNION ALL + T.RowData END + -- N FROM ( + @chvnTSQL + N) AS T -- SET @chvnTSQL = N SELECT + @chvnInsertIntoBoday + N + -- @chvnTSQL; -- GOTO MultiRow; -- END -- ELSE IF @bitIsSingleRow = /* 當(dāng)行模式 */ -- BEGIN -- SET @chvnTSQL = N SELECT + @chvnInsertIntoBoday + -- N + VALUES( + + @chvnColumnValues + + FROM + @chvnSchemaTableName; -- GOTO WhereCondition; -- END -- -- where 查詢條件 -- WhereCondition: -- IF @chvnWhere -- BEGIN -- SET @chvnTSQL = @chvnTSQL + WHERE + @chvnWhere; -- END -- MultiRow:/* 多行模式 GOTO 的 Label 空標(biāo)記 */ --END -- 方式二、存在部分代碼的冗余 BEGIN IF @bitIsSingleRow = /* 多行模式 */ BEGIN SET @chvnTSQL = N SELECT SELECT + + @chvnColumnValues + AS RowData, ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS RowNum FROM + @chvnSchemaTableName IF @chvnWhere BEGIN SET @chvnTSQL = @chvnTSQL + WHERE + @chvnWhere; END -- 多行模式特殊代碼,需要使用 ROW_NUMBER 窗口函數(shù) SET @chvnTSQL = N SELECT CASE WHEN T.rownum = THEN REPLICATE(N , LEN(N UNION ALL ) + ) + T.RowData ELSE N UNION ALL + T.RowData END + N FROM ( + @chvnTSQL + N) AS T SET @chvnTSQL = N SELECT + @chvnInsertIntoBoday + N + @chvnTSQL; END ELSE IF @bitIsSingleRow = /* 單行模式 */ BEGIN SET @chvnTSQL = N SELECT + @chvnInsertIntoBoday + N + VALUES( + + @chvnColumnValues + + FROM + @chvnSchemaTableName; IF @chvnWhere BEGIN SET @chvnTSQL = @chvnTSQL + WHERE + @chvnWhere; END END END PRINT @chvnTSQL; EXEC(@chvnTSQL); END GO
為了測(cè)試以上存儲(chǔ)的效果,下面準(zhǔn)備一個(gè)有數(shù)據(jù)的數(shù)據(jù)表,T-SQL 代碼如下:
IF OBJECT_ID(N dbo.UserLoginInfo , N U) IS NOT NULL BEGIN DROP TABLE dbo.UserLoginInfo; END GO -- create testing table UserLoginInfo CREATE TABLE dbo.UserLoginInfo ( ID INT IDENTITY(, ) PRIMARY KEY, Name VARCHAR() NOT NULL, LoginTime DATETIME NOT NULL ); GO -- insert testing data INSERT dbo.UserLoginInfo (Name, LoginTime) VALUES (zhang , -- ::) ,(li , -- ::) ,(wang , -- ::) ,(zhang , -- ::) ,(li , -- ::) ,(wang , -- ::) ,(zhang , -- ::) ,(li , -- ::) ,(wang , -- ::) ,(zhang , -- ::) ,(li , -- ::) ,(wang , -- ::) ,(zhang , -- ::) ,(li , -- ::) ,(li , -- ::) ,(li , -- ::) ,(li , -- ::) ,(li , -- ::) ,(li , -- ::) ,(li , -- ::) ,(li , -- ::) ,(wang , -- ::) ,(zhang , -- ::) ,(li , -- ::) ,(wang , -- ::) ,(zhang , -- ::) ,(li , -- ::) ,(wang , -- ::) ,(zhang , -- ::) ,(li , -- ::) ,(wang , -- :: GO 先測(cè)試單行模式的效果,相應(yīng)的 T -SQL 代碼如下: EXEC dbo.usp_GetInsertSQL @chvnTable = N UserLoginInfo , -- nvarchar() @chvnWhere = N , -- nvarchar() @bitIsSingleRow = ; -- bit GO
再測(cè)試多行模式的效果,相應(yīng)的 T -SQL 代碼如下:
EXEC dbo.usp_GetInsertSQL @chvnTable = N UserLoginInfo , -- nvarchar() @chvnWhere = N , -- nvarchar() @bitIsSingleRow = ; -- bit GO
關(guān)于 SQL Server 中怎么實(shí)現(xiàn)數(shù)據(jù)行批量插入腳本的存儲(chǔ)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
正文完