无意中看到朋友写的一篇文章“生成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
执行后的查询结果如下:
文件就可以啦。