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

无意中看到朋友写的一篇文章生成INSERT语句的存储过程的实现”。我仔细看文中的两个存储代码,自我感觉两个都不太满意,都是生成的单行模式的插入,数据行稍微大些性能会受影响的。所在公司本来就存在第二个版本的类似实现,但是是基于多行模式的,还是需要手工添加UNAION ALL来满足多行模式的插入。看到这篇博文和基于公司数据行批量脚本的存储的缺点,这次改写和增强该存储的功能

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

-- -- 此处不能使用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代码如下:

rush: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','-- ::'); GO

先测试单行模式的效果,相应的T-sql代码如下:

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

执行后的查询结果如下:

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

rush:sql;"> EXEC dbo.usp_GetInsertsql @chvnTable = N'UserLoginInfo',-- nvarchar() @bitIsSingleRow = ; -- bit GO

执行后的查询效果如下:

一个文件就可以啦。

以上内容是小编给大家分享sql Server中数据行批量插入脚本的存储实现,希望大家喜欢。

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...