无意中看到朋友写的一篇文章“生成INSERT语句的存储过程的实现”。我仔细看文中的两个存储代码,自我感觉两个都不太满意,都是生成的单行模式的插入,数据行稍微大些性能会受影响的。所在公司本来就存在第二个版本的类似实现,但是是基于多行模式的,还是需要手工添加UNAION ALL来满足多行模式的插入。看到这篇博文和基于公司数据行批量脚本的存储的缺点,这次改写和增强该存储的功能。
本存储运行于sql Server 2005或以上版本,T-sql代码如下:
-- 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代码如下:
EXEC dbo.usp_GetInsertsql
@chvnTable = N'UserLoginInfo',-- nvarchar()
@chvnWhere = N'',-- nvarchar()
@bitIsSingleRow = ; -- bit
GO
执行后的查询结果如下:
一个文件就可以啦。
以上内容是小编给大家分享的sql Server中数据行批量插入脚本的存储实现,希望大家喜欢。
原文地址:https://www.jb51.cc/mssql/62920.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。