`
Franciswmf
  • 浏览: 796788 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

sqlserver存储过程_根据表1表2字段对应关系将表1数据去重导入到表2

 
阅读更多
1、优化前
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[pro_demo] 
	@type varchar(10),
	@stuId varchar(10),
	@stuNo VARCHAR(20),
	@tFlag varchar(1),
	@stuClassIds varchar(max)
AS
BEGIN
	SET NOCOUNT ON;
	-- 定义游标,编辑sql, 取得字段对应关系
	DECLARE @TempStuSql VARCHAR(2000)
	DECLARE @StuSql VARCHAR(2000)
	--创建游标
	DECLARE stuCursor CURSOR FOR
		SELECT TempStuField,StuField,StuType,isSchoolItem FROM UpgradeStuFieldDefine
		WHERE xType = @type 
		AND xId = @stuId 
		AND LOWER(TempStuField) != 'id' 
		AND LOWER(StuField) != 'code' 
		ORDER BY ID DESC
  --开启游标
	OPEN stuCursor

	DECLARE @TempStuField VARCHAR(5000)
	DECLARE @StuField VARCHAR(100)
	DECLARE @StuType VARCHAR(1)
	DECLARE @isSchoolItem VARCHAR(1)
	
	SET @TempStuSql = ''
	SET @StuSql = ''
--fetch row by row
	FETCH NEXT FROM stuCursor INTO @TempStuField,@StuField,@StuType,@isSchoolItem  --eg: f2 gender 0
	WHILE @@FETCH_STATUS = 0
		BEGIN 
			IF @isSchoolItem='0'
				SET @TempStuSql = '(select o.id from OptionItem o where o.itemName=tc.' +@TempStuField + ') as ' +@TempStuField + ',' + @TempStuSql 
			ELSE	
				SET @TempStuSql = 'tc.' +@TempStuField + ',' + @TempStuSql 
			SET @StuSql = @StuField + ',' + @StuSql 
			FETCH NEXT FROM stuCursor INTO @TempStuField,@StuField,@StuType,@isSchoolItem
		END
--@TempStuField @StuField @StuType 每个变量每次只能保存一行数据对应的一条数据
--print @TempStuSql
--print @StuSql
--tc.f1,tc.f2,tc.f4,tc.f5,tc.f6,
--sname,gender,mobile,address,email,
	CLOSE stuCursor
	DEALLOCATE stuCursor
	--释放游标
	IF LEN(@TempStuSql) > 1
	BEGIN
		SET @TempStuSql = SUBSTRING(@TempStuSql, 1, LEN(@TempStuSql) -1)
		SET @StuSql = SUBSTRING(@StuSql, 1, LEN(@StuSql) - 1)
	END
--tc.f1,tc.f2,tc.f4,tc.f5,tc.f6
--sname,gender,mobile,address,email
	DECLARE @stuTable NVARCHAR(20) -- 
	IF @StuType = 1
		SET @stuTable = 'Astudent'
	ELSE 
		SET @stuTable = 'Bstudent'
		
	IF LEN(@TempStuSql) > 1
	BEGIN
		-- 定义执行sql
		DECLARE @insertSql NVARCHAR(max)
		DECLARE @valueSql NVARCHAR(max)	
		DECLARE @sql NVARCHAR(max)	
			IF @type = 0 -- 一类学生
				BEGIN
					SET @insertSql = 'INSERT INTO ' + @stuTable + ' (id,Code,createTime,stuRefId,aStuType,aStuId,status,' + @StuSql + ') '
					SET @valueSql = 'SELECT REPLACE(NEWID(),''-'',''''),'''',GETDATE(),tc.id,''' + @type + ''',''' + @stuId + ''', 1, ' + @TempStuSql + ' FROM TempCustomer tc 
						LEFT JOIN Leads l ON l.TmpCustomerId = tc.id 
						WHERE l.ActivityID = ' + @stuId + ' AND (tc.BatchNo = ''' + Isnull(@stuNo, '') + ''' OR ''' + Isnull(@stuNo, '') + ''' = '''')
						AND not exists (
							SELECT 1 FROM t1 WHERE stuRefId = tc.id AND aStuType = ' + @type + ' AND aStuId = ' + @stuId + '
						) AND not exists (
							SELECT 1 FROM t2 WHERE stuRefId = tc.id AND aStuType = ' + @type + ' AND aStuId = ' + @stuId + '
						) '
					IF ISNULL(@tFlag, 1) = 0 --页面选择了学生id,直接升级选择的学生
						SET @valueSql = @valueSql + 'AND tc.id IN (' + REPLACE(@stuClassIds,'@', ',') + ') '

					SET @sql = @insertSql + @valueSql

					EXEC sp_executesql @sql
				END
			ELSE IF @type = 1  -- 二类学生
				BEGIN
					SET @insertSql = 'INSERT INTO ' + @stuTable + ' (ID,Code,createTime,stuRefId,aStuType,aStuId,status,' + @StuSql + ') '
					SET @valueSql = 'SELECT REPLACE(NEWID(),''-'',''''),'''',GETDATE(),tc.id,''' + @type + ''',''' + @stuId + ''', 1, ' + @TempStuSql + ' 
						FROM t2_' + @stuId + ' tc WHERE (SYS_BatchId = ''' + Isnull(@stuNo, '') + ''' OR ''' + Isnull(@stuNo, '') + ''' = '''') 
						AND not exists (
							SELECT 1 FROM t1 WHERE stuRefId = tc.id AND aStuType = ' + @type + ' AND aStuId = ' + @stuId + '
						) AND not exists (
							SELECT 1 FROM t2 WHERE stuRefId = tc.id AND aStuType = ' + @type + ' AND aStuId = ' + @stuId + '
						) '
					IF ISNULL(@tFlag, 1) = 0 --页面选择了学生id,直接升级选择的学生
						SET @valueSql = @valueSql + 'AND tc.id IN (' + REPLACE(@stuClassIds,'@', ',') + ') '
					
					SET @sql = @insertSql + @valueSql

					EXEC sp_executesql @sql
				END
	END
END


2、优化后

ALTER PROCEDURE [dbo].[pro_demo] 
@type varchar(10),
@stuId varchar(10),
@stuNo VARCHAR(20),
@tFlag varchar(1),
@stuClassIds varchar(max)
AS
BEGIN
SET NOCOUNT ON;
-- 定义游标,编辑sql, 取得字段对应关系
DECLARE @TempStuSql VARCHAR(2000)
DECLARE @StuSql VARCHAR(2000)
--create cursor
DECLARE stuCursor CURSOR FOR
SELECT TempCustomerField,CustomerField,CustomerType,IsOptionItem FROM UpgradeStuFieldDefine
WHERE ActType = @type 
AND ActId = @stuId 
AND LOWER(TempCustomerField) != 'id' 
AND LOWER(CustomerField) != 'code' 
ORDER BY ID DESC
--open cursor
OPEN stuCursor
DECLARE @TempCustomerField VARCHAR(5000)
DECLARE @CustomerField VARCHAR(100)
DECLARE @CustomerType VARCHAR(1)
DECLARE @IsOptionItem VARCHAR(1)
SET @TempStuSql = ''
SET @StuSql = ''
--fetch next from cursor
FETCH NEXT FROM stuCursor INTO @TempCustomerField,@CustomerField,@CustomerType,@IsOptionItem
WHILE @@FETCH_STATUS = 0
BEGIN 	
SET @TempStuSql = 'tc.' +@TempCustomerField + ',' + @TempStuSql 
SET @StuSql = @CustomerField + ',' + @StuSql 
FETCH NEXT FROM stuCursor INTO @TempCustomerField,@CustomerField,@CustomerType,@IsOptionItem
END
--print '第1个打印'
--print @TempStuSql --tc.f1,tc.f2,tc.f4,tc.f5,tc.f6,
--print @StuSql     --customername,gender,mobile,address,email,
--close and deallocate cursor
CLOSE stuCursor

--@TempStuSql and @StuSql
IF LEN(@TempStuSql) > 1
BEGIN
SET @TempStuSql = SUBSTRING(@TempStuSql, 1, LEN(@TempStuSql) -1)
SET @StuSql = SUBSTRING(@StuSql, 1, LEN(@StuSql) - 1)
END
--@customerTable
DECLARE @customerTable NVARCHAR(20)
IF @CustomerType = 1
SET @customerTable = 'Astudent'
ELSE 
SET @customerTable = 'Bstudent'

IF LEN(@TempStuSql) > 1
--main code #s
BEGIN
OPEN stuCursor
DECLARE @sql NVARCHAR(max)	     --last sql
DECLARE @insertSql NVARCHAR(max) --insert part
DECLARE @valueSql NVARCHAR(max)  --value part	
DECLARE @valueSql1 VARCHAR(2000) --START
DECLARE @valueSql2 VARCHAR(2000) --DYNAMIC COLUMN
DECLARE @valueSql3 VARCHAR(2000) --FROM
DECLARE @valueSql4 VARCHAR(2000) --LEFT JOIN
DECLARE @valueSql5 VARCHAR(2000) --END
SET @valueSql2=''
SET @valueSql4=''
IF @type = 0 -- Ma学生
BEGIN
SET @insertSql = 'INSERT INTO ' + @customerTable + ' (id,Code,createTime,upgradeCustomerRefId,upgradeActType,upgradeActId,status,' + @StuSql + ') '
SET @valueSql1='SELECT REPLACE(NEWID(),''-'',''''),'''',GETDATE(),tc.id,''' + @type + ''',''' + @stuId + ''', 1'
SET @valueSql3=' FROM TempCustomer tc LEFT JOIN Leads l ON l.TmpCustomerId = tc.id '
SET @valueSql5='	WHERE l.ActivityID = ''' + @stuId + ''' AND (tc.BatchNo = ''' + Isnull(@stuNo, '') + ''' OR ''' + Isnull(@stuNo, '') + ''' = '''')
AND not exists ( SELECT 1 FROM customer WHERE upgradeCustomerRefId = tc.id AND upgradeActType = ' + @type + ' AND upgradeActId = ' + @stuId + ') 
AND not exists ( SELECT 1 FROM company WHERE upgradeCustomerRefId = tc.id AND upgradeActType = ' + @type + ' AND upgradeActId = ' + @stuId + ') '
FETCH NEXT FROM stuCursor INTO @TempCustomerField,@CustomerField,@CustomerType,@IsOptionItem
WHILE @@FETCH_STATUS = 0
BEGIN 	
IF @IsOptionItem='1'
BEGIN
SET @valueSql2=','+@TempCustomerField+'.id'+@valueSql2
SET @valueSql4=@valueSql4+' left join OptionItem '+@TempCustomerField+' on tc.'+@TempCustomerField+'='+@TempCustomerField+'.itemName '
END
ELSE
SET @valueSql2=',tc.'+@TempCustomerField+@valueSql2
FETCH NEXT FROM stuCursor INTO @TempCustomerField,@CustomerField,@CustomerType,@IsOptionItem
END
CLOSE stuCursor
DEALLOCATE stuCursor		
--print '打印left join=='
--print @valueSql4
END
ELSE IF @type = 1  -- Survey学生
BEGIN
SET @insertSql = 'INSERT INTO ' + @customerTable + ' (ID,Code,createTime,upgradeCustomerRefId,upgradeActType,upgradeActId,status,' + @StuSql + ') '
SET @valueSql1='SELECT REPLACE(NEWID(),''-'',''''),'''',GETDATE(),tc.id,''' + @type + ''',''' + @stuId + ''', 1'
SET @valueSql3=' FROM T1_' + @stuId + ' tc '
SET @valueSql5='	WHERE (SYS_BatchId = ''' + Isnull(@stuNo, '') + ''' OR ''' + Isnull(@stuNo, '') + ''' = '''') 
AND not exists ( SELECT 1 FROM T1 WHERE upgradeCustomerRefId = tc.id AND upgradeActType = ' + @type + ' AND upgradeActId = ' + @stuId + ') 
AND not exists ( SELECT 1 FROM T2 WHERE upgradeCustomerRefId = tc.id AND upgradeActType = ' + @type + ' AND upgradeActId = ' + @stuId + ') '
FETCH NEXT FROM stuCursor INTO @TempCustomerField,@CustomerField,@CustomerType,@IsOptionItem
WHILE @@FETCH_STATUS = 0
BEGIN 	
IF @IsOptionItem='1'
BEGIN
SET @valueSql2=','+@TempCustomerField+'.id'+@valueSql2
SET @valueSql4=@valueSql4+' left join OptionItem '+@TempCustomerField+' on tc.'+@TempCustomerField+'='+@TempCustomerField+'.itemName '
END
ELSE
SET @valueSql2=',tc.'+@TempCustomerField+@valueSql2
FETCH NEXT FROM stuCursor INTO @TempCustomerField,@CustomerField,@CustomerType,@IsOptionItem
END
CLOSE stuCursor
DEALLOCATE stuCursor	
END
IF LEN(@valueSql4)>1
SET @valueSql=@valueSql1+@valueSql2+@valueSql3+@valueSql4+@valueSql5 --@valueSql
ELSE
SET @valueSql=@valueSql1+@valueSql2+@valueSql3+@valueSql5
IF ISNULL(@tFlag, 1) = 0 --页面选择了学生id,直接升级选择的学生
SET @valueSql = @valueSql + 'AND tc.id IN (' + REPLACE(@stuClassIds,'@', ',') + ') ' --@valueSql
SET @sql = @insertSql + @valueSql
--print '打印'
--print @sql
EXEC sp_executesql @sql
END
--main code #e
END
分享到:
评论

相关推荐

    sql_按照某一个字段进行去重后获取全部字段

    根据提供的文件信息,本文将详细解释如何通过 SQL 语句实现按照某一字段去重后获取所有字段的操作。在实际工作中,我们经常会遇到需要对数据表中的记录进行去重的情况,尤其是当某个字段作为唯一标识符时,我们希望...

    Sql Server 存储过程的导出导入.doc

    此外,如果存储过程中引用了源数据库特有的对象(如表、视图或函数),在导入到新环境中时可能需要调整依赖关系。 在实际应用中,存储过程的导出和导入非常实用,例如在数据库迁移、备份恢复、开发测试和版本控制等...

    sqlserver2sqlite_converter

    总之,"sqlserver2sqlite_converter"这个工具为那些需要将数据从SQL Server迁移到SQLite的用户提供了便利。它简化了两个不同数据库系统之间的数据迁移过程,帮助用户快速适应不同的数据库环境。在实际使用中,用户应...

    sqlserver 快速查询存储过程是否用到某个表或者字段

    sqlserver 快速查询存储过程或者视图中是否用到某个表或者字段。

    Excel导入SQLserver源码_excel2sql.zip

    这个压缩包文件"Excel导入SQLserver源码_excel2sql.zip"很可能包含了一个程序或脚本,用于自动化从Excel文件批量导入数据到SQL Server的过程。通常,这样的工具会使用编程语言如Python、C#、VB.NET或PowerShell来...

    SQL Server导出表到EXCEL文件的存储过程

    ### SQL Server导出表到Excel文件的存储过程详解 #### 标题理解: - **标题内容**:“SQL Server导出表到EXCEL文件的存储过程” - **标题解读**:此标题表明文章将介绍一种在SQL Server环境中使用的存储过程,该...

    SQL Server存储过程基本语法

    以上内容主要介绍了 SQL Server 中存储过程中的一些基本语法和操作方法,包括变量定义及赋值、表和临时表的操作、循环以及条件语句等,这些知识点对于理解和使用 SQL Server 存储过程至关重要。

    Excel数据导入到SQLServer数据库中

    首先,导入Excel数据到SQL Server通常有几种方法:使用SQL Server Management Studio (SSMS) 的“导入和导出数据”向导、T-SQL语句(如BULK INSERT或OPENROWSET函数)以及编写存储过程。标题提到的“通过自动编写...

    SQLServer2005_SSMSEE_x64

    7. **导入与导出数据:** 支持从多种数据源导入数据到SQL Server,也可以将数据导出到其他格式,如Excel、CSV等。 8. **报表服务:** 尽管SSMSEE不包含完整版的SQL Server Reporting Services,但依然可以创建和...

    SqlServer删除所有表数据语句

    Sql Server 删除所有表数据语句 Sql Server 是一种关系型数据库管理系统,广泛应用于企业级应用程序中。在实际开发和测试中,我们常常需要删除数据库中的所有表数据,而保持表结构不变。下面我们将介绍如何使用一条...

    SQL Server数据导入SQLite工具

    1. **数据迁移**:数据迁移是将数据从一个数据库系统转移到另一个数据库系统的过程。在这个过程中,我们需要确保数据的一致性、完整性和兼容性。SQL Server到SQLite的迁移涉及了结构和数据的转换。 2. **数据库结构...

    sqlserver导入数据

    本文将详细介绍如何使用 SQL Server Management Studio 将 Excel 文件中的数据导入到 SQL Server 数据库中。 为什么需要导入数据 在实际应用中,数据可能来自各种来源,如 Excel 文件、CSV 文件、文本文件等。将...

    Oracle_Mysql_Sqlserver字段类型转换参考

    Oracle_Mysql_Sqlserver字段类型转换参考Oracle_Mysql_Sqlserver字段类型转换参考Oracle_Mysql_Sqlserver字段类型转换参考Oracle_Mysql_Sqlserver字段类型转换参考Oracle_Mysql_Sqlserver字段类型转换参考Oracle_...

    SQL Server 去重

    本文将通过一系列示例来详细介绍如何在SQL Server中实现数据去重。 #### 二、基本概念 在SQL Server中,去重通常指的是从表中删除重复的数据行。这里所说的“重复”是指表中的某些字段或组合字段的值完全相同的...

    SQLServer表数据转化为sql语句(表数据搬运,一键快捷导出为insert语句,方便导入到其它库)

    功能: 根据表名、where条件,生成导出数据的SQL语句。(包含insert语句。结果可一键执行,利于数据导出、导入) 参数: @tableName nvarchar(100) --表名 ,@sqlWhere nvarchar(500) --where条件,如'a=''123'' '(传...

    SQL Server 2016 多种导入EXCEL 2013表数据的方法

    【SQL Server 2016】中导入EXCEL 2013表数据的方法 在SQL Server 2016中,有多种方法可以将EXCEL 2013的数据导入到数据库中,主要包括以下三种: 1. **SQL Server Management Studio (SSMS) 中导入** - 首先,...

    dbf文件导入SQL server

    本主题聚焦于如何将DBF(dBase文件格式)导入到SQL Server数据库,并将数据导出至本地Excel。DBF是一种早期的数据库文件格式,常用于FoxPro、dBase等系统,而SQL Server是微软提供的一个强大、可靠的关系型数据库...

    sqlserver 导出表及字段说明脚本.rar

    2. **导出表结构**:在SQL Server中,可以使用`sp_help`系统存储过程或`information_schema`视图来获取表的结构信息,包括表名、字段名、数据类型、是否为主键等。`sp_help 'tableName'`将显示关于特定表的所有信息...

    sqlServer删除重复数据

    SQL Server 删除重复数据 SQL Server 删除重复数据是数据库管理中的一项重要任务。重复数据可能是完全重复的记录,也可能是部分关键字段重复的记录。删除重复数据可以使用多种方法,包括使用 SELECT DISTINCT 语句...

    sqlserver 根据内容,查询表和列名字

    sqlserver 根据字段内容,查询表和列名字 sqlserver 根据字段内容,查询表和列名字 sqlserver 根据字段内容,查询表和列名字 sqlserver 根据字段内容,查询表和列名字 sqlserver 根据字段内容,查询表和列名字

Global site tag (gtag.js) - Google Analytics