sql >> Database teknologi >  >> RDS >> Database

Avanceret SQL:Variationer og forskellige anvendelsestilfælde af T-SQL Insert Statement

I min tidligere artikel demonstrerede jeg:

  1. Indsæt outputtet fra den tabelværdisatte funktion i SQL-tabellen.
  2. Indsæt output fra den tabelværdi-funktion, der er oprettet på den eksterne databaseserver.

I denne artikel vil jeg demonstrere:

  1. Kopiér data mellem to tabeller, oprettet i et andet skema.
  2. Kopiér data mellem to tabeller, oprettet i forskellige databaser på den samme server.
  3. Kopiér data mellem to oprettede tabeller, i forskellige databaser ligger den forskellige server (Cross server-forespørgsel)

Overfør data mellem to tabeller oprettet i et andet skema.

For at kopiere data mellem to tabeller, der er oprettet i et andet skema, skal vi bruge følgende syntaks:

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

Til demonstration vil jeg bruge WideWorldImportors database. Jeg vil kopiere alle posterne fra [Applikationen].[People] tabellen til [dbo].[EmployeesWithoutLogonName] tabel, der har LOGONNAME lig med "NO LOGON .”

Lad os først gennemgå data fra [Applikationen].[People] bord. For at gøre det skal du udføre følgende forespørgsel:

VÆLG [PERSONID], [FULDNAVN], [PREFERREDNAME], [SØGENAVN], [LOGONNAME], [TELEFONNUMMER], [FAXNUMMER], [EMAILADRESSE] FRA APPLIKATIONEN. PERSONER, HVOR LOGONNAME ='INGEN LOGON'

Følgende er et skærmbillede af outputtet:

Lad os nu oprette [dbo].[EmployeesWithoutLogonName] bord. For at gøre det skal du udføre følgende forespørgsel:

OPRET TABEL MEDARBEJDERE UDEN LOGONNAVN ( [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) )

Lad os nu kopiere poster fra [Applikation].[People] til [dbo].[MedarbejdereUdenLogonnavn] . For at gøre det skal du udføre følgende forespørgsel:

INDSÆT I [DBO].[EMPLOYEESWITHOUTLOGONNAME] ([FULL_NAME], [PREFERRED_NAME], [SEARCH_NAME], [LOGON_NAME], [PHONE_NUMBER], [FAX_NUMBER], [EMAIL_ADDRESS]) VÆLG [FULLNAME], [PREFERREDNAME], [SØGENAVN], [LOGONNAVN], [TELEFONNUMMER], [FAXNUMMER], [EMAILADRESSE] FRA APPLIKATION.MENNESKER HVOR LOGONNAVN ='INGEN LOGON'

Når data er indsat, skal du udføre følgende forespørgsel for at bekræfte, at data er blevet kopieret.

VÆLG * FRA MEDARBEJDEREWITHOUTLOGONNAME

Følgende er output:

Kopiér data mellem to tabeller, oprettet i en anden database

Som jeg forklarede ovenfor, kan vi kopiere data mellem tabeller oprettet i to forskellige skemaer. På samme måde kan vi kopiere data mellem to tabeller oprettet i to forskellige databaser. For at kopiere data mellem to databaser skal brugeren have "db_datareader ”-tilladelse på kildedatabasen og “db_datawriter ” på destinationsdatabasen.

Følgende er syntaksen:

INDSÆT I .. (KOLUMNE1, KOLUMNE2, KOLONNE3 .. ) VÆLG KOLONNE1, KOLONNE2, KOLONNE3 FRA /COLUMNEBASE>. 

Nu for at demonstrere, har jeg oprettet en ny database ved navn "HR." For at oprette en database skal du udføre følgende kommando.

OPRET DATABASE HR

Nu vil jeg kopiere data fra MedarbejdereUdenLogonnavn tabel, oprettet iWideWorldImportors database til "Medarbejdere ” tabel oprettet i HR database.

Lad os først oprette en tabel med navnet "Medarbejdere ” i HR database. For at gøre det skal du udføre følgende forespørgsel:

