sql >> Database >  >> RDS >> Database

Geavanceerde SQL:variaties en verschillende gebruiksscenario's van T-SQL Insert Statement

In mijn vorige artikel demonstreerde ik:

  1. Voeg de uitvoer van de functie met tabelwaarde in de SQL-tabel in.
  2. Voer de uitvoer in van de tabelwaardefunctie die is gemaakt op de externe databaseserver.

In dit artikel ga ik demonstreren:

  1. Kopieer gegevens tussen twee tabellen, gemaakt in een ander schema.
  2. Kopieer gegevens tussen twee tabellen, gemaakt in verschillende databases op dezelfde server.
  3. Kopieer gegevens tussen twee gemaakte tabellen, in verschillende databases bevindt zich de verschillende server (Cross-serverquery)

Breng gegevens over tussen twee tabellen die in een ander schema zijn gemaakt.

Om gegevens te kopiëren tussen twee tabellen die in een ander schema zijn gemaakt, moeten we de volgende syntaxis gebruiken:

INSERT INTO . ( COLUMN1, COLUMN2, COLUMN3 .. ) SELECT COLUMN1, COLUMN2, COLUMN3 FROM .

Voor demonstratie ga ik de WideWorldImportors . gebruiken databank. Ik wil alle records kopiëren van de [Applicatie].[Mensen] tabel naar de [dbo].[EmployeesWithoutLogonName] tabel met LOGONNAME gelijk aan ”NO LOGON .”

Laten we eerst de gegevens bekijken van de [Applicatie].[Mensen] tafel. Voer hiervoor de volgende query uit:

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

Het volgende is een screenshot van de uitvoer:

Laten we nu de [dbo].[EmployeesWithoutLogonName] maken tafel. Voer hiervoor de volgende query uit:

CREATE TABLE EMPLOYEES WITHOUTLOGONNAME ( [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) )

Laten we nu records kopiëren van [Applicatie].[Mensen] naar [dbo].[EmployeesWithoutLogonName] . Voer hiervoor de volgende query uit:

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] VANUIT APPLICATION.PEOPLE WHERE LOGONNAME ='NO LOGON'

Nadat de gegevens zijn ingevoegd, voert u de volgende query uit om te controleren of de gegevens zijn gekopieerd.

SELECTEER * VAN WERKNEMERSZONDER AANMELDINGSNAAM

Het volgende is de uitvoer:

Kopieer gegevens tussen twee tabellen, gemaakt in een andere database

Zoals ik hierboven heb uitgelegd, kunnen we gegevens kopiëren tussen tabellen die in twee verschillende schema's zijn gemaakt. Op dezelfde manier kunnen we gegevens kopiëren tussen twee tabellen die in twee verschillende databases zijn gemaakt. Om gegevens tussen twee databases te kopiëren, moet de gebruiker de "db_datareader . hebben ” toestemming voor de brondatabase en “db_datawriter ” op de bestemmingsdatabase.

Hieronder volgt de syntaxis:

INSERT INTO .. ( COLUMN1, COLUMN2, COLUMN3 .. ) SELECT COLUMN1, COLUMN2, COLUMN3 FROM .. 

Om dit te demonstreren, heb ik een nieuwe database gemaakt met de naam 'HR'. Voer de volgende opdracht uit om een ​​database te maken.

MAAK DATABASE HR

Nu wil ik gegevens kopiëren van de EmployeesWithoutLogonName tabel, gemaakt in WideWorldImportors database naar de "Werknemers ” tabel gemaakt in de HR database.

Laten we eerst een tabel maken met de naam "Werknemers ” in de HR databank. Voer hiervoor de volgende query uit:

GEBRUIK HR GO MAAK TABEL WERKNEMERS ( [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) )

Nu om gegevens te kopiëren van de "EmployeesWithoutLogonName ” naar de “WERKNEMERS ” tabel, laten we de volgende query uitvoeren:

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

Nadat de gegevens zijn ingevoegd, voert u de volgende query uit om te controleren of de gegevens zijn gekopieerd.

SELECTEER * VAN HR.DBO.WERKNEMERS

Het volgende is de uitvoer:

Kopieer gegevens tussen twee tabellen, aangemaakt in de verschillende databases op verschillende servers

Nu kunnen we op dezelfde manier gegevens kopiëren tussen twee tabellen die zijn gemaakt op twee afzonderlijke databases die op twee verschillende servers zijn gemaakt. Dit kan worden uitgevoerd met behulp van Linked Server of de OPENROWSET zoekwoord.

Het volgende is de syntaxis om verbinding te maken met de SQL-database die op de externe server is gemaakt met behulp van Linked Server.

INSERT INTO ... ( COLUMN1, COLUMN2, COLUMN3 .. )> 

In deze demo ga ik gegevens kopiëren van Medewerker tabel gemaakt op de werknemersdatabase naar SQL-database die is gemaakt in de Azure-cloud. Om dat te doen, maakt u eerst een database op Azure SQL-instantie. Ik heb een SQL-serverbronpool gemaakt met de naam "companyemployees.database.windows.net.

Als u nu een HR-database op een Azure-database-instantie wilt maken, opent u SQL Server Management Studio. Selecteer in het tekstvak van de servernaam "companyemployees.database.windows.net". We zullen SQL Server-authenticatie gebruiken om SQL-instantie te verbinden. Om dat te doen, selecteert u "SQL Server-verificatie" in de vervolgkeuzelijst voor verificatietype. Geef de juiste gebruikersnaam en wachtwoord op en klik op verbinden. Zie de volgende schermafbeelding.

Nu om de "Cloud_HR_DB . te maken ” database, druk op Ctrl+N om het query-editorvenster te openen en de volgende opdracht uit te voeren.

