Database
 sql >> Datenbank >  >> RDS >> Database

Fortgeschrittenes SQL:Variationen und verschiedene Anwendungsfälle der T-SQL-Insert-Anweisung

In meinem vorherigen Artikel habe ich Folgendes demonstriert:

  1. Fügen Sie die Ausgabe der Tabellenwertfunktion in die SQL-Tabelle ein.
  2. Fügen Sie die Ausgabe der Tabellenwertfunktion ein, die auf dem entfernten Datenbankserver erstellt wird.

In diesem Artikel werde ich demonstrieren:

  1. Daten zwischen zwei Tabellen kopieren, die in einem anderen Schema erstellt wurden.
  2. Kopieren Sie Daten zwischen zwei Tabellen, die in verschiedenen Datenbanken auf demselben Server erstellt wurden.
  3. Daten zwischen zwei erstellten Tabellen kopieren, in unterschiedlichen Datenbanken befinden sich die unterschiedlichen Server (Serverübergreifende Abfrage)

Übertragen Sie Daten zwischen zwei Tabellen, die in einem anderen Schema erstellt wurden.

Um Daten zwischen zwei Tabellen zu kopieren, die in einem anderen Schema erstellt wurden, müssen wir die folgende Syntax verwenden:

INSERT INTO <DESTINATIONSCHEMANAME>.<DESTINATIONTABLENAME> 
            (                         COLUMN1, 
                        COLUMN2, 
                        COLUMN3                  .. 
            ) 
SELECT COLUMN1, 
       COLUMN2, 
       COLUMN3 
FROM   <SOURCESCHEMANAME>.<SOURCETABLENAME>

Zur Demonstration werde ich die WideWorldImportors verwenden Datenbank. Ich möchte alle Datensätze aus [Anwendung].[Personen] kopieren Tabelle zu [dbo].[EmployeesWithoutLogonName] Tabelle mit LOGONNAME gleich ”NO LOGON .“

Sehen wir uns zunächst die Daten aus [Anwendung].[Personen] an Tisch. Führen Sie dazu die folgende Abfrage aus:

SELECT [PERSONID], 
       [FULLNAME], 
       [PREFERREDNAME], 
       [SEARCHNAME], 
       [LOGONNAME], 
       [PHONENUMBER], 
       [FAXNUMBER], 
       [EMAILADDRESS] 
FROM   APPLICATION.PEOPLE 
WHERE  LOGONNAME = 'NO LOGON'

Das Folgende ist ein Screenshot der Ausgabe:

Lassen Sie uns nun [dbo].[EmployeesWithoutLogonName] erstellen Tisch. Führen Sie dazu die folgende Abfrage aus:

CREATE TABLE EMPLOYEESWITHOUTLOGONNAME 
  ( 
     [ID]             INT IDENTITY(1, 1), 
     [FULL_NAME]      VARCHAR(500), 
     [PREFERRED_NAME] VARCHAR(500), 
     [SEARCH_NAME]    NVARCHAR(MAX), 
     [LOGON_NAME]     VARCHAR(250), 
     [PHONE_NUMBER]   VARCHAR(50), 
     [FAX_NUMBER]     VARCHAR(100), 
     [EMAIL_ADDRESS]  NVARCHAR(250) 
  )

Lassen Sie uns nun Datensätze aus [Application].[People] kopieren an [dbo].[EmployeesWithoutLogonName] . Führen Sie dazu die folgende Abfrage aus:

INSERT INTO [DBO].[EMPLOYEESWITHOUTLOGONNAME] 
            ([FULL_NAME], 
             [PREFERRED_NAME], 
             [SEARCH_NAME], 
             [LOGON_NAME], 
             [PHONE_NUMBER], 
             [FAX_NUMBER], 
             [EMAIL_ADDRESS]) 
SELECT [FULLNAME], 
       [PREFERREDNAME], 
       [SEARCHNAME], 
       [LOGONNAME], 
       [PHONENUMBER], 
       [FAXNUMBER], 
       [EMAILADDRESS] 
