J'ai SQL Server 2008
, SQL Server Management Studio.
Je dois sélectionner des données à partir de Table1
dans la base de données1. Ensuite, je dois éditer certaines valeurs dans les résultats et insert values into Table1
dans database2.
Ou laissez-moi le dire autrement.
Comment puis-je convertir les données d'une table en insert script
.
SSMS Toolpack (qui est FREE comme dans beer) a une variété d’excellentes fonctionnalités - y compris générer des instructions INSERT à partir de tables.
Mise à jour: pour SQL Server Management Studio 2012 (et plus récente), SSMS Toolpack n'est plus libre, mais nécessite un faible coût de licence.
Voici une autre méthode, qui peut s'avérer plus simple que d'installer des plugins ou des outils externes dans certaines situations:
select [whatever you need]
INTO temp.table_name
from [... etc ...]
.temp.table_name
dans l'écran "Choisir les objets", cliquez sur Suivant.INSERT
résultantes dans une nouvelle fenêtre de requête.[temp.table_name]
par [your_table_name]
.drop table [temp.table_name]
.Méthode native :
par exemple si vous avez une table
Users(Id, name)
Tu peux le faire:
select 'insert into Table values(Id=' + Id + ', name=' + name + ')' from Users
Dans SSMS:
Faites un clic droit sur la base de données> Tâches> Générer des scripts
Suivant
Sélectionnez "Sélectionner des objets de base de données spécifiques" et cochez la table de votre choix, puis cliquez sur Suivant.
Cliquez sur Advanced >
dans la liste des options, faites défiler l'écran vers le bas, recherchez les "Types de données dans un script" et remplacez-le par "Données uniquement"> OK.
Sélectionnez "Enregistrer dans une nouvelle fenêtre de requête"> Suivant> Suivant> Terminer.
Les 180 lignes sont maintenant toutes écrites en 180 instructions d’insertion!
1- Explication des scripts
A) La syntaxe pour insérer des données dans un tableau est la suivante
Insert into table(col1,col2,col3,col4,col5)
-- To achieve this part i
--have used below variable
------@CSV_COLUMN-------
values(Col1 data in quote, Col2..quote,..Col5..quote)
-- To achieve this part
-- i.e column data in
--quote i have used
--below variable
----@QUOTED_DATA---
C) Obtenir les données ci-dessus à partir de fichiers existants table nous devons écrire le select requête de telle manière que la sortie sera sous la forme de comme ci-dessus des scripts
D) Ensuite, j'ai concaténé variable ci-dessus pour créer script final qui sera volonté générer un script d'insertion à l'exécution
E)
@TEXT='SELECT ''INSERT INTO
'+@TABLE_NAME+'('+@CSV_COLUMN+')VALUES('''+'+'+SUBSTRING(@QUOTED_DATA,1,LEN(@QUOTED_DATA)-5)+'+'+''')'''+' Insert_Scripts FROM '+@TABLE_NAME + @FILTER_CONDITION
F) Et enfin exécuté la requête ci-dessus EXECUTE(TEXT)
G) QUOTENAME()
fonction est utilisée pour envelopper données de colonne à l'intérieur de la citation
H) ISNULL
est utilisé parce que si une ligne a NULL
données pour n'importe quelle colonne où la requête échoue et retourner NULL
c'est pourquoi éviter que j'ai utilisé ISNULL
I) Et créé le sp sp_generate_insertscripts
pour même
1- Il suffit de mettre le nom de la table pour laquelle vous voulez insert script
2- Filtrez la condition si vous voulez des résultats spécifiques
----------Final Procedure To generate Script------
CREATE PROCEDURE sp_generate_insertscripts
(
@TABLE_NAME VARCHAR(MAX),
@FILTER_CONDITION VARCHAR(MAX)=''
)
AS
BEGIN
SET NOCOUNT ON
DECLARE @CSV_COLUMN VARCHAR(MAX),
@QUOTED_DATA VARCHAR(MAX),
@TEXT VARCHAR(MAX)
SELECT @CSV_COLUMN=STUFF
(
(
SELECT ',['+ NAME +']' FROM sys.all_columns
WHERE OBJECT_ID=OBJECT_ID(@TABLE_NAME) AND
is_identity!=1 FOR XML PATH('')
),1,1,''
)
SELECT @QUOTED_DATA=STUFF
(
(
SELECT ' ISNULL(QUOTENAME('+NAME+','+QUOTENAME('''','''''')+'),'+'''NULL'''+')+'','''+'+' FROM sys.all_columns
WHERE OBJECT_ID=OBJECT_ID(@TABLE_NAME) AND
is_identity!=1 FOR XML PATH('')
),1,1,''
)
SELECT @TEXT='SELECT ''INSERT INTO '+@TABLE_NAME+'('+@CSV_COLUMN+')VALUES('''+'+'+SUBSTRING(@QUOTED_DATA,1,LEN(@QUOTED_DATA)-5)+'+'+''')'''+' Insert_Scripts FROM '+@TABLE_NAME + @FILTER_CONDITION
--SELECT @CSV_COLUMN AS CSV_COLUMN,@QUOTED_DATA AS QUOTED_DATA,@TEXT TEXT
EXECUTE (@TEXT)
SET NOCOUNT OFF
END
Il est possible de le faire via Visual Studio Explorateur d'objets SQL Server.
Vous pouvez cliquer sur "Afficher les données" dans le menu contextuel pour obtenir la table nécessaire, filtrer les résultats et enregistrer le résultat en tant que script.
À l'aide de Visual Studio, procédez comme suit:
Créez un projet de type SQL Server -> Projet de base de données SQL Server
ouvrez l'explorateur SQL Server CTL- \, CTL-S
ajoutez un serveur SQL en cliquant avec le bouton droit de la souris sur l’icône SQL SERVER. Selcet AJOUTER UN NOUVEAU SERVEUR
naviguez jusqu'à la table qui vous intéresse
clic droit -> VIEW DATA
Cliquez sur la cellule en haut à gauche pour tout mettre en évidence (ctl-A ne semble pas fonctionner)
Clic droit -> SCript
C'est fabuleux. J'ai essayé tout ce qui est énuméré ci-dessus au fil des ans. Je sais qu’il existe un outil permettant de faire cela et bien plus encore, je ne peux pas penser au nom de celui-ci. Mais c'est très cher.
Bonne chance. Je viens de comprendre cela. Je ne l'ai pas testé de manière approfondie avec les champs de texte, etc., mais il semblerait que cela vous fasse perdre beaucoup de temps.
Greg
Créez une table séparée à l'aide de l'instruction into Par exemple
Sélectionnez * dans Test_123 dans [dbo]. [Employé] où Nom comme '% Test%'
Allez dans la base de données Cliquez avec le bouton droit de la souris sur la base de donnéesCliquez sur Générer le scriptSélectionnez votre tableSélectionnez l’option advanace et sélectionnez l’attribut "Données uniquement" Sélectionnez le fichier "ouvrir dans une nouvelle requête"
SQL va générer un script pour vous
Vous pouvez choisir l’option «Résultat dans le fichier» dans SSMS et exporter votre résultat sélectionné dans un fichier et apporter vos modifications dans le fichier de résultats. Vous pouvez enfin utiliser BCP - Bulk copy dans le tableau 1 de la base de données 2.
Je pense que pour l'insertion en bloc, vous devez convertir le fichier .rpt en fichier .csv
J'espère que ça va aider.
C'est une solution plus polyvalente (qui peut faire un peu plus que la question) et qui peut être utilisée dans une fenêtre de requête sans avoir à créer un nouveau proc stocké - utile dans les bases de données de production, par exemple, où vous n'avez pas d'accès en écriture. .
Pour utiliser le code, veuillez modifier en fonction des commentaires en ligne expliquant son utilisation. Vous pouvez ensuite simplement exécuter cette requête dans une fenêtre de requête et les instructions INSERT dont vous avez besoin seront imprimées.
SET NOCOUNT ON
-- Set the ID you wish to filter on here
DECLARE @id AS INT = 123
DECLARE @tables TABLE (Name NVARCHAR(128), IdField NVARCHAR(128), IdInsert BIT, Excluded NVARCHAR(128))
-- Add any tables you wish to generate INSERT statements for here. The fields are as thus:
-- Name: Your table name
-- IdField: The field on which to filter the dataset
-- IdInsert: If the primary key field is to be included in the INSERT statement
-- Excluded: Any fields you do not wish to include in the INSERT statement
INSERT INTO @tables (Name, IdField, IdInsert, Excluded) VALUES ('MyTable1', 'Id', 0, 'Created,Modified')
INSERT INTO @tables (Name, IdField, IdInsert, Excluded) VALUES ('MyTable2', 'Id', 1, 'Created,Modified')
DECLARE @numberTypes TABLE (sysId TINYINT)
-- This will ensure INT and BIT types are not surrounded with quotes in the
-- resultant INSERT statement, but you may need to add more (from sys.types)
INSERT @numberTypes(SysId) VALUES(56),(104)
DECLARE @rows INT = (SELECT COUNT(*) FROM @tables)
DECLARE @cnt INT = 1
DECLARE @results TABLE (Sql NVARCHAR(4000))
WHILE @cnt <= @rows
BEGIN
DECLARE @tablename AS NVARCHAR(128)
DECLARE @idField AS NVARCHAR(128)
DECLARE @idInsert AS BIT
DECLARE @excluded AS NVARCHAR(128)
SELECT
@tablename = Name,
@idField = IdField,
@idInsert = IdInsert,
@excluded = Excluded
FROM (SELECT *, ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS RowId FROM @tables) t WHERE t.RowId = @cnt
DECLARE @excludedFields TABLE (FieldName NVARCHAR(128))
DECLARE @xml AS XML = CAST(('<X>' + REPLACE(@excluded, ',', '</X><X>') + '</X>') AS XML)
INSERT INTO @excludedFields SELECT N.value('.', 'NVARCHAR(128)') FROM @xml.nodes('X') AS T(N)
DECLARE @setIdentity NVARCHAR(128) = 'SET IDENTITY_INSERT ' + @tablename
DECLARE @execsql AS NVARCHAR(4000) = 'SELECT ''' + CASE WHEN @idInsert = 1 THEN @setIdentity + ' ON' + CHAR(13) ELSE '' END + 'INSERT INTO ' + @tablename + ' ('
SELECT @execsql = @execsql +
STUFF
(
(
SELECT CASE WHEN NOT EXISTS(SELECT * FROM @excludedFields WHERE FieldName = name) THEN ', ' + name ELSE '' END
FROM sys.columns
WHERE object_id = OBJECT_ID('dbo.' + @tablename)
FOR XML PATH('')
), 1, 2, ''
) +
')' + CHAR(13) + 'VALUES (' +
STUFF
(
(
SELECT
CASE WHEN NOT EXISTS(SELECT * FROM @excludedFields WHERE FieldName = name) THEN
''', '' + ISNULL(' +
CASE WHEN EXISTS(SELECT * FROM @numberTypes WHERE SysId = system_type_id) THEN '' ELSE ''''''''' + ' END +
'CAST(' + name + ' AS VARCHAR)' +
CASE WHEN EXISTS(SELECT * FROM @numberTypes WHERE SysId = system_type_id) THEN '' ELSE ' + ''''''''' END +
', ''NULL'') + '
ELSE ''
END
FROM sys.columns
WHERE object_id = OBJECT_ID('dbo.' + @tablename)
FOR XML PATH('')
), 1, 3, ''
) +
''')' + CASE WHEN @idInsert = 1 THEN CHAR(13) + @setIdentity + ' OFF' ELSE '' END +
''' FROM ' + @tablename + ' WHERE ' + @idField + ' = ' + CAST(@id AS VARCHAR)
INSERT @results EXEC (@execsql)
DELETE @excludedFields
SET @cnt = @cnt + 1
END
DECLARE cur CURSOR FOR SELECT Sql FROM @results
OPEN cur
DECLARE @sql NVARCHAR(4000)
FETCH NEXT FROM cur INTO @sql
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @sql
FETCH NEXT FROM cur INTO @sql
END
CLOSE cur
DEALLOCATE cur
Vous pouvez utiliser une instruction INSERT INTO SELECT
pour insérer les résultats d'une requête de sélection dans une table. http://www.w3schools.com/sql/sql_insert_into_select.asp
Exemple:
INSERT INTO Customers (CustomerName, Country) SELECT SupplierName, Country FROM Suppliers WHERE Country='Germany';
J'ai eu un problème similaire, mais j'avais besoin de pouvoir créer une instruction INSERT à partir d'une requête (avec des filtres, etc.)
J'ai donc créé la procédure suivante:
CREATE PROCEDURE dbo.ConvertQueryToInsert (@input NVARCHAR(max), @target NVARCHAR(max)) AS BEGIN
DECLARE @fields NVARCHAR(max);
DECLARE @select NVARCHAR(max);
-- Get the defintion from sys.columns and assemble a string with the fields/transformations for the dynamic query
SELECT
@fields = COALESCE(@fields + ', ', '') + '[' + name +']',
@select = COALESCE(@select + ', ', '') + ''''''' + ISNULL(CAST([' + name + '] AS NVARCHAR(max)), ''NULL'')+'''''''
FROM tempdb.sys.columns
WHERE [object_id] = OBJECT_ID(N'tempdb..'+@input);
-- Run the a dynamic query with the fields from @select into a new temp table
CREATE TABLE #ConvertQueryToInsertTemp (strings nvarchar(max))
DECLARE @stmt NVARCHAR(max) = 'INSERT INTO #ConvertQueryToInsertTemp SELECT '''+ @select + ''' AS [strings] FROM '+@input
exec sp_executesql @stmt
-- Output the final insert statement
SELECT 'INSERT INTO ' + @target + ' (' + @fields + ') VALUES (' + REPLACE(strings, '''NULL''', 'NULL') +')' FROM #ConvertQueryToInsertTemp
-- Clean up temp tables
DROP TABLE #ConvertQueryToInsertTemp
SET @stmt = 'DROP TABLE ' + @input
exec sp_executesql @stmt
END
Vous pouvez ensuite l'utiliser en écrivant le résultat de votre requête dans une table temporaire et en exécutant la procédure:
-- Example table
CREATE TABLE Dummy (Id INT, Comment NVARCHAR(50), TimeStamp DATETIME)
INSERT INTO Dummy VALUES (1 , 'Foo', GetDate()), (2, 'Bar', GetDate()), (3, 'Foo Bar', GetDate())
-- Run query and procedure
SELECT * INTO #TempTableForConvert FROM Dummy WHERE Id < 3
EXEC dbo.ConvertQueryToInsert '#TempTableForConvert', 'dbo.Dummy'
Remarque: Cette procédure convertit uniquement les valeurs en une chaîne, ce qui peut donner un aspect légèrement différent aux données. Avec DATETIME par exemple, les secondes seront perdues.
Vous pouvez utiliser des packages de services d'intégration de serveur SQL spécialement conçus pour l'opération Import/Export.
VS a un paquet pour développer ces paquets si vous installez complètement Sql Server.
Services d'intégration dans Business Intelligence Development Studio
Je pense que c'est également possible avec les requêtes ad hoc Vous pouvez exporter le résultat dans un fichier Excel, puis importer ce fichier dans votre objet datatable ou l'utiliser tel quel, puis importer le fichier Excel dans la deuxième base de données ce lien cela peut vous aider beaucoup.
http://vscontrols.blogspot.com/2010/09/import-and-export-Excel-to-sql-server.html
Vous pouvez utiliser ce Q2C.SSMSPlugin , qui est gratuit et open source. Vous pouvez cliquer avec le bouton droit de la souris et sélectionner "Exécuter Query To Command ... -> Query To Insert ...". Prendre plaisir)
Si vous utilisez Oracle (ou configurez l'application sur SQL Server), Oracle SQL Developer le fait pour vous. choisissez "décharger" pour une table et suivez les options jusqu'à (décochez DDL si vous ne voulez pas que toutes les tables créent des commandes).
J'ai trouvé ceci SMSMS Boost addon, qui est gratuit et fait exactement cela, entre autres choses. Vous pouvez cliquer avec le bouton droit sur les résultats et sélectionner Données de script comme.
J'ai créé la procedure
suivante:
if object_id('tool.create_insert', 'P') is null
begin
exec('create procedure tool.create_insert as');
end;
go
alter procedure tool.create_insert(@schema varchar(200) = 'dbo',
@table varchar(200),
@where varchar(max) = null,
@top int = null,
@insert varchar(max) output)
as
begin
declare @insert_fields varchar(max),
@select varchar(max),
@error varchar(500),
@query varchar(max);
declare @values table(description varchar(max));
set nocount on;
-- Get columns
select @insert_fields = isnull(@insert_fields + ', ', '') + c.name,
@select = case type_name(c.system_type_id)
when 'varchar' then isnull(@select + ' + '', '' + ', '') + ' isnull('''''''' + cast(' + c.name + ' as varchar) + '''''''', ''null'')'
when 'datetime' then isnull(@select + ' + '', '' + ', '') + ' isnull('''''''' + convert(varchar, ' + c.name + ', 121) + '''''''', ''null'')'
else isnull(@select + ' + '', '' + ', '') + 'isnull(cast(' + c.name + ' as varchar), ''null'')'
end
from sys.columns c with(nolock)
inner join sys.tables t with(nolock) on t.object_id = c.object_id
inner join sys.schemas s with(nolock) on s.schema_id = t.schema_id
where s.name = @schema
and t.name = @table;
-- If there's no columns...
if @insert_fields is null or @select is null
begin
set @error = 'There''s no ' + @schema + '.' + @table + ' inside the target database.';
raiserror(@error, 16, 1);
return;
end;
set @insert_fields = 'insert into ' + @schema + '.' + @table + '(' + @insert_fields + ')';
if isnull(@where, '') <> '' and charindex('where', ltrim(rtrim(@where))) < 1
begin
set @where = 'where ' + @where;
end
else
begin
set @where = '';
end;
set @query = 'select ' + isnull('top(' + cast(@top as varchar) + ')', '') + @select + ' from ' + @schema + '.' + @table + ' with (nolock) ' + @where;
insert into @values(description)
exec(@query);
set @insert = isnull(@insert + char(10), '') + '--' + upper(@schema + '.' + @table);
select @insert = @insert + char(10) + @insert_fields + char(10) + 'values(' + v.description + ');' + char(10) + 'go' + char(10)
from @values v
where isnull(v.description, '') <> '';
end;
go
Ensuite, vous pouvez l'utiliser de cette façon:
declare @insert varchar(max),
@part varchar(max),
@start int,
@end int;
set @start = 1;
exec tool.create_insert @schema = 'dbo',
@table = 'customer',
@where = 'id = 1',
@insert = @insert output;
-- Print one line to avoid the maximum 8000 characters problem
while len(@insert) > 0
begin
set @end = charindex(char(10), @insert);
if @end = 0
begin
set @end = len(@insert) + 1;
end;
print substring(@insert, @start, @end - 1);
set @insert = substring(@insert, @end + 1, len(@insert) - @end + 1);
end;
Le résultat serait quelque chose comme ça:
--DBO.CUSTOMER
insert into dbo.customer(id, name, type)
values(1, 'CUSTOMER NAME', 'F');
go
Si vous voulez juste obtenir une plage de lignes, utilisez le paramètre @top
comme suit:
declare @insert varchar(max),
@part varchar(max),
@start int,
@end int;
set @start = 1;
exec tool.create_insert @schema = 'dbo',
@table = 'customer',
@top = 100,
@insert = @insert output;
-- Print one line to avoid the maximum 8000 characters problem
while len(@insert) > 0
begin
set @end = charindex(char(10), @insert);
if @end = 0
begin
set @end = len(@insert) + 1;
end;
print substring(@insert, @start, @end - 1);
set @insert = substring(@insert, @end + 1, len(@insert) - @end + 1);
end;