CREATE DATABASE CLOUD_HR_DB GO

Zie de volgende afbeelding.

Nadat de database is gemaakt, voert u de volgende query uit om de "cEmployees . te maken ”-tabel op de Cloud_HR_DB databank. Om dat te doen, voert u de volgende query uit in de HR database.

MAAK TABEL 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) )

Nadat de database en tabel zijn gemaakt, moeten we een gekoppelde server maken om een ​​cross-serverquery uit te voeren. Als u een gekoppelde server wilt maken tussen de lokale SQL-serverinstantie en de Azure SQL-serverinstantie, voert u de volgende opdracht uit op de lokale SQL Server-instantie.

GEBRUIK [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' /* OM VEILIGHEIDSREDENEN IS HET GEKOPPELDE SERVER REMOTE LOGINS-WACHTWOORD GEWIJZIGD MET ######## */ EXEC MASTER.DBO.SP_ADDLINKEDSRVLOGIN @RMTSRVNAME=N'AZURE_SQLSELFSERVER=N', @USE 'FALSE', @LOCALLOGIN=NULL, @RMTUSER=N'NISARGUPADHYAY', @RMTPASSWORD='########' GA 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 SC HEMA VALIDATIE', @OPTVALUE=N'FALSE' GO EXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'AZURE_SQL_SERVER', @OPTNAME=N'QUERY TIMEOUT', @OPTVALUE=N'0' GA EXEC MASTER.DBO.SP_SERVEROPTION @ SERVER=N'AZURE_SQL_SERVER', @OPTNAME=N'REMOTE PROC TRANSACTIE PROMOTIE', @OPTVALUE=N'TRUE' GO

Zodra de gekoppelde server is gemaakt, kunnen we de gegevens van de Werknemers exporteren tabel, gemaakt op het lokale exemplaar van SQL-server aan de cEmployees tabel die is gemaakt op het Azure SQL Server-exemplaar. Om dat te doen, voert u de volgende query uit op de lokale SQL Server-instantie:

INSERT INTO [AZURE_SQL_SERVER].Cloud_HR_DB.DBO.cEMPLOYEES ([FULL_NAME], [PREFERRED_NAME], [SEARCH_NAME], [LOGON_NAME], [PHONE_NUMBER], [FAX_NUMBER], [EMAIL_ADDRESS], PRESELECTEAR_ADDRESS_NAME LOGON_NAME, PHONE_NUMBER, FAX_NUMBER, EMAIL_ADDRESS VAN HR..WERKNEMERS

Zodra gegevens zijn geëxporteerd van een lokaal exemplaar naar Azure Instance, voert u de volgende query uit om te controleren of de gegevens zijn gekopieerd.

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

Het volgende is de uitvoer:

We kunnen ook gegevens naar een externe server kopiëren zonder Linked Server te gebruiken. Om dat te doen, moeten we het sleutelwoord OPENROWSET gebruiken. OPENROWSET is een ad-hocmethode om verbinding te maken met en toegang te krijgen tot externe gegevensbronnen met behulp van OLEDB. Raadpleeg de Microsoft-documentatie van OPENROWSET voor meer informatie over OPENROWSET.

In het volgende voorbeeld kopieer ik gegevens van de cEmployees tabel gemaakt op Cloud_HR_DB aan de Medewerkers database gemaakt op het lokale exemplaar. We zullen alleen die records kopiëren die Email_Address . hebben zoals" contoso.com.

Als u nu gegevens wilt kopiëren, maakt u een tabel met de naam "ContosoEmployees ” in de “HR ” databank. Voer hiervoor de volgende query uit:

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

Om nu gegevens in te voegen met OPENROWSET, moeten we de "Ad Hoc gedistribueerde zoekopdrachten inschakelen " geavanceerde optie. Voer hiervoor de volgende opdracht uit.

EXEC SP_CONFIGURE 'TOEN GEAVANCEERDE OPTIES',1HERCONFIGUREER MET OVERRIDEEXEC SP_CONFIGURE 'AD HOC GEDISTRIBUEERDE QUERIES',1HERCONFIGUREER MET OVERRIDE

Nu gegevens kopiëren van de cEmployees tabel van de Cloud_HR_DB (Azure-instantie) database naar "ContosoEmployees ” in de “Werknemers ” database (lokaal exemplaar), voer de volgende query uit op de lokale server:

GEBRUIK HR GO INSERT INTO CONTOSOEMPLOYEES ([FULL_NAME], [PREFERRED_NAME], [SEARCH_NAME], [LOGON_NAME], [PHONE_NUMBER], [FAX_NUMBER], [EMAIL_ADDRESS]) SELECTEER * FROM OPENROWSET('SQLSERNCLI=11 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, FAX_NUMBER COM%''')A

Zodra gegevens zijn geëxporteerd van een lokaal exemplaar naar Azure Instance, voert u de volgende query uit om te controleren of de gegevens zijn gekopieerd.

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

Het volgende is de uitvoer:

In dit artikel heb ik uitgelegd hoe u:

  1. Kopieer gegevens tussen twee tabellen die in een ander schema zijn gemaakt.
  2. Kopieer gegevens tussen twee tabellen die in verschillende databases op dezelfde server zijn gemaakt.
  3. Kopieer gegevens tussen twee tabellen die zijn gemaakt in verschillende databases van de verschillende server (Cross-serverquery).

  1. De retourwaarde verkrijgen van JDBC MSSQL

  2. Verander tabel/kolom/index namen grootte in orakel 11g of 12c

  3. Voorbeeld Oracle-functie (retournummer)

  4. Wat maakt een SQL-statement sargable?