Ich habe ein einfaches Dienstprogramm erstellt, ich hoffe es gefällt Ihnen.
- Es müssen keine Objekte in der Datenbank erstellt werden (einfach in der Produktionsumgebung zu verwenden).
- Sie brauchen nichts zu installieren. Es ist einfach ein normales Skript.
- Sie benötigen keine besonderen Berechtigungen. Ein normaler Lesezugriff ist ausreichend.
- Sie können alle Zeilen einer Tabelle kopieren oder WHERE-Bedingungen angeben, damit nur die gewünschten Zeilen erzeugt werden.
- Sie können eine einzelne oder mehrere Tabellen und verschiedene zu generierende Bedingungsanweisungen angeben.
Wenn die generierten INSERT-Anweisungen abgeschnitten werden, überprüfen Sie die Begrenzung der Textlänge der Ergebnisse in den Management Studio-Optionen: Tools > Options
, Query Results > SQL Server > Results to Grid
Wert "Non XML data" unter "Maximum Characters Retrieved".
-- Make sure you're on the correct database
SET NOCOUNT ON;
BEGIN TRY
BEGIN TRANSACTION
DECLARE @Tables TABLE (
TableName varchar(50) NOT NULL,
Arguments varchar(1000) NULL
);
-- INSERT HERE THE TABLES AND CONDITIONS YOU WANT TO GENERATE THE INSERT STATEMENTS
INSERT INTO @Tables (TableName, Arguments) VALUES ('table1', 'WHERE field1 = 3101928464');
-- (ADD MORE LINES IF YOU LIKE) INSERT INTO @Tables (TableName, Arguments) VALUES ('table2', 'WHERE field2 IN (1, 3, 5)');
-- YOU DON'T NEED TO EDIT FROM NOW ON.
-- Generating the Script
DECLARE @TableName varchar(50),
@Arguments varchar(1000),
@ColumnName varchar(50),
@strSQL varchar(max),
@strSQL2 varchar(max),
@Lap int,
@Iden int,
@TypeOfData int;
DECLARE C1 CURSOR FOR
SELECT TableName, Arguments FROM @Tables
OPEN C1
FETCH NEXT FROM C1 INTO @TableName, @Arguments;
WHILE @@FETCH_STATUS = 0
BEGIN
-- If you want to delete the lines before inserting, uncomment the next line
-- PRINT 'DELETE FROM ' + @TableName + ' ' + @Arguments
SET @strSQL = 'INSERT INTO ' + @TableName + ' (';
-- List all the columns from the table (to the INSERT into columns...)
SET @Lap = 0;
DECLARE C2 CURSOR FOR
SELECT sc.name, sc.type FROM syscolumns sc INNER JOIN sysobjects so ON so.id = sc.id AND so.name = @TableName AND so.type = 'U' WHERE sc.colstat = 0 ORDER BY sc.colorder
OPEN C2
FETCH NEXT FROM C2 INTO @ColumnName, @TypeOfData;
WHILE @@FETCH_STATUS = 0
BEGIN
IF(@Lap>0)
BEGIN
SET @strSQL = @strSQL + ', ';
END
SET @strSQL = @strSQL + '[' + @ColumnName + ']';
SET @Lap = @Lap + 1;
FETCH NEXT FROM C2 INTO @ColumnName, @TypeOfData;
END
CLOSE C2
DEALLOCATE C2
SET @strSQL = @strSQL + ')'
SET @strSQL2 = 'SELECT ''' + @strSQL + '
SELECT '' + ';
-- List all the columns from the table again (for the SELECT that will be the input to the INSERT INTO statement)
SET @Lap = 0;
DECLARE C2 CURSOR FOR
SELECT sc.name, sc.type FROM syscolumns sc INNER JOIN sysobjects so ON so.id = sc.id AND so.name = @TableName AND so.type = 'U' WHERE sc.colstat = 0 ORDER BY sc.colorder
OPEN C2
FETCH NEXT FROM C2 INTO @ColumnName, @TypeOfData;
WHILE @@FETCH_STATUS = 0
BEGIN
IF(@Lap>0)
BEGIN
SET @strSQL2 = @strSQL2 + ' + '', '' + ';
END
-- For each data type, convert the data properly
IF(@TypeOfData IN (55, 106, 56, 108, 63, 38, 109, 50, 48, 52)) -- Numbers
SET @strSQL2 = @strSQL2 + 'ISNULL(CONVERT(varchar(max), ' + @ColumnName + '), ''NULL'') + '' as ' + @ColumnName + '''';
ELSE IF(@TypeOfData IN (60, 62)) -- Float Numbers
SET @strSQL2 = @strSQL2 + 'ISNULL(CONVERT(varchar(max), CONVERT(decimal(18,5), ' + @ColumnName + ')), ''NULL'') + '' as ' + @ColumnName + '''';
ELSE IF(@TypeOfData IN (61, 111)) -- Datetime
SET @strSQL2 = @strSQL2 + 'ISNULL( '''''''' + CONVERT(varchar(max),' + @ColumnName + ', 121) + '''''''', ''NULL'') + '' as ' + @ColumnName + '''';
ELSE IF(@TypeOfData IN (37, 47, 39, 0, 110)) -- Texts
SET @strSQL2 = @strSQL2 + 'ISNULL('''''''' + RTRIM(LTRIM(' + @ColumnName + ')) + '''''''', ''NULL'') + '' as ' + @ColumnName + '''';
ELSE -- Unknown data types
SET @strSQL2 = @strSQL2 + 'ISNULL(CONVERT(varchar(max), ' + @ColumnName + '), ''NULL'') + '' as ' + @ColumnName + '(INCORRECT TYPE ' + CONVERT(varchar(10), @TypeOfData) + ')''';
SET @Lap = @Lap + 1;
FETCH NEXT FROM C2 INTO @ColumnName, @TypeOfData;
END
CLOSE C2
DEALLOCATE C2
SET @strSQL2 = @strSQL2 + ' as [-- ' + @TableName + ']
FROM ' + @TableName + ' WITH (NOLOCK) ' + @Arguments
SET @strSQL2 = @strSQL2 + ';
';
--PRINT @strSQL;
--PRINT @strSQL2;
EXEC(@strSQL2);
FETCH NEXT FROM C1 INTO @TableName, @Arguments;
END
CLOSE C1
DEALLOCATE C1
ROLLBACK
END TRY
BEGIN CATCH
ROLLBACK TRAN
SELECT 0 AS Situacao;
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage,
@strSQL As strSQL,
@strSQL2 as strSQL2;
END CATCH
9 Stimmen
Wow, ich habe gerade meine Installation überprüft und du hast Recht, das "Skript Tabelle als" -> "EINFÜGEN" gibt dir nur eine Einfügevorlage, nicht eine Seite mit Einfügungen mit deinen tatsächlichen Daten! Ich hoffe, deine Frage wird beantwortet, denn ich hätte auch gerne eine einfache Möglichkeit, das zu tun, was du fragst.
2 Stimmen
@JosephStyons Ich habe die Frage ein wenig aktualisiert, um sie stark zu vereinfachen und zu verdeutlichen, und um sie relevant zu halten. Diese Frage hat sich zu einer wichtigen Frage auf StackOverflow entwickelt, und es wäre schön, die Arbeitsbelastung für Leute, die hier nach einer Lösung suchen, gering zu halten =) Schauen Sie, ob Sie eine der entfernten Informationen wichtig finden. Wenn Sie Einwände gegen die Änderung haben, können Sie sie gerne zurücknehmen.
1 Stimmen
@EvanCarroll Vielen Dank, Evan. Ich habe es zurückgenommen; ich schlage respektvoll vor, dass einige der Hintergrundinformationen nicht nur für den Kontext nützlich sind, sondern auch, um die Frage mit Suchbegriffen aus der realen Welt zu beantworten. Eine Ihrer Änderungen habe ich beibehalten; ich habe den Absatz über Toad for Oracle weggelassen. Das ist wahrscheinlich nicht sehr hilfreich.
3 Stimmen
Ich verwende SSMSBoost. ssmsboost.com