BRUG HR GO OPRET TABEL MEDARBEJDERE ( [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 skal du kopiere data fra "MedarbejdereUdenLogonnavn ”-tabellen til “ANSATTE ” tabel, lad os udføre følgende forespørgsel:

INSERT INTO HR.DBO.EMPLOYEES ([FULL_NAME], [PREFERRED_NAME], [SEARCH_NAME], [LOGON_NAME], [PHONE_NUMBER], [FAX_NUMBER], [EMAIL_ADDRESS]) VÆLG FULL_NAME, PREFERRED_NAME, SEARCH_NAME, LOGON_NAME, PH FAX_NUMBER, EMAIL_ADDRESS FRA WIDEWORLDIMPORTERS.DBO.EMPLOYEESWITHOUTLOGONNAME

Når data er indsat, skal du udføre følgende forespørgsel for at bekræfte, at data er blevet kopieret.

VÆLG * FRA HR.DBO.EMPLOYEES

Følgende er output:

Kopiér data mellem to tabeller, oprettet i de forskellige databaser på forskellige servere

På samme måde kan vi nu kopiere data mellem to tabeller oprettet på to separate databaser oprettet på to forskellige servere. Dette kan udføres ved hjælp af Linket server eller OPENROWSET søgeord.

Følgende er syntaksen til at forbinde SQL-database oprettet på fjernserveren ved hjælp af Linked Server.

INDSÆT I ... (KOLUMNE1, KOLONNE2, KOLONNE3 .. ) VÆLG KOLONNE1, KOLUMNE2, KOLUMNE3 FRA KILDENAVN.> 

I denne demo vil jeg kopiere data fra medarbejder tabel oprettet på medarbejderdatabasen til SQL-database oprettet på Azure-skyen. For at gøre det skal du først oprette en database på Azure SQL Instance. Jeg har oprettet en SQL-serverressourcepulje ved navn "companyemployees.database.windows.net.

For at oprette en HR-database på Azure-databaseinstansen skal du åbne SQL Server Management Studio. I servernavnstekstfeltet skal du vælge "companyemployees.database.windows.net." Vi vil bruge SQL Server-godkendelse til at forbinde SQL-instanser. For at gøre det skal du vælge "SQL Server-godkendelse" i rullemenuen for godkendelsestype. Angiv passende brugernavn og adgangskode, og klik på tilslut. Se følgende skærmbillede.

Nu skal du oprette "Cloud_HR_DB ”-database, tryk på Ctrl+N for at åbne forespørgselsredigeringsvinduet og udføre følgende kommando.

OPRET DATABASE CLOUD_HR_DB GÅ

Se følgende billede.

Når databasen er oprettet, skal du udføre følgende forespørgsel for at oprette "cEmployees ” tabellen på Cloud_HR_DB database. For at gøre det skal du udføre følgende forespørgsel i HR database.

OPRET TABEL MEDARBEJDERE ( [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) )

Når databasen og tabellen er oprettet, skal vi oprette en sammenkædet server for at udføre en forespørgsel på tværs af servere. For at oprette en sammenkædet server mellem lokal SQL-serverinstans og Azure SQL serverinstans skal du udføre følgende kommando på lokal SQL Server-instans.

BRUG [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' /* AF SIKKERHEDSGRUNDE ER DEN LINKED SERVER FJERNLOGIN-ADGANGSKODE ÆNDRET MED ######## */ EXEC MASTER.DBO.SP_ADDLINKEDSRVLOGIN @RMTSRVNAME=N'AZURESSERF_S=N'AZURESSERF'='FALSK', @LOCALLOGIN=NULL, @RMTUSER=N'NISARGUPADHYAY', @RMTPASSWORD='########' GÅ EXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'AZURE_SQL_SERVER', @OPTNAME=N' DATAADGANG', @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 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

Når den linkede server er oprettet, kan du eksportere data fra medarbejderne tabel, oprettet på den lokale forekomst af SQL-server til c-medarbejderne tabel oprettet på Azure SQL Server Instance. For at gøre det skal du udføre følgende forespørgsel på den lokale SQL Server-instans:

INSERT INTO [AZURE_SQL_SERVER].Cloud_HR_DB.DBO.cEMPLOYEES ([FULL_NAME], [PREFERRED_NAME], [SEARCH_NAME], [LOGON_NAME], [PHONE_NUMBER], [FAX_NUMBER], [EMAIL_ADDRESS]) VÆLG FULL_NAME, PREEARCHERRED LOGON_NAME, PHONE_NUMBER, FAX_NUMBER, EMAIL_ADDRESS FRA HR..EMPLOYEES

Når data er eksporteret fra en lokal instans til Azure Instance, skal du udføre følgende forespørgsel for at bekræfte, at data er blevet kopieret.

VÆLG * FRA [AZURE_SQL_SERVER].Cloud_HR_DB.DBO.cEMPLOYEES

Følgende er output:

Vi kan også kopiere data til en ekstern server uden at bruge Linked Server. For at gøre det skal vi bruge nøgleordet OPENROWSET. OPENROWSET er en ad-hoc metode til at forbinde og få adgang til fjerndatakilde ved hjælp af OLEDB. For yderligere læsning af OPENROWSET henvises til Microsofts dokumentation af OPENROWSET.

Nu i det følgende eksempel vil jeg kopiere data fra c-medarbejderne tabel oprettet på Cloud_HR_DB til medarbejderne database oprettet på den lokale instans. Vi kopierer kun de poster, der har Email_Address like” contoso.com.

For at kopiere data skal du oprette en tabel med navnet "ContosoEmployees " i "HR " database. For at gøre det skal du udføre følgende forespørgsel:

OPRET TABEL [DBO].[CONTOSOEMPLAYEES] ( [ID] [INT] IDENTITET(1, 1) IKKE 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

For nu at indsætte data ved hjælp af OPENROWSET, skal vi aktivere "ad hoc-distribuerede forespørgsler ” avanceret mulighed. For at gøre det skal du udføre følgende kommando.

EXEC SP_CONFIGURE 'VIS AVANCEREDE VALGMULIGHEDER',1GENKONFIGURER MED OVERRIDEEXEC SP_CONFIGURE 'AD HOC DISTRIBUTEREDE FORESPØRGSEL',1GENKONFIGURER MED TILSIDE

Nu skal du kopiere data fracEmployees tabel forCloud_HR_DB (Azure Instance) database til "ContosoEmployees " i "Medarbejdere ” database (Local Instance), skal du udføre følgende forespørgsel på den lokale server:

BRUG HR GO INDSÆT I KONTOSOEMPERATØRER ([FULL_NAME], [PREFERRED_NAME], [SEARCH_NAME], [LOGON_NAME], [PHONE_NUMBER], [FAX_NUMBER], [EMAIL_ADDRESS]) VÆLG * FRA OPENROWSET('SQLNCLI11', 'SERVER=COMPANYEMPLOYEES.DATABASE.WINDOWS.NET,1433;DATABASE=CLOUD_HR_DB;UID=NISARGUPADHYAY;[email protected]', 'VÆLG FULL_NAME, PREFERRED_NAME, SEARCH_NAME, LOGON_NAME, 'PHONE_NUMBER_NUMBER', FMPSOADILESSY COM%''')A

Når data er eksporteret fra en lokal instans til Azure Instance, skal du udføre følgende forespørgsel for at bekræfte, at data er blevet kopieret.

VÆLG FULL_NAME, PREFERRED_NAME, SEARCH_NAME, LOGON_NAME, PHONE_NUMBER, FAX_NUMBER, EMAIL_ADDRESS FRA CONTOSOEMPLYEES

Følgende er output:

I denne artikel har jeg forklaret, hvordan man:

  1. Kopiér data mellem to tabeller, der er oprettet i et andet skema.
  2. Kopiér data mellem to tabeller oprettet i forskellige databaser på den samme server.
  3. Kopiér data mellem to tabeller, der er oprettet i forskellige databaser på den forskellige server (Cross server-forespørgsel).

  1. 5 hurtige nyttige tips til SQL Server Production DBA'er

  2. Find ud af, om en værdi indeholder mindst ét ​​numerisk ciffer i SQLite

  3. Sådan går du gennem en afgrænset liste i Oracle PLSQL

  4. Oracles standard DATO-format