web-dev-qa-db-fra.com

INSERT INTO à partir de deux bases de données de serveurs différentes

J'essaie de copier les données de testdabse.invoice table à basecampdev.invoice table. testdabse est une base de données locale tandis que basecampdev est sur le serveur.

Ma requête pour copier des données vers une autre table ne fonctionne pas, dit-il

Invalid object name 'basecampdev.dbo.invoice'.  

J'ai lu ceci documentation mais j'ai du mal à suivre et à comprendre.

Ce sont les informations fournies par le serveur

Server type: Database Engine
Server name: server.database.windows.net (this is not the real name)
Authentication: SQL Server Authentication
Login: myusername
Password: mypassword  

Comment puis-je me connecter au serveur pour pouvoir exécuter cette requête

INSERT INTO [basecampdev].[dbo].[invoice]
           ([InvoiceNumber]
           ,[TotalAmount]
           ,[IsActive]
           ,[CreatedBy]
           ,[UpdatedBy]
           ,[CreatedDate]
           ,[UpdatedDate]
           ,[Remarks])
SELECT [InvoiceNumber]
           ,[TotalAmount]
           ,[IsActive]
           ,[CreatedBy]
           ,[UpdatedBy]
           ,[CreatedDate]
           ,[UpdatedDate]
           ,[Remarks] FROM [testdabse].[dbo].[invoice]

Capture d'écran

enter image description here

18
fiberOptics

Il semble que vous ayez besoin de créer et interroger des serveurs de base de données liés dans SQL Server

Pour le moment, vous avez créé une requête qui va entre différentes bases de données en utilisant un nom en 3 parties mydatabase.dbo.mytable mais vous devez monter d'un niveau et utiliser un nom en 4 parties myserver.mydatabase.dbo.mytable, voir cet article sur la dénomination en quatre parties pour plus d'informations

modifier
. besoin de modifier votre fichier hôte/enregistrer le serveur ou autrement identifier où trouver database.windows.net.

INSERT INTO [DATABASE.WINDOWS.NET].[basecampdev].[dbo].[invoice]
       ([InvoiceNumber]
       ,[TotalAmount]
       ,[IsActive]
       ,[CreatedBy]
       ,[UpdatedBy]
       ,[CreatedDate]
       ,[UpdatedDate]
       ,[Remarks])
SELECT [InvoiceNumber]
       ,[TotalAmount]
       ,[IsActive]
       ,[CreatedBy]
       ,[UpdatedBy]
       ,[CreatedDate]
       ,[UpdatedDate]
       ,[Remarks] FROM [BC1-PC].[testdabse].[dbo].[invoice]

Si vous ne pouvez pas accéder au serveur distant, voyez si vous pouvez créer un serveur de base de données lié :

EXEC sp_addlinkedserver [database.windows.net];
GO
USE tempdb;
GO
CREATE SYNONYM MyInvoice FOR 
    [database.windows.net].basecampdev.dbo.invoice;
GO

Ensuite, vous pouvez simplement interroger MyEmployee sans avoir besoin du nom complet en quatre parties

17
Simon Martin

La réponse donnée par Simon fonctionne bien pour moi mais vous devez le faire dans le bon ordre: vous devez d'abord être dans le serveur dans lequel vous souhaitez insérer des données dans lesquelles se trouve [DATABASE.WINDOWS.NET]. [Basecampdev] dans votre Cas.

Vous pouvez essayer de voir si vous pouvez sélectionner certaines données dans le tableau des factures pour vous assurer que vous y avez accès.

Select top 10 * from [DATABASE.WINDOWS.NET].[basecampdev].[dbo].[invoice]

Deuxièmement, exécutez la requête donnée par Simon afin de créer un lien vers un autre serveur. Cette fois, utilisez l'autre serveur:

EXEC sp_addlinkedserver [BC1-PC]; -- this will create a link tempdb that you can access from where you are
GO
USE tempdb;
GO
CREATE SYNONYM MyInvoice FOR 
    [BC1-PC].testdabse.dbo.invoice; -- Make a copy of the table and data that you can use
GO

Maintenant, faites votre instruction d'insertion.

INSERT INTO [DATABASE.WINDOWS.NET].[basecampdev].[dbo].[invoice]
       ([InvoiceNumber]
       ,[TotalAmount]
       ,[IsActive]
       ,[CreatedBy]
       ,[UpdatedBy]
       ,[CreatedDate]
       ,[UpdatedDate]
       ,[Remarks])
SELECT [InvoiceNumber]
       ,[TotalAmount]
       ,[IsActive]
       ,[CreatedBy]
       ,[UpdatedBy]
       ,[CreatedDate]
       ,[UpdatedDate]
       ,[Remarks] FROM MyInvoice

J'espère que cela t'aides!

3
Blue Bamboo

Vous ne pouvez pas copier directement une table dans une base de données de serveur de destination à partir d'une base de données différente si la base de données source ne se trouve pas dans vos serveurs liés. Mais une façon est possible de générer des scripts (schéma avec données) de la table souhaitée dans une table temporairement dans la base de données du serveur source, puis d'exécuter le script dans la base de données du serveur de destination pour créer une table avec vos données. Enfin, utilisez INSERT INTO [DESTINATION_TABLE] sélectionnez * dans [TEMPORARY_SOURCE_TABLE]. Après avoir placé les données dans votre table de destination, supprimez celle temporaire.

J'ai trouvé cette solution face à la même situation. J'espère que ça va t'aider aussi.

2
Raja Sekhar
USE [mydb1]

SELECT *
INTO mytable1
FROM OPENDATASOURCE (
        'SQLNCLI'
        ,'Data Source=XXX.XX.XX.XXX;Initial Catalog=mydb2;User ID=XXX;Password=XXXX'
        ).[mydb2].dbo.mytable2
    /*  steps - 
            1-  [mydb1] means our opend connection database 
            2-  mytable1 means create copy table in mydb1 database where we want insert record
            3-  XXX.XX.XX.XXX - another server name.
            4-  mydb2 another server database.
            5-  write User id and Password of another server credential
            6-  mytable2 is another server table where u fetch record from it. */
2
Sagar Mahajan

Vous pouvez utiliser CREATE SYNONYM pour l'objet distant.

0
Serg