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


浙公网安备 33010602011771号