Technical Article

Script To Create INSERT statements

,

The following script allows for the scripting of data into insert statement.
The user only needs to set the tablename and a query for the data they require scripted and run.

Note the script takes into account autonumber primary keys and removes them from the insert statement.

Also Note that this script will only work on tables with a Single Primary key and not on either heaps or compound keys.

This script meets my needs but could probably be improved feel free to send me any updates.

/******************************************************************************
**File: sqlDump.sql
**
**Desc: This file allows the scripting of data from a database
**      To aid migration
**Auth: Peter Livesey 
**Date: 14/2/2006 
*******************************************************************************
**Change History
*******************************************************************************
**Date:Author:Description:
**    
*******************************************************************************/



SET ANSI_NULLS ON
SET NOCOUNT ON
DECLARE @Tablename sysname

/*set the table name below to th etable in which the data resides*/SET @Tablename = 'suppliers'
/*change the following query to query for the dat you require scripted
you may include a where statement if required*/
SELECT * INTO #tabledata  FROM suppliers

DECLARE @tab nvarchar(10)
DECLARE @CRLF char(2)
SET @tab= '  '
SET @CRLF=Char(13)+Char(10)

DECLARE @OutPutStatement varchar (4000)
DECLARE @IDname varchar (100)
DECLARE @SQLstring nvarchar (4000)
DECLARE @FieldNames nvarchar (2000)
declare @CurrentID varchar(1000)

CREATE TABLE #CurrentID (id varchar(1000))
CREATE TABLE #Values (value varchar(1000),type varchar(100))






/*we need the name of the id field for the loop as this is the only field we can guarantee unique*/SELECT  @IDname = b.name
FROM 
syscolumns b
INNER JOIN 
sysindexes si
ON
b.id = si.id
and b.colid = si.indid

where b.id = OBJECT_ID(@Tablename)
and indid = 1



/*get the fieldnames from the table except autonumbers*/SELECT  b.name,st.name as stname
into #FieldNames
FROM 
sysobjects a
INNER JOIN
syscolumns b
ON
a.id = b.id
INNER JOIN
systypes st
ON
b.xtype = st.xusertype

where a.id = OBJECT_ID(@Tablename)
and colstat <>1


SET @FieldNames = ''
SELECT  @FieldNames = @FieldNames + b.name + ',' + @CRLF + @tab + @tab 
FROM 
sysobjects a
INNER JOIN
syscolumns b
ON
a.id = b.id

WHERE a.name = @Tablename
and autoval is  null

/*remove trailing comma*/SET @FieldNames = LEFT (@FieldNames,LEN(@FieldNames)-3) 

/*don't go through loop if no key as can't break loop without loop index*/if (coalesce(@idname,'') !='')
BEGIN 
/*begin loop*/while exists (select '*' from #TableData)
BEGIN
/*empty tables for each run through the loop*/delete from #CurrentID
delete from #Values
/*reset  variable for loop*/SET @OutPutStatement = 'INSERT INTO ' + @Tablename  + @CRLF  + @tab +'( ' + @CRLF + @tab + @tab
/* add fieldnames to insert statement*/SET @OutPutStatement= @OutPutStatement + @FieldNames + @CRLF + @tab + ' ) ' + @CRLF +  ' VALUES ' + @CRLF + @tab + ' ( ' 




/* as we have to do this dynamically we will throw 
   the id into a temprary table and then retrieve into a variable*/SET @SQLstring =  'INSERT INTO #CurrentID SELECT  min(CONVERT(varchar(1000),' + @idName + ')) as id FROM #TableData '
EXEC sp_executesql @SQLstring 
SELECT @Currentid = id FROM #CurrentID


 



/*place the values into a temp table*/SET @SQLstring = ''
SELECT @SQLstring  =  @SQLstring + @CRLF  + @CRLF +

   ' INSERT INTO  #Values SELECT CONVERT(varchar(1000),' + name + '),''' + stname  + ''' FROM  #Tabledata WHERE '  + @idname  + ' = ''' + CONVERT(varchar(1000),@currentid) +''''


FROM #Fieldnames

EXEC sp_executesql @SQLstring 

/* now add the values to the ouput statement*/SELECT @OutPutStatement = @OutPutStatement + @CRLF + @tab + @tab +
CASE type
WHEN 'char' THEN   coalesce('''' + replace(value,'''','''''')+ '''','NULL')  
WHEN 'varchar' THEN   coalesce('''' + replace(value,'''','''''')+ '''','NULL')
WHEN 'nvarchar'THEN   coalesce('''' + replace(value,'''','''''')+ '''','NULL')
WHEN 'nchar'THEN   coalesce('''' + replace(value,'''','''''')+ '''','NULL')
WHEN 'text'THEN   coalesce('''' + replace(value,'''','''''')+ '''','NULL')
WHEN 'ntext'THEN   coalesce('''' + replace(value,'''','''''')+ '''','NULL')
WHEN 'uniqueidentifier'THEN   coalesce('''' + value + '''','NULL')
WHEN 'datetime'THEN   coalesce('''' + value + '''','NULL')
ELSE  coalesce(value,'NULL')
END + ','
FROM #Values

/* remove trailing comma again*/SET @OutPutStatement = LEFT (@OutPutStatement,LEN(@OutPutStatement)-1) 

/* finally close the bracket*/SET @OutPutStatement = @OutPutStatement + @CRLF + @tab +  ' ) '

/*output the result*/PRINT @OutPutStatement

/*delete statement to help loop*/SET @SQLstring = N'DELETE FROM #tabledata WHERE ' + @idName + '= ''' + convert(varchar(1000),@currentid ) + ''''
exec sp_executesql @SQLstring 

END
END
ELSE

PRINT ('No Primary Key cannot perform operation')

/*cleanup temp tables*/drop table #Tabledata
drop table #FieldNames
drop table #CurrentID
drop table #Values

Rate

5 (2)

You rated this post out of 5. Change rating

Share

Share

Rate

5 (2)

You rated this post out of 5. Change rating