FROM   APPLICATION.PEOPLE 
WHERE  LOGONNAME = 'NO LOGON'

Führen Sie nach dem Einfügen der Daten die folgende Abfrage aus, um zu überprüfen, ob die Daten kopiert wurden.

SELECT * 
FROM   EMPLOYEESWITHOUTLOGONNAME

Das Folgende ist die Ausgabe:

Daten zwischen zwei Tabellen kopieren, die in einer anderen Datenbank erstellt wurden

Wie ich oben erklärt habe, können wir Daten zwischen Tabellen kopieren, die in zwei verschiedenen Schemas erstellt wurden. Ebenso können wir Daten zwischen zwei Tabellen kopieren, die in zwei verschiedenen Datenbanken erstellt wurden. Um Daten zwischen zwei Datenbanken zu kopieren, muss der Benutzer über die Datei „db_datareader “-Berechtigung für die Quelldatenbank und „db_datawriter ” in der Zieldatenbank.

Es folgt die Syntax:

INSERT INTO <DESTINATIONDATABASENAME>.<DESTINATIONSCHEMANAME>.<DESTINATIONTABLENAME> 
            ( 
                        COLUMN1, 
                        COLUMN2, 
                        COLUMN3 .. 
            ) 
SELECT COLUMN1, 
       COLUMN2, 
       COLUMN3 
FROM   <SOURCEDATABASENAME>.<SOURCESCHEMANAME>.<SOURCETABLENAME>

Zur Demonstration habe ich jetzt eine neue Datenbank mit dem Namen „HR“ erstellt. Um eine Datenbank zu erstellen, führen Sie den folgenden Befehl aus.

CREATE DATABASE HR

Jetzt möchte ich Daten von EmployeesWithoutLogonName kopieren Tabelle, erstellt in WideWorldImportors Datenbank zu den „Mitarbeitern ” in der HR erstellte Tabelle Datenbank.

Lassen Sie uns zunächst eine Tabelle mit dem Namen „Employees“ erstellen “ in der Personalabteilung Datenbank. Führen Sie dazu die folgende Abfrage aus:

USE HR 
GO 
CREATE TABLE EMPLOYEES 
  ( 
     [ID]             INT IDENTITY(1, 1), 
     [FULL_NAME]      VARCHAR(500), 
     [PREFERRED_NAME] VARCHAR(500), 
     [SEARCH_NAME]    NVARCHAR(MAX), 
     [LOGON_NAME]     VARCHAR(250), 
     [PHONE_NUMBER]   VARCHAR(50), 
     [FAX_NUMBER]     VARCHAR(100), 
     [EMAIL_ADDRESS]  NVARCHAR(250) 
  )

Kopieren Sie nun Daten aus der Datei „EmployeesWithoutLogonName ”-Tabelle zu den “MITARBEITER ”-Tabelle führen wir die folgende Abfrage aus:

INSERT INTO HR.DBO.EMPLOYEES 
            ([FULL_NAME], 
             [PREFERRED_NAME], 
             [SEARCH_NAME], 
             [LOGON_NAME], 
             [PHONE_NUMBER], 
             [FAX_NUMBER], 
             [EMAIL_ADDRESS]) 
SELECT FULL_NAME, 
       PREFERRED_NAME, 
       SEARCH_NAME, 
       LOGON_NAME, 
       PHONE_NUMBER, 
       FAX_NUMBER, 
       EMAIL_ADDRESS 
FROM   WIDEWORLDIMPORTERS.DBO.EMPLOYEESWITHOUTLOGONNAME

Führen Sie nach dem Einfügen der Daten die folgende Abfrage aus, um zu überprüfen, ob die Daten kopiert wurden.

SELECT * 
FROM   HR.DBO.EMPLOYEES

Das Folgende ist die Ausgabe:

Kopieren Sie Daten zwischen zwei Tabellen, die in verschiedenen Datenbanken auf verschiedenen Servern erstellt wurden

