微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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中数据行批量插入脚本的存储实现,希望大家喜欢。

原文地址:https://www.jb51.cc/mssql/62920.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