1
if exists (select * from sysobjects where id =
2
object_id('spu_GenerateInsert'))
3
drop procedure spu_GenerateInsert
4
GO
5
6
7
CREATE PROCEDURE spu_GenerateInsert
8
@table varchar(128)
9
AS
10
26
27
--declare some variables that will be used
28
DECLARE @InsertStmt varchar(8000),
29
@Fields varchar(8000),
30
@SelList varchar(8000),
31
@Data varchar(8000),
32
@ColName varchar(128),
33
@IsChar tinyint,
34
@FldCounter int,
35
@TableData varchar(8000)
36
37
38
--initialize some of the variables
39
SELECT @InsertStmt = 'INSERT INTO ' + @Table + ' (',
40
@Fields = '',
41
@Data = '',
42
@SelList = 'SELECT ',
43
@FldCounter = 0
44
45
46
--create a cursor that loops through the fields in the table
47
--and retrieves the column names and determines the delimiter type that the
48
field needs
49
DECLARE CR_Table CURSOR FAST_FORWARD FOR
50
SELECT COLUMN_NAME,
51
'IsChar' = CASE
52
WHEN DATA_TYPE in ('int', 'money', 'decimal', 'tinyint', 'smallint') THEN
53
0
54
WHEN DATA_TYPE in ('char', 'varchar' ) THEN 1
55
WHEN DATA_TYPE in ('datetime', 'smalldatetime') THEN 2
56
ELSE 9 END
57
FROM INFORMATION_SCHEMA.COLUMNS
58
WHERE table_name = @table
59
AND DATA_TYPE <> 'timestamp'
60
ORDER BY ORDINAL_POSITION
61
FOR READ ONLY
62
OPEN CR_Table
63
FETCH NEXT FROM CR_Table INTO @ColName, @IsChar
64
WHILE (@@fetch_status <> -1)
65
BEGIN
66
IF (@@fetch_status <> -2)
67
BEGIN
68
IF @FldCounter = 0
69
BEGIN
70
SELECT @Fields = @Fields + @ColName + ', '
71
SELECT @SelList = CASE
72
WHEN @IsChar = 1 THEN @SelList + ' ''"'' + ISNULL( REPLACE('+ @ColName
73
+ ', ''"'', ''""''),"") + ''",'' +' + ' '
74
WHEN @IsChar = 2 THEN @SelList + ' ''"'' + ISNULL(CONVERT(varchar(20),'
75
+ @ColName + '),''12/30/1899'') + ''"'' +' + ' '
76
ELSE @SelList + 'ISNULL(CONVERT(varchar(2000),'+@ColName + '),0)' + '+
77
'''' + ' END
78
SELECT @FldCounter = @FldCounter + 1
79
FETCH NEXT FROM CR_Table INTO @ColName, @IsChar
80
END
81
82
83
SELECT @Fields = @Fields + @ColName + ', '
84
SELECT @SelList = CASE
85
WHEN @IsChar = 1 THEN @SelList + ' '',"'' + ISNULL(REPLACE(' + @ColName
86
+ ', ''"'',''""''), "") + ''"'' +' + ' '
87
WHEN @IsChar = 2 THEN @SelList + ' '',"'' + ISNULL(CONVERT(varchar(20),'
88
+ @ColName + '),''12/30/1899'') + ''"'' +' + ' '
89
ELSE @SelList + ' '','' + ISNULL(CONVERT(varchar(2000),'+@ColName +
90
'),0)' + '+' END
91
END
92
FETCH NEXT FROM CR_Table INTO @ColName, @IsChar
93
END
94
CLOSE CR_Table
95
DEALLOCATE CR_Table
96
97
98
SELECT @Fields = SUBSTRING(@Fields, 1,(len(@Fields)-1))
99
--SELECT @Fields AS TheFields
100
101
102
SELECT @SelList = SUBSTRING(@SelList, 1,(len(@SelList)-1))
103
SELECT @SelList = @SelList + ' FROM ' + @table
104
--SELECT @SelList AS TheSelList
105
106
107
SELECT @InsertStmt = @InsertStmt + @Fields + ')'
108
--SELECT @InsertStmt AS TheInsertStmt
109
110
111
--RETURN (0)
112
--go
113
114
115
--for debugging
116
--exec (@SelList)
117
118
119
--now we need to create and load the temp table that will hold the data
120
--that we are going to generate into an insert statement
121
122
123
CREATE TABLE #TheData (TableData varchar(8000))
124
INSERT INTO #TheData (TableData) EXEC (@SelList)
125
126
127
--Cursor through the data to generate the INSERT statement / VALUES clause
128
DECLARE CR_Data CURSOR FAST_FORWARD FOR SELECT TableData FROM #TheData FOR
129
READ ONLY
130
OPEN CR_Data
131
FETCH NEXT FROM CR_Data INTO @TableData
132
WHILE (@@fetch_status <> -1)
133
BEGIN
134
IF (@@fetch_status <> -2)
135
BEGIN
136
PRINT @InsertStmt
137
PRINT ' VALUES (' + @TableData + ')' + char(13) + 'GO'
138
END
139
FETCH NEXT FROM CR_Data INTO @TableData
140
END
141
CLOSE CR_Data
142
DEALLOCATE CR_Data
143
144
145
RETURN (0)
146
147
148
GO
149
150
2
3
4
5
6
7
8
9
10
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150