`
Franciswmf
  • 浏览: 800161 次
  • 性别: 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 语句实现按照某一字段去重后获取所有字段的操作。在实际工作中,我们经常会遇到需要对数据表中的记录进行去重的情况,尤其是当某个字段作为唯一标识符时,我们希望...

    ORACLE中BLOB字段导入到SQL SERVER中的IMAGE字段

    3. **数据转换**:由于SQL SERVER的IMAGE字段不再推荐使用,我们可能需要将数据转换为VARBINARY(MAX)类型。如果是从HEX字符串或Base64编码还原,可以使用SQL函数如`CONVERT(VARBINARY(MAX), HEX_STRING)`或`CAST(/...

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

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

    Excel导入SQLserver源码_excel2sql.zip

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

    l导入exce格式文件到SQL数据库.rar_Excel 导入_Excel To SQL Server_SQL_Server

    标题"l导入exce格式文件到SQL数据库.rar_Excel 导入_Excel To SQL Server_SQL_Server"明确指出我们要解决的问题是将Excel文件的内容导入到SQL Server数据库中。这在很多业务场景中都非常常见,例如处理报表、分析...

    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去重语句.docx

    本篇文章将详细介绍如何在SQL Server中针对单个字段和多个字段进行去重操作。 1. 单字段去重查询: 当我们只需要找出某个特定字段(如`Parameter`)重复的记录时,可以使用以下查询语句: ``` SELECT * FROM ...

    SQL Server数据导入SQLite工具

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

    SqlServer删除所有表数据语句

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

    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_...

    sqlserver数据库类型对应Java中的数据类型

    在 Java 中,对数据库的操作需要通过 JDBC(Java Database Connectivity)来实现,而在 JDBC 中,需要将 SQL Server 的数据类型映射到 Java 中的数据类型。下面将详细介绍 SQL Server 数据库类型对应 Java 中的数据...

    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 根据字段内容,查询表和列名字

    ASP实现 将Excel表格数据批量导入到SQLServer数据库

    3. 数据匹配与校验:确保被导入的Excel工作表中的列数和程序中设定的列数相匹配,数据的第一列第一行必须有数据,以便准确地将数据导入到SQLServer数据库中。 4. 数据库连接与临时表创建:通过ADO技术创建数据库...

Global site tag (gtag.js) - Google Analytics