这篇文章给大家介绍SQL Server中怎么实现数据行批量插入脚本的存储,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

本存储运行于SQL Server 2005或以上版本,T-SQL代码如下:

IFOBJECT_ID(N'dbo.usp_GetInsertSQL','P')ISNOTNULLBEGINDROPPROCEDUREdbo.usp_GetInsertSQL;ENDGO--==================================--功能:获取数据表记录插入的SQL脚本--说明:具体实现阐述--作者:XXX--创建:yyyy-MM-dd--修改:yyyy-MM-ddXXX修改内容描述--==================================CREATEPROCEDUREdbo.usp_GetInsertSQL(@chvnTableNVARCHAR(),--数据表名称(建议只使用表名称,不要带有分隔符[])@chvnWhereNVARCHAR()=N'',--where查询条件(不带WHERE关键字)@bitIsSingleRowBIT=--是否单行模式,默认为单行模式(单行模式为单行INSERTINTOVALUES格式;非单行模式(多行模式)为多行INSERTINTOSELECT格式))--$Encode$--ASBEGINSETNOCOUNTON;SET@bitIsSingleRow=ISNULL(@bitIsSingleRow,);DECLARE@intTableIDASINT,@chvnSchemaTableNameNVARCHAR();/*格式:[schema].[table]--++++++(各部分对应字符数)*/SELECT@intTableID=,@chvnSchemaTableName=N'';SELECT@intTableID=object_id,@chvnSchemaTableName=QUOTENAME(SCHEMA_NAME(schema_id))+N'.'+QUOTENAME(@chvnTable)/*组合架构名称和表名称的连接*/FROMsys.objectsWHEREname=@chvnTableANDtype='U';DECLARE@chvnColumnNamesNVARCHAR(),--字段列名集,多个以逗号','分隔,格式如:[column_name],[column_name],...@chvnColumnValuesASNVARCHAR(MAX);--字段列值集,多个以逗号','分隔DECLARE@chvnTSQLASNVARCHAR(MAX),--TSQL脚本变量@chvnInsertIntoBodayASNVARCHAR();--InsertInto主体变量SELECT@chvnTSQL=N'',@chvnInsertIntoBoday=N'';SELECT@chvnColumnNames=ISNULL(@chvnColumnNames+N',',N'')+QUOTENAME(T.column_name),@chvnColumnValues=ISNULL(@chvnColumnValues+N'+'',''+',N'')+CAST(T.column_valueASNVARCHAR())FROM(SELECTnameAScolumn_name/*字段列名*//*字段列值*/,column_value=CASEWHENsystem_type_idIN(,,,,,,,,,,)/*数字数据类型:整数数据类型(bit、tinyint、smallint、int、bigint),带精度和小数的数据类型(decimal、numeric)和货币数据类型(monery和smallmoney*/THEN'CASEWHEN'+name+'ISNULLTHEN''NULL''ELSECAST('+name+'ASVARCHAR)END'WHENsystem_type_idIN(,,,,)/*日期和时间数据类型:datetime、smalldatetime(兼容sqlserver新增date、datetime和time)*/THEN'CASEWHEN'+name+'ISNULLTHEN''NULL''ELSE''''''''+REPLACE(CONVERT(VARCHAR(),'+name+',),''::.'','''')+''''''''END'WHENsystem_type_idIN()/*字符串数据类型:varchar*/THEN'CASEWHEN'+name+'ISNULLTHEN''NULL''ELSE''''''''+REPLACE('+name+','''''''','''''''''''')+''''''''END'WHENsystem_type_idIN()/*Unicode字符串数据类型:nvarchar*/THEN'CASEWHEN'+name+'ISNULLTHEN''NULL''ELSE''N''''''+REPLACE('+name+','''''''','''''''''''')+''''''''END'WHENsystem_type_idIN()/*字符串数据类型:char*/THEN'CASEWHEN'+name+'ISNULLTHEN''NULL''ELSE''''''''+CAST(REPLACE('+name+','''''''','''''''''''')ASCHAR('+CAST(max_lengthASVARCHAR)+'))+''''''''END'WHENsystem_type_idIN()/*nicode字符串数据类型:nchar*/THEN'CASEWHEN'+name+'ISNULLTHEN''NULL''ELSE''N''''''+CAST(REPLACE('+name+','''''''','''''''''''')ASCHAR('+CAST(max_lengthASVARCHAR)+'))+''''''''END'ELSE'''NULL'''ENDFROMsys.columnsWHEREobject_id=@intTableID)AST;SET@chvnInsertIntoBoday=N'''INSERTINTO'+@chvnSchemaTableName+N'('+@chvnColumnNames+N')''';--方式一、代码格式使用了GOTO和Label--BEGIN--IF@bitIsSingleRow=/*多行模式*/--BEGIN--SET@chvnTSQL=N'SELECT''SELECT''+'+@chvnColumnValues+'ASRowData,ROW_NUMBER()OVER(ORDERBY(SELECTNULL))ASRowNumFROM'+@chvnSchemaTableName----此处不能使用GOTOWhereCondition;,因为之后的代码不会被执行--IF@chvnWhere>''--BEGIN--SET@chvnTSQL=@chvnTSQL+'WHERE'+@chvnWhere;--END----处理多行模式,需要使用ROW_NUMBER窗口函数--SET@chvnTSQL=N'SELECTCASEWHENT.rownum=THENREPLICATE(N'''',LEN(N''UNIONALL'')+)+T.RowDataELSEN''UNIONALL''+T.RowDataEND'+--N'FROM('+@chvnTSQL+N')AST';--SET@chvnTSQL=N'SELECT'+@chvnInsertIntoBoday+N';'+--@chvnTSQL;--GOTOMultiRow;--END--ELSEIF@bitIsSingleRow=/*当行模式*/--BEGIN--SET@chvnTSQL=N'SELECT'+@chvnInsertIntoBoday+--N'+''VALUES(''+'+@chvnColumnValues+'+'');''FROM'+@chvnSchemaTableName;--GOTOWhereCondition;--END----where查询条件--WhereCondition:--IF@chvnWhere>''--BEGIN--SET@chvnTSQL=@chvnTSQL+'WHERE'+@chvnWhere;--END--MultiRow:/*多行模式GOTO的Label空标记*/--END--方式二、存在部分代码的冗余BEGINIF@bitIsSingleRow=/*多行模式*/BEGINSET@chvnTSQL=N'SELECT''SELECT''+'+@chvnColumnValues+'ASRowData,ROW_NUMBER()OVER(ORDERBY(SELECTNULL))ASRowNumFROM'+@chvnSchemaTableNameIF@chvnWhere>''BEGINSET@chvnTSQL=@chvnTSQL+'WHERE'+@chvnWhere;END--多行模式特殊代码,需要使用ROW_NUMBER窗口函数SET@chvnTSQL=N'SELECTCASEWHENT.rownum=THENREPLICATE(N'''',LEN(N''UNIONALL'')+)+T.RowDataELSEN''UNIONALL''+T.RowDataEND'+N'FROM('+@chvnTSQL+N')AST';SET@chvnTSQL=N'SELECT'+@chvnInsertIntoBoday+N';'+@chvnTSQL;ENDELSEIF@bitIsSingleRow=/*单行模式*/BEGINSET@chvnTSQL=N'SELECT'+@chvnInsertIntoBoday+N'+''VALUES(''+'+@chvnColumnValues+'+'');''FROM'+@chvnSchemaTableName;IF@chvnWhere>''BEGINSET@chvnTSQL=@chvnTSQL+'WHERE'+@chvnWhere;ENDENDENDPRINT@chvnTSQL;EXEC(@chvnTSQL);ENDGO

为了测试以上存储的效果,下面准备一个有数据的数据表,T-SQL代码如下:

IFOBJECT_ID(N'dbo.UserLoginInfo',N'U')ISNOTNULLBEGINDROPTABLEdbo.UserLoginInfo;ENDGO--createtestingtableUserLoginInfoCREATETABLEdbo.UserLoginInfo(IDINTIDENTITY(,)PRIMARYKEY,NameVARCHAR()NOTNULL,LoginTimeDATETIMENOTNULL);GO--inserttestingdataINSERTdbo.UserLoginInfo(Name,LoginTime)VALUES('zhang','--::'),('li','--::'),('wang','--::'),('zhang','--::'),('li','--::'),('wang','--::'),('zhang','--::'),('li','--::'),('wang','--::'),('zhang','--::'),('li','--::'),('wang','--::'),('zhang','--::'),('li','--::'),('li','--::'),('li','--::'),('li','--::'),('li','--::'),('li','--::'),('li','--::'),('li','--::'),('wang','--::'),('zhang','--::'),('li','--::'),('wang','--::'),('zhang','--::'),('li','--::'),('wang','--::'),('zhang','--::'),('li','--::'),('wang','--::');GO先测试单行模式的效果,相应的T-SQL代码如下:EXECdbo.usp_GetInsertSQL@chvnTable=N'UserLoginInfo',--nvarchar()@chvnWhere=N'',--nvarchar()@bitIsSingleRow=;--bitGO

再测试多行模式的效果,相应的T-SQL代码如下:

EXECdbo.usp_GetInsertSQL@chvnTable=N'UserLoginInfo',--nvarchar()@chvnWhere=N'',--nvarchar()@bitIsSingleRow=;--bitGO

关于SQL Server中怎么实现数据行批量插入脚本的存储就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。