Auf ähnliche Weise können wir jetzt Daten zwischen zwei Tabellen kopieren, die auf zwei separaten Datenbanken erstellt wurden, die auf zwei verschiedenen Servern erstellt wurden. Dies kann mit Linked Server durchgeführt werden oder das OPENROWSET Schlüsselwort.

Das Folgende ist die Syntax zum Verbinden der auf dem Remote-Server erstellten SQL-Datenbank mit Linked Server.

INSERT INTO <LINKEDSERVERNAME>.<DESTINATIONDATABASENAME>.<DESTINATIONSCHEMANAME>.<DESTINATIONTABLENAME> 
            ( 
                        COLUMN1, 
                        COLUMN2, 
                        COLUMN3 .. 
            ) 
SELECT COLUMN1, 
       COLUMN2, 
       COLUMN3 
FROM   <SOURCEDATABASENAME>.<SOURCESCHEMANAME>.<SOURCETABLENAME>

In dieser Demo werde ich Daten von Mitarbeiter kopieren Tabelle, die in der Employees-Datenbank erstellt wurde, in eine SQL-Datenbank, die in der Azure-Cloud erstellt wurde. Erstellen Sie dazu zunächst eine Datenbank auf der Azure SQL-Instanz. Ich habe einen SQL Server-Ressourcenpool mit dem Namen „companyemployees.database.windows.net.“ erstellt ”

Um nun eine HR-Datenbank auf einer Azure-Datenbankinstanz zu erstellen, öffnen Sie SQL Server Management Studio. Wählen Sie im Textfeld für den Servernamen „companyemployees.database.windows.net“ aus. Wir werden die SQL Server-Authentifizierung verwenden, um die SQL-Instanz zu verbinden. Wählen Sie dazu im Dropdown-Feld Authentifizierungstyp „SQL Server-Authentifizierung“ aus. Geben Sie den entsprechenden Benutzernamen und das Passwort ein und klicken Sie auf Verbinden. Siehe folgenden Screenshot.

Erstellen Sie nun die „Cloud_HR_DB ”-Datenbank, drücken Sie Strg+N um das Fenster des Abfrageeditors zu öffnen und den folgenden Befehl auszuführen.

CREATE DATABASE CLOUD_HR_DB 
GO

Siehe folgendes Bild.

Sobald die Datenbank erstellt ist, führen Sie die folgende Abfrage aus, um die Datei „cEmployees ”-Tabelle in der Cloud_HR_DB Datenbank. Führen Sie dazu die folgende Abfrage im HR aus Datenbank.

CREATE TABLE cEMPLOYEES 
  ( 
     [ID]             INT IDENTITY(1, 1), 
     [FULL_NAME]      VARCHAR(500), 
     [PREFERRED_NAME] VARCHAR(500), 
     [SEARCH_NAME]    NVARCHAR(MAX), 
     [LOGON_NAME]     VARCHAR(250), 
     [PHONE_NUMBER]   VARCHAR(50), 
     [FAX_NUMBER]     VARCHAR(100), 
     [EMAIL_ADDRESS]  NVARCHAR(250) 
  )

Sobald die Datenbank und die Tabelle erstellt sind, müssen wir einen Verbindungsserver erstellen, um eine serverübergreifende Abfrage durchzuführen. Um einen Verbindungsserver zwischen der lokalen SQL-Serverinstanz und der Azure SQL-Serverinstanz zu erstellen, führen Sie den folgenden Befehl auf der lokalen SQL-Serverinstanz aus.

USE [MASTER] 
GO 

EXEC MASTER.DBO.SP_ADDLINKEDSERVER 
  @SERVER = N'AZURE_SQL_SERVER', 
  @SRVPRODUCT=N'', 
  @PROVIDER=N'SQLNCLI', 
  @DATASRC=N'COMPANYEMPLOYEES.DATABASE.WINDOWS.NET', 
  @CATALOG=N'CLOUD_HR_DB' 

