In few business applications inputs to the system is in the form of an TXT / CSV / Excel file(s).
This script will help how to upload an Excel file in to SQL Server.
In few business applications inputs to the system is in the form of an TXT / CSV / Excel file(s).
This script will help how to upload an Excel file in to SQL Server.
-------------- Documentation ------------- Assumptions 1.Excel sheet should be saved in one of the local drives of SQL Server Box. a. Excel sheet must have name “Sheet1” as tab defined, it cannot be renamed. 2.SQL table to which data needs to be exported must already exist in the database 3.SQL Table should have Primary Key defined. 4.The first row of excel sheet should be same as column names of SQL table. The order of the columns in Excel needs to be same as in SQL table, and the names should match exactly. Column names do not support spaces, for example “User name” is invalid. 1.If a column in excel has both integer and character type data, please ensure integer type data is saved as character type data in that column. 1.Uploading data from Excel sheet to SQL will be considered as “Incremental” instead of “Destructive” rebuild. •If the data already exists in SQL, the data gets over-written from Excel table. •New data in Excel will be inserted into SQL table. •Data from SQL table will not be deleted; it needs to be done manually. •Comparison between SQL table and Excel table is based of Primary Key. 2.SQL Server table with columns of following data type is not supported. •ntext •sql_variant •text •binary •image •varbinary Steps to export data 1.Create couple of tables (say “XXX”, “YYY”. Any name should be okay) 2.Create a PK on these tables 3.Save Excel sheet in local drives of SQL Server Box 4.Please ensure Excel file is closed. 5.Using “Query Analyzer” execute the stored procedure. -------------------------- -- Stored Procedure Script -------------------------- IF Exists ( Select * From SysObjects Where Type = 'p' And Name = 'SchedImport_Excel2SQL') Begin PRINT 'Dropping Procedure SchedImport_Excel2SQL' Drop Proc SchedImport_Excel2SQL IF (@@Error <> 0) BEGIN RAISERROR ('Drop Procedure SchedImport_Excel2SQL Failed....',18,127) END End GO PRINT 'Creating Procedure SchedImport_Excel2SQL ' GO ----------------------------------------------------------------------------- -- drop table x -- create table x ( c1 int, c2 int, c3 int ) -- select * from x -- EXEC SchedImport_Excel2SQL @ExcelFilename = 'd:\11.xls', @TableName = 'x' -- EXEC SchedImport_Excel2SQL @ExcelFilename = 'd:\1.xls', @TableName = 'x' ----------------------------------------------------------------------------- SET Quoted_Identifier OFF GO Create Procedure SchedImport_Excel2SQL @ExcelFilename Varchar(8000), @TableName Varchar(8000) AS ------------------------------------------------------------------------------------------ -- Changed By Date Comments ------------------------------------------------------------------------------------------ -- pprabhu 01/07/2003 Created. -- pprabhu 01/10/2003 Changed to handle Excel columnname AS Non-Alphabetical order ------------------------------------------------------------------------------------------ Begin ------------------------- SET NOCOUNT ON SET ARITHABORT OFF SET Quoted_Identifier OFF --SET ANSI_WARNINGS OFF ------------------------- -------------------- -- Declare Variables -------------------- Declare @SQL Varchar(8000), @rc int, @ExcelColumnListing Varchar(8000), @SQLTableColumnListing Varchar(8000), @MinCount Int, @MaxCount Int, @SQL_PK_NonPK_ColumnListMinCtr Int, @SQL_PK_NonPK_ColumnListMaxCtr Int, @SQL_PK_ColumnList Varchar(8000), @SQL_NonPK_ColumnList Varchar(8000), @SQL_PK_NonPK_ColumnListName_Excel Varchar(8000), @SQL_PK_NonPK_ColumnListName_SQL Varchar(8000), @PK_NonPK Int --------------------------------------------------- -- Step 2.1 These variables are used in this STEP --------------------------------------------------- ,@DataFeedname_PK_Clus Int ,@DataFeedname_PK_NonClus Int ,@DataFeedModsName_PK_Clus Int ,@DataFeedModsName_PK_NonClus Int ---------------------------------- -- Initialize / Clean-up Variables ---------------------------------- Select @ExcelFilename = ISNULL(LTRIM(RTRIM(@ExcelFilename)),'') ,@TableName = ISNULL(LTRIM(RTRIM(@TableName)),'') ,@ExcelColumnListing = '' ,@SQLTableColumnListing = '' ---------------------------- -- Initial Level Validations ---------------------------- IF @ExcelFilename = '' Begin RAISERROR ('SchedImport_Excel2SQL : Input EXCEL File Not Passed',18,127) RETURN -1 End IF @TableName = '' Begin RAISERROR ('SchedImport_Excel2SQL : Input TableName Not Passed',18,127) RETURN -1 End IF NOT Exists ( Select * From SysObjects Where Type = 'u' And name = @TableName ) Begin RAISERROR ('SchedImport_Excel2SQL : Input TableName Does not Exists in this database',18,127) RETURN -1 End -------------------------------------- -- Identify if the Input tables has PK -------------------------------------- IF NOT Exists ( Select soc.name From sysobjects soc, sysobjects sop Where soc.id = sop.parent_obj And sop.xtype = 'PK' And soc.name = @TableName ) Begin RAISERROR ('SchedImport_Excel2SQL : - Input Table does not have a Primary Key',18,127) RETURN -1 End ------------------------ -- Create Working tables ------------------------ IF EXISTS ( Select * From Sysobjects Where Name = 'Working_getfiledetails' And Type = 'u' ) Begin Drop Table Working_getfiledetails End Create Table Working_getfiledetails ( [Alternate Name] Varchar(255) ,[Size] Int ,[Creation Date] Int ,[Creation Time] Int ,[Last Written Date] Int ,[Last Written Time] Int ,[Last Accessed Date] Int ,[Last Accessed Time] Int ,[Attributes] Int ) IF EXISTS ( Select * From Sysobjects Where Name = 'Working_Excel2SQLData' And Type = 'u' ) Begin Drop table Working_Excel2SQLData End IF EXISTS ( Select * From Sysobjects Where Name = 'Working_Excel2SQLData_AlphaBetized' And Type = 'u' ) Begin Drop table Working_Excel2SQLData_AlphaBetized End --Select * From Sysobjects Where Name = 'Working_Excel2SQLData_AlphaBetized' And Type = 'u' -------------------------- -- Populate Working tables -------------------------- INSERT INTO Working_getfiledetails EXEC master..xp_getfiledetails @ExcelFilename /* Exec @rc = master..xp_getfiledetails @ExcelFilename IF @RC <> 0 Begin RAISERROR ('SchedImport_Excel2SQL : Input EXCEL File Not Found',18,127) RETURN -1 End */ IF NOT Exists ( Select * From Working_getfiledetails ) Begin RAISERROR ('SchedImport_Excel2SQL : Input EXCEL File Not Found',18,127) RETURN -1 End ---------------------------------- -- Construct the SQL Statement -- SELECT * FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0','Data Source=d:\1.xls;Extended Properties=Excel 8.0')...[sheet1$] ---------------------------------- --Select @SQL = 'SET QUOTED_IDENTIFIER OFF ' + CHAR(10) Select @SQL = 'Data Source=' + @ExcelFilename +';Extended Properties=Excel 8.0' Select @SQL = 'SELECT * INTO ' + 'Working_Excel2SQLData_AlphaBetized' + ' FROM OPENDATASOURCE(' + '''' + 'Microsoft.Jet.OLEDB.4.0' + '''' + ',' + '''' + @SQL + '''' + ')...[sheet1$]' --Select @SQL = '"SET QUOTED_IDENTIFIER OFF ' + char(10) + @SQL + '"' --Select @SQL = 'SET QUOTED_IDENTIFIER OFF ' + CHAR(10) + @SQL --Select @SQL --return exec (@SQL) --SELECT * FROM Working_Excel2SQLData_AlphaBetized --return ----------------------------------------------------- -- If NO Data From Excel File, ignore that Excel File ----------------------------------------------------- IF NOT Exists ( SELECT * FROM Working_Excel2SQLData_AlphaBetized ) Begin RAISERROR ('SchedImport_Excel2SQL : No Input data in EXCEL File. Nothing to upload',18,127) RETURN -1 End ---------------------------------------------- -- If COUNT of Columns in EXCEL Does not match -- the COUNT in SQL, it should be rolled back ---------------------------------------------- IF ( Select Count(*) From SysColumns Where ID = Object_ID(@TableName) ) <> ( Select Count(*) From SysColumns Where ID = Object_ID('Working_Excel2SQLData_AlphaBetized') ) Begin RAISERROR ('SchedImport_Excel2SQL : Number of Columns in SQL Table vs Excel not matching',18,127) RETURN -1 End ------------------------------------------------------------------------------- -- If Names of Columns in EXCEL Does not match in SQL, it should be rolled back ------------------------------------------------------------------------------- IF ( Select Count(*) From SysColumns x, SysColumns s Where s.ID = Object_ID(@TableName) And x.ID = Object_ID('Working_Excel2SQLData_AlphaBetized') --And s.ColID = x.ColID And s.name = x.name ) <> ( Select Count(*) From SysColumns Where ID = Object_ID(@TableName) ) Begin RAISERROR ('SchedImport_Excel2SQL : Columns Names in SQL Table vs Excel not matching',18,127) RETURN -1 End -------------------------------------------------------------------------------------- -- Move the data from [Working_Excel2SQLData_AlphaBetized] Version to required version -------------------------------------------------------------------------------------- Select @SQL = '' ------------------------------------------------------------------- -- Identify the Column names of the Source Table in the COLID order ------------------------------------------------------------------- SELECT @SQLTableColumnListing = '' SELECT @SQLTableColumnListing = COALESCE(CONVERT(VARCHAR(255),@SQLTableColumnListing) + ',', "") + CONVERT(VARCHAR(255),Name) FROM SysColumns WHERE ID = Object_ID(@TableName) Order by ColID Select @SQLTableColumnListing = LTRIM(RTRIM(@SQLTableColumnListing)) IF SubString(@SQLTableColumnListing,1,1) = ',' Begin SELECT @SQLTableColumnListing = SubString(@SQLTableColumnListing,2,datalength(@SQLTableColumnListing)-1) End --SELECT @SQLTableColumnListing Select @SQL = 'SELECT ' + @SQLTableColumnListing + ' INTO ' + 'Working_Excel2SQLData' + ' ' + 'From Working_Excel2SQLData_AlphaBetized' --Select @SQL exec (@SQL) --select * from Working_Excel2SQLData_AlphaBetized --select * from Working_Excel2SQLData --return ------------------------------------------------- -- If DATATYPE of Columns in EXCEL Does not match -- the DATATYPE in SQL, it should be rolled back ------------------------------------------------- -- select xtype, name from master..systypes order by name If Exists ( Select A.* From ( Select 'ExcelColID' = x.ColID, 'ExcelName' = x.Name, 'ExcelxType' = x.xtype, Case x.xtype When 127 Then 56 -- BigInt to Int When 104 Then 56 -- bit to Int When 106 Then 56 -- decimal to Int When 56 Then 56 -- Int to Int When 62 Then 56 -- float to Int When 60 Then 56 -- money to Int When 108 Then 56 -- numeric to Int When 59 Then 56 -- real to Int When 52 Then 56 -- smallint to Int When 122 Then 56 -- smallmoney to Int When 48 Then 56 -- tinyint to Int When 175 Then 175 -- char to Char When 239 Then 175 -- nchar to Char When 99 Then 175 -- ntext to Char When 231 Then 175 -- nvarchar to Char When 231 Then 175 -- sysname to Char When 98 Then 175 -- sql_variant to Char When 35 Then 175 -- text to Char When 189 Then 175 -- timestamp to Char When 36 Then 175 -- uniqueidentifier to Char When 167 Then 175 -- varchar to Char When 173 Then 175 -- binary to Char When 34 Then 175 -- image to Char When 165 Then 175 -- varbinary to Char When 61 Then 61 -- datetime to datetime When 58 Then 61 -- smalldatetime to datetime Else 175 -- Unknown to Char End AS ExcelColumnType, 'SQLColID' = s.ColID, 'SQLName' = s.Name, 'SQLxType' = s.xtype, Case s.xtype When 127 Then 56 -- BigInt to Int When 104 Then 56 -- bit to Int When 106 Then 56 -- decimal to Int When 56 Then 56 -- Int to Int When 62 Then 56 -- float to Int When 60 Then 56 -- money to Int When 108 Then 56 -- numeric to Int When 59 Then 56 -- real to Int When 52 Then 56 -- smallint to Int When 122 Then 56 -- smallmoney to Int When 48 Then 56 -- tinyint to Int When 175 Then 175 -- char to Char When 239 Then 175 -- nchar to Char When 99 Then 175 -- ntext to Char When 231 Then 175 -- nvarchar to Char When 231 Then 175 -- sysname to Char When 98 Then 175 -- sql_variant to Char When 35 Then 175 -- text to Char When 189 Then 175 -- timestamp to Char When 36 Then 175 -- uniqueidentifier to Char When 167 Then 175 -- varchar to Char When 173 Then 175 -- binary to Char When 34 Then 175 -- image to Char When 165 Then 175 -- varbinary to Char When 61 Then 61 -- datetime to datetime When 58 Then 61 -- smalldatetime to datetime Else 175 -- Unknown to Char End AS SQLColumnType From SysColumns x, SysColumns s Where x.ID = Object_ID('Working_Excel2SQLData') And s.ID = Object_ID(@TableName) --And s.ID = Object_ID('x') And x.ColID = s.ColID ) As A Where A.ExcelColumnType <> A.SQLColumnType ) Begin RAISERROR ('SchedImport_Excel2SQL : Column datatype between Excel table & SQL table does not match',18,127) RETURN -1 End ---------------------------------------------------------------------------------- -- If Data in 'Working_Excel2SQLData' is NULL, check if @TableName will support it ---------------------------------------------------------------------------------- -- select isnullable , * from syscolumns where id=Object_id('y') -- 1 - Null, 0 - not null IF Exists ( Select s.ColId, s.Name, x.ColId, x.Name From SysColumns x, SysColumns s Where x.ID = Object_ID('Working_Excel2SQLData') And s.ID = Object_ID(@TableName) --And s.ID = Object_ID('x') And x.ColID = s.ColID And s.isnullable = 0 -- 1 - Null, 0 - not null ) Begin Select @MinCount = ISNULL(MIN(ColID),0) ,@MaxCount = ISNULL(MAX(ColID),0) From SysColumns Where ID = Object_ID(@TableName) --Where ID = Object_ID('x') --Select @MinCount, @MaxCount Select @SQL = '' While @MinCount <= @MaxCount Begin IF Exists ( Select * From SysColumns Where ID = Object_ID(@TableName) --Where ID = Object_ID('x') And ColID = @MinCount And isnullable = 0 -- 1 - Null, 0 - not null ) Begin IF @SQL = '' -- Reading the Very First Column Begin Select @SQL = @SQL + Name + ' IS NULL ' From SysColumns Where ID = Object_ID('Working_Excel2SQLData') And ColID = @MinCount End ELSE -- Reading the 2nd, 3rd, 4th.... Columns Begin Select @SQL = @SQL + ' OR ' + Name + ' IS NULL ' From SysColumns Where ID = Object_ID('Working_Excel2SQLData') And ColID = @MinCount End End Select @MinCount = @MinCount + 1 End Select @SQL = 'Select x = Count(*) From Working_Excel2SQLData ' + 'Where 1=1 AND ( ' + @SQL + ' ) ' ----------------------------------------- -- Count if ANY Null values in EXCEL file ----------------------------------------- IF Exists ( Select * from sysobjects where name = 'ExcelTableCounts' And Type = 'u' ) Begin Drop Table ExcelTableCounts End Create table ExcelTableCounts ( x int ) Insert INTO ExcelTableCounts (x) EXEC (@SQL) IF Exists ( Select * From ExcelTableCounts Where x > 0 ) Begin RAISERROR ('SchedImport_Excel2SQL : Excel sheet has some NULL data, in some Column(s), which cannot be uploaded',18,127) RETURN -1 End IF Exists ( Select * from sysobjects where name = 'ExcelTableCounts' And Type = 'u' ) Begin Drop Table ExcelTableCounts End End -------------------------------- -- Finally Insert into the Table -------------------------------- --~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- 1. Identify the Columns of the Excel table --~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ SELECT @ExcelColumnListing = '' SELECT @ExcelColumnListing = COALESCE(CONVERT(VARCHAR(255),@ExcelColumnListing) + ',', "") + CONVERT(VARCHAR(255),Name) FROM SysColumns WHERE ID = Object_ID('Working_Excel2SQLData') Order by ColID Select @ExcelColumnListing = LTRIM(RTRIM(@ExcelColumnListing)) IF SubString(@ExcelColumnListing,1,1) = ',' Begin SELECT @ExcelColumnListing = SubString(@ExcelColumnListing,2,datalength(@ExcelColumnListing)-1) End --SELECT @ExcelColumnListing --~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- 2. Identify the Columns of the SQL table --~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ SELECT @SQLTableColumnListing = '' SELECT @SQLTableColumnListing = COALESCE(CONVERT(VARCHAR(255),@SQLTableColumnListing) + ',', "") + CONVERT(VARCHAR(255),Name) FROM SysColumns WHERE ID = Object_ID(@TableName) Order by ColID Select @SQLTableColumnListing = LTRIM(RTRIM(@SQLTableColumnListing)) IF SubString(@SQLTableColumnListing,1,1) = ',' Begin SELECT @SQLTableColumnListing = SubString(@SQLTableColumnListing,2,datalength(@SQLTableColumnListing)-1) End --SELECT @SQLTableColumnListing --~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- 3. If data already exists (based on PK column matching), replace them with new data --~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Select @SQL = '' ----------------------------------------------------------------- -- Step 1 : Drop / Create Work table to identify all the Columns ----------------------------------------------------------------- If Exists ( Select * From Sysobjects Where Name = 'WorkColumnListing_With_PKNonPKCol' And Type = 'u' ) Begin Drop Table WorkColumnListing_With_PKNonPKCol IF @@Error <> 0 Begin RAISERROR ('SchedImport_Excel2SQL : - Drop Table WorkColumnListing_With_PKNonPKCol Failed',18,127) RETURN -1 End End Create table WorkColumnListing_With_PKNonPKCol ( ColId INT, SQLName SysName, ExcelName SysName, PK_NonPK Int ) IF @@Error <> 0 Begin RAISERROR ('SchedImport_Excel2SQL : - Create Table WorkColumnListing_With_PKNonPKCol Failed',18,127) RETURN -1 End -------------------------------- -- Step 2 : Populate Work table -------------------------------- -- Select * from WorkColumnListing_With_PKNonPKCol Insert INTO WorkColumnListing_With_PKNonPKCol ( ColId , SQLName, ExcelName, PK_NonPK ) Select s.ColId, s.Name, x.Name, PK_NonPK = 0 From SysColumns x, SysColumns s Where x.ID = Object_ID('Working_Excel2SQLData') And s.ID = Object_ID(@TableName) --And s.ID = Object_ID('x') And x.ColID = s.ColID Order by s.ColID IF @@Error <> 0 Begin RAISERROR ('SchedImport_Excel2SQL : - Populate Table WorkColumnListing_With_PKNonPKCol Failed',18,127) RETURN -1 End --------------------------------------------------------------------------------------------------- -- Step 2.1 Identify the Primary Key names & its Type, if its Clustered on Non-Clustered - Starts --------------------------------------------------------------------------------------------------- Exec @RC = SchedImport_DataFeedIndexType_Status @DataFeedname = @TableName ,@DataFeedModsName = @TableName ----- Take Care of this value ,@DataFeedname_PK_Clus = @DataFeedname_PK_Clus OUTPUT ,@DataFeedname_PK_NonClus = @DataFeedname_PK_NonClus OUTPUT ,@DataFeedModsName_PK_Clus = @DataFeedModsName_PK_Clus OUTPUT ,@DataFeedModsName_PK_NonClus = @DataFeedModsName_PK_NonClus OUTPUT IF @RC <> 0 Begin RAISERROR ('SchedImport_Populate : Error executing SchedImport_DataFeedIndexType_Status',18,127) RETURN -1 End --Select @DataFeedname_PK_Clus, @DataFeedname_PK_NonClus, @DataFeedModsName_PK_Clus, @DataFeedModsName_PK_NonClus --return --------------------------------------------------------------------------------------------------- -- Step 2.1 Identify the Primary Key names & its Type, if its Clustered on Non-Clustered - Ends --------------------------------------------------------------------------------------------------- --------------------------------------------------- -- Step 3 : Identify Which of these are PK Columns --------------------------------------------------- Select @SQL_PK_NonPK_ColumnListMinCtr = ISNULL(MIN(ColId),0), @SQL_PK_NonPK_ColumnListMaxCtr = ISNULL(MAX(ColId),0) From WorkColumnListing_With_PKNonPKCol While @SQL_PK_NonPK_ColumnListMinCtr <= @SQL_PK_NonPK_ColumnListMaxCtr Begin IF (INDEX_COL(@TableName, 1, @SQL_PK_NonPK_ColumnListMinCtr)) IS NOT Null OR (INDEX_COL(@TableName, 2, @SQL_PK_NonPK_ColumnListMinCtr)) IS NOT Null Begin IF (INDEX_COL(@TableName, 1, @SQL_PK_NonPK_ColumnListMinCtr)) IS NOT Null AND @DataFeedName_PK_Clus = 1 Begin Update WorkColumnListing_With_PKNonPKCol Set PK_NonPK = 1 -- These are PK columns --Where ColId = @SQL_PK_NonPK_ColumnListMinCtr Where SQLName = INDEX_COL(@TableName, 1, @SQL_PK_NonPK_ColumnListMinCtr) IF @@Error <> 0 Begin RAISERROR ('SchedImport_Excel2SQL : - Update Table WorkColumnListing_With_PKNonPKCol Failed',18,127) RETURN -1 End End IF (INDEX_COL(@TableName, 2, @SQL_PK_NonPK_ColumnListMinCtr)) IS NOT Null AND @DataFeedName_PK_NonClus = 1 Begin Update WorkColumnListing_With_PKNonPKCol Set PK_NonPK = 1 -- These are PK columns --Where ColId = @SQL_PK_NonPK_ColumnListMinCtr Where SQLName = INDEX_COL(@TableName, 2, @SQL_PK_NonPK_ColumnListMinCtr) IF @@Error <> 0 Begin RAISERROR ('SchedImport_Excel2SQL : - Update Table WorkColumnListing_With_PKNonPKCol Failed',18,127) RETURN -1 End End End Select @SQL_PK_NonPK_ColumnListMinCtr = @SQL_PK_NonPK_ColumnListMinCtr + 1 End --select * from WorkColumnListing_With_PKNonPKCol --return ----------------------------------------------------------------------------- -- Step 4 : Rest of then Non-PK columns used for comparison of data EQUALITY -- Generate SQL statement of NON-PK & PK Columns explicitly. ----------------------------------------------------------------------------- Select @SQL_PK_ColumnList = '' Select @SQL_NonPK_ColumnList = '' Select @SQL_PK_NonPK_ColumnListMinCtr = ISNULL(MIN(ColId),0), @SQL_PK_NonPK_ColumnListMaxCtr = ISNULL(MAX(ColId),0) From WorkColumnListing_With_PKNonPKCol While @SQL_PK_NonPK_ColumnListMinCtr <= @SQL_PK_NonPK_ColumnListMaxCtr Begin IF Exists ( Select * From WorkColumnListing_With_PKNonPKCol Where ColId = @SQL_PK_NonPK_ColumnListMinCtr ) Begin Select @SQL_PK_NonPK_ColumnListName_Excel = ExcelName ,@SQL_PK_NonPK_ColumnListName_SQL = SQLName ,@PK_NonPK = PK_NonPK From WorkColumnListing_With_PKNonPKCol Where ColId = @SQL_PK_NonPK_ColumnListMinCtr --Select @SQL_PK_NonPK_ColumnListName, @PK_NonPK IF @PK_NonPK = 0 -- 0 : NonPk, generate "OR" clause SQL Begin IF @SQL_NonPK_ColumnList = '' -- Reading the Very First Column Begin Select @SQL_NonPK_ColumnList = @SQL_NonPK_ColumnList + 's.' + @SQL_PK_NonPK_ColumnListName_SQL + ' = ' + ' x.' + @SQL_PK_NonPK_ColumnListName_Excel + ' ' End ELSE -- Reading the 2nd, 3rd, 4th.... Columns Begin Select @SQL_NonPK_ColumnList = @SQL_NonPK_ColumnList + ' , ' + 's.' + @SQL_PK_NonPK_ColumnListName_SQL + ' = ' + ' x.' + @SQL_PK_NonPK_ColumnListName_Excel + ' ' End End ELSE --IF @PK_NonPK = 1 -- : PK, generate "JOIN Column" clause SQL Begin IF @SQL_PK_ColumnList = '' -- Reading the Very First Column Begin Select @SQL_PK_ColumnList = @SQL_PK_ColumnList + '( s.' + @SQL_PK_NonPK_ColumnListName_SQL + ' = ' + ' x.' + @SQL_PK_NonPK_ColumnListName_Excel + ' ) ' End ELSE -- Reading the 2nd, 3rd, 4th.... Columns Begin Select @SQL_PK_ColumnList = + @SQL_PK_ColumnList + ' AND ' + '( s.' + @SQL_PK_NonPK_ColumnListName_SQL + ' = ' + ' x.' + @SQL_PK_NonPK_ColumnListName_Excel + ' ) ' End End End Select @SQL_PK_NonPK_ColumnListMinCtr = @SQL_PK_NonPK_ColumnListMinCtr + 1 End -------------------------------------------------------------- -- Ensure that EXCEL file has no duplicates in the PK columns -------------------------------------------------------------- Select @SQL = '' SELECT @SQL = COALESCE(CONVERT(VARCHAR(255),@SQL) + ',', "") + CONVERT(VARCHAR(255),SQLName) FROM WorkColumnListing_With_PKNonPKCol WHERE PK_NonPK = 1 Select @SQL = LTRIM(RTRIM(@SQL)) IF SubString(@SQL,1,1) = ',' Begin SELECT @SQL = SubString(@SQL,2,datalength(@SQL)-1) End --SELECT @SQL /* Select x = Count(*) From Working_Excel2SQLData Group By Title,Description Having Count(*) > 1 */ Select @SQL = ' Select x = Count(*) ' + ' From Working_Excel2SQLData ' + ' Group By ' + @SQL + ' Having Count(*) > 1 ' --SELECT @SQL --return ---------------------------------------------------------------- -- Count if ANY Duplicate values in EXCEL file esp. in PK Column ---------------------------------------------------------------- IF Exists ( Select * from sysobjects where name = 'ExcelTableCounts' And Type = 'u' ) Begin Drop Table ExcelTableCounts End Create table ExcelTableCounts ( x int ) Insert INTO ExcelTableCounts (x) EXEC (@SQL) IF Exists ( Select * From ExcelTableCounts Where x > 0 ) Begin RAISERROR ('SchedImport_Excel2SQL : Excel sheet has some Duplicate data, in PK columns',18,127) RETURN -1 End --SELECT * From ExcelTableCounts --return IF Exists ( Select * from sysobjects where name = 'ExcelTableCounts' And Type = 'u' ) Begin Drop Table ExcelTableCounts End ------------------------------ -- Clean Column List Variable ------------------------------ Select @SQL_PK_ColumnList = LTRIM(RTRIM(ISNULL(@SQL_PK_ColumnList,''))) Select @SQL_NonPK_ColumnList = LTRIM(RTRIM(ISNULL(@SQL_NonPK_ColumnList,''))) --Select '@SQL_PK_ColumnList', @SQL_PK_ColumnList --Select '@SQL_NonPK_ColumnList' , @SQL_NonPK_ColumnList --return ------------------------------- -- Update the Existing records ------------------------------- /* Update s Set s.c2 = x.b, s.c4 = x.d, s.c5 = x.e From x s, Working_Excel2SQLData x Where 1=1 AND ( ( s.c1 = x.a ) AND ( s.c3 = x.c ) ) */ Select @SQL = '' Select @SQL = 'Update s ' + 'Set ' + @SQL_NonPK_ColumnList + ' ' + 'From ' + @TableName + ' s, Working_Excel2SQLData x ' + 'Where 1=1 AND ' + '(' + @SQL_PK_ColumnList + ')' --Select @SQL --return Exec (@SQL) --~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- 4. Delete the Updated records --~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Select @SQL = '' Select @SQL = 'Delete x ' + 'From ' + @TableName + ' s, Working_Excel2SQLData x ' + 'Where 1=1 AND ' + '(' + @SQL_PK_ColumnList + ')' --Select @SQL --return Exec (@SQL) --~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- 5. Comute INSERT Query (Only new data gets inserted) --~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Select @SQL = '' Select @SQL = ' Insert INTO ' + @TableName + '(' + @SQLTableColumnListing + ')' + ' Select ' + @ExcelColumnListing + ' From ' + ' Working_Excel2SQLData ' --Select @SQL --return Exec (@SQL) ------------------------------ -- Delete all un-wanted tables ------------------------------ IF EXISTS ( Select * From Sysobjects Where Name = 'Working_getfiledetails' And Type = 'u' ) Begin Drop Table Working_getfiledetails End IF EXISTS ( Select * From Sysobjects Where Name = 'Working_Excel2SQLData' And Type = 'u' ) Begin Drop table Working_Excel2SQLData End IF EXISTS ( Select * From Sysobjects Where Name = 'Working_Excel2SQLData_AlphaBetized' And Type = 'u' ) Begin Drop table Working_Excel2SQLData_AlphaBetized End If Exists ( Select * From Sysobjects Where Name = 'WorkColumnListing_With_PKNonPKCol' And Type = 'u' ) Begin Drop Table WorkColumnListing_With_PKNonPKCol IF @@Error <> 0 Begin RAISERROR ('SchedImport_Excel2SQL : - Drop Table WorkColumnListing_With_PKNonPKCol Failed',18,127) RETURN -1 End End End GO IF @@error = 0 Begin Print 'Created Procedure SchedImport_Excel2SQL Sucessfully !!!' End ELSE Begin RaisError ( 'Procedure SchedImport_Excel2SQL Creation Failed ...', 18,127) End GO