SQL Server中怎么实现数据行批量插入脚本的存储

75次阅读
没有评论

共计 5894 个字符,预计需要花费 15 分钟才能阅读完成。

这篇文章给大家介绍 SQL Server 中怎么实现数据行批量插入脚本的存储,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

本存储运行于 SQL Server 2005 或以上版本,T-SQL 代码如下:

 IF OBJECT_ID(N dbo.usp_GetInsertSQL ,  P) IS NOT NULL BEGIN DROP PROCEDURE dbo.usp_GetInsertSQL; END GO --================================== --  功能:  获取数据表记录插入的 SQL 脚本  --  说明:  具体实现阐述  --  作者: XXX --  创建: yyyy-MM-dd --  修改: yyyy-MM-dd XXX  修改内容描述  --================================== CREATE PROCEDURE dbo.usp_GetInsertSQL ( @chvnTable NVARCHAR(), --  数据表名称 (建议只使用表名称,不要带有分隔符[]) @chvnWhere NVARCHAR() = N , -- where 查询条件(不带 WHERE 关键字) @bitIsSingleRow BIT = --  是否单行模式,默认为单行模式(单行模式为单行 INSERT INTO VALUES 格式;非单行模式(多行模式)为多行 INSERT INTO SELECT 格式) ) --$Encode$-- AS BEGIN SET NOCOUNT ON; SET @bitIsSingleRow = ISNULL(@bitIsSingleRow, ); DECLARE @intTableID AS INT, @chvnSchemaTableName NVARCHAR();/* 格式:[schema].[table]--++++++(各部分对应字符数)*/ SELECT @intTableID = , @chvnSchemaTableName = N  SELECT @intTableID = object_id ,@chvnSchemaTableName = QUOTENAME(SCHEMA_NAME(schema_id)) + N .  + QUOTENAME(@chvnTable) /* 组合架构名称和表名称的连接 */ FROM sys.objects WHERE name = @chvnTable AND type =  U  DECLARE @chvnColumnNames NVARCHAR(), --  字段列名集,多个以逗号 , 分隔,格式如:[column_name],[column_name],... @chvnColumnValues AS NVARCHAR(MAX); --  字段列值集,多个以逗号 , 分隔  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 (, , , , , , , , , , ) /* 数字数据类型:整数数据类型(bit、tinyint、smallint、int、bigint),带精度和小数的数据类型(decimal、numeric) 和货币数据类型(monery 和 smallmoney*/ THEN  CASE WHEN  + name +   IS NULL THEN  NULL  ELSE CAST( + name +   AS VARCHAR) END  WHEN system_type_id IN (, , , , ) /* 日期和时间数据类型: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 () /* 字符串数据类型:varchar*/ THEN  CASE WHEN  + name +   IS NULL THEN  NULL  ELSE   + REPLACE(  + name +  ,  , ) +   END  WHEN system_type_id IN () /*Unicode 字符串数据类型:nvarchar*/ THEN  CASE WHEN  + name +   IS NULL THEN  NULL  ELSE  N  + REPLACE(  + name +  ,  ,) +   END  WHEN system_type_id IN () /* 字符串数据类型: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 字符串数据类型: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;, 因为之后的代码不会被执行  -- IF @chvnWhere     -- BEGIN -- SET @chvnTSQL = @chvnTSQL +   WHERE   + @chvnWhere; -- END -- --  处理多行模式,需要使用 ROW_NUMBER 窗口函数  -- 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 = /* 当行模式 */ -- 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 空标记 */ --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 窗口函数  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

为了测试以上存储的效果,下面准备一个有数据的数据表,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  先测试单行模式的效果,相应的 T -SQL 代码如下: EXEC dbo.usp_GetInsertSQL @chvnTable = N UserLoginInfo , -- nvarchar() @chvnWhere = N , -- nvarchar() @bitIsSingleRow = ; -- bit GO

再测试多行模式的效果,相应的 T -SQL 代码如下:

 EXEC dbo.usp_GetInsertSQL @chvnTable = N UserLoginInfo , -- nvarchar() @chvnWhere = N , -- nvarchar() @bitIsSingleRow = ; -- bit GO

关于 SQL Server 中怎么实现数据行批量插入脚本的存储就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-03发表,共计5894字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)