/* FOR SECURITY REASONS THE LINKED SERVER REMOTE LOGINS PASSWORD IS CHANGED WITH ######## */ 
EXEC MASTER.DBO.SP_ADDLINKEDSRVLOGIN 
  @RMTSRVNAME=N'AZURE_SQL_SERVER', 
  @USESELF=N'FALSE', 
  @LOCALLOGIN=NULL, 
  @RMTUSER=N'NISARGUPADHYAY', 
  @RMTPASSWORD='########' 
GO 

EXEC MASTER.DBO.SP_SERVEROPTION 
  @SERVER=N'AZURE_SQL_SERVER', 
  @OPTNAME=N'DATA ACCESS', 
  @OPTVALUE=N'TRUE' 
GO 

EXEC MASTER.DBO.SP_SERVEROPTION 
  @SERVER=N'AZURE_SQL_SERVER', 
  @OPTNAME=N'RPC', 
  @OPTVALUE=N'TRUE' 
GO 

EXEC MASTER.DBO.SP_SERVEROPTION 
  @SERVER=N'AZURE_SQL_SERVER', 
  @OPTNAME=N'RPC OUT', 
  @OPTVALUE=N'TRUE' 
GO 

EXEC MASTER.DBO.SP_SERVEROPTION 
  @SERVER=N'AZURE_SQL_SERVER', 
  @OPTNAME=N'CONNECT TIMEOUT', 
  @OPTVALUE=N'0' 
GO 

EXEC MASTER.DBO.SP_SERVEROPTION 
  @SERVER=N'AZURE_SQL_SERVER', 
  @OPTNAME=N'LAZY SCHEMA VALIDATION', 
  @OPTVALUE=N'FALSE' 
GO 

EXEC MASTER.DBO.SP_SERVEROPTION 
  @SERVER=N'AZURE_SQL_SERVER', 
  @OPTNAME=N'QUERY TIMEOUT', 
  @OPTVALUE=N'0' 
GO 

EXEC MASTER.DBO.SP_SERVEROPTION 
  @SERVER=N'AZURE_SQL_SERVER', 
  @OPTNAME=N'REMOTE PROC TRANSACTION PROMOTION', 
  @OPTVALUE=N'TRUE' 
GO

Sobald der Verbindungsserver erstellt ist, können Sie die Daten der Mitarbeiter exportieren Tabelle, die auf der lokalen Instanz von SQL Server erstellt wurde, an die cEmployees Tabelle, die auf der Azure SQL Server-Instanz erstellt wurde. Führen Sie dazu die folgende Abfrage auf der lokalen SQL Server-Instanz aus:

INSERT INTO [AZURE_SQL_SERVER].Cloud_HR_DB.DBO.cEMPLOYEES 
            ([FULL_NAME], 
             [PREFERRED_NAME], 
             [SEARCH_NAME], 
             [LOGON_NAME], 
             [PHONE_NUMBER], 
             [FAX_NUMBER], 
             [EMAIL_ADDRESS]) 
SELECT FULL_NAME, 
       PREFERRED_NAME, 
       SEARCH_NAME, 
       LOGON_NAME, 
       PHONE_NUMBER, 
       FAX_NUMBER, 
       EMAIL_ADDRESS 
FROM   HR..EMPLOYEES

Nachdem Daten von einer lokalen Instanz in Azure Instance exportiert wurden, führen Sie die folgende Abfrage aus, um zu überprüfen, ob die Daten kopiert wurden.

SELECT * 
FROM [AZURE_SQL_SERVER].Cloud_HR_DB.DBO.cEMPLOYEES

Das Folgende ist die Ausgabe:

Wir können auch Daten auf einen Remote-Server kopieren, ohne Linked Server zu verwenden. Dazu müssen wir das Schlüsselwort OPENROWSET verwenden. OPENROWSET ist eine Ad-hoc-Methode zum Herstellen einer Verbindung und zum Zugriff auf eine Remote-Datenquelle mithilfe von OLEDB. Weitere Informationen zu OPENROWSET finden Sie in der Microsoft-Dokumentation zu OPENROWSET.

Im folgenden Beispiel kopiere ich nun Daten aus cEmployees Tabelle erstellt auf Cloud_HR_DB an die Mitarbeiter Datenbank, die auf der lokalen Instanz erstellt wurde. Wir werden nur die Datensätze kopieren, die Email_Address haben wie " contoso.com.

Um nun Daten zu kopieren, erstellen Sie eine Tabelle mit dem Namen „ContosoEmployees “ in der „HR “ Datenbank. Führen Sie dazu die folgende Abfrage aus:

CREATE TABLE [DBO].[CONTOSOEMPLOYEES] 
  ( 
     [ID]             [INT] IDENTITY(1, 1) NOT NULL, 
     [FULL_NAME]      [VARCHAR](500) NULL, 
     [PREFERRED_NAME] [VARCHAR](500) NULL, 
     [SEARCH_NAME]    [NVARCHAR](MAX) NULL, 
     [LOGON_NAME]     [VARCHAR](250) NULL, 
     [PHONE_NUMBER]   [VARCHAR](50) NULL, 
     [FAX_NUMBER]     [VARCHAR](100) NULL, 
     [EMAIL_ADDRESS]  [NVARCHAR](250) NULL 
  ) 
GO

Um nun Daten mit OPENROWSET einzufügen, müssen wir die „Verteilten Ad-Hoc-Abfragen aktivieren " fortgeschrittene Option. Führen Sie dazu den folgenden Befehl aus.

EXEC SP_CONFIGURE 'SHOW ADVANCED OPTIONS',1
RECONFIGURE WITH OVERRIDE

EXEC SP_CONFIGURE 'AD HOC DISTRIBUTED QUERIES',1
RECONFIGURE WITH OVERRIDE

Kopieren Sie nun die Daten von cEmployees Tabelle der Cloud_HR_DB (Azure-Instanz) Datenbank in „ContosoEmployees “ unter „Mitarbeiter“. ” Datenbank (Lokale Instanz), führen Sie die folgende Abfrage auf dem lokalen Server aus:

USE HR 
GO 

INSERT INTO CONTOSOEMPLOYEES 
            ([FULL_NAME], 
             [PREFERRED_NAME], 
             [SEARCH_NAME], 
             [LOGON_NAME], 
             [PHONE_NUMBER], 
             [FAX_NUMBER], 
             [EMAIL_ADDRESS]) 
SELECT * 
FROM   OPENROWSET('SQLNCLI11', 
'SERVER=COMPANYEMPLOYEES.DATABASE.WINDOWS.NET,1433;DATABASE=CLOUD_HR_DB;UID=NISARGUPADHYAY;[email protected]'
, 
'SELECT FULL_NAME, PREFERRED_NAME, SEARCH_NAME, LOGON_NAME, PHONE_NUMBER, FAX_NUMBER, EMAIL_ADDRESS FROM   CEMPLOYEES WHERE  EMAIL_ADDRESS LIKE ''%CONTOSO.COM%''')A

Nachdem Daten von einer lokalen Instanz in Azure Instance exportiert wurden, führen Sie die folgende Abfrage aus, um zu überprüfen, ob die Daten kopiert wurden.

SELECT FULL_NAME, 
       PREFERRED_NAME, 
       SEARCH_NAME, 
       LOGON_NAME, 
       PHONE_NUMBER, 
       FAX_NUMBER, 
       EMAIL_ADDRESS 
FROM   CONTOSOEMPLOYEES

Das Folgende ist die Ausgabe:

In diesem Artikel habe ich erklärt, wie man:

  1. Daten zwischen zwei Tabellen kopieren, die in einem anderen Schema erstellt wurden.
  2. Kopieren Sie Daten zwischen zwei Tabellen, die in verschiedenen Datenbanken auf demselben Server erstellt wurden.
  3. Kopieren Sie Daten zwischen zwei Tabellen, die in unterschiedlichen Datenbanken des unterschiedlichen Servers erstellt wurden (Serverübergreifende Abfrage).