sql >> Databasteknik >  >> RDS >> Database

Avancerad SQL:Variationer och olika användningsfall av T-SQL Insert Statement

I min tidigare artikel demonstrerade jag:

  1. Infoga utdata från den tabellvärdade funktionen i SQL-tabellen.
  2. Infoga utdata från den tabellvärderade funktionen som skapas på fjärrdatabasservern.

I den här artikeln kommer jag att demonstrera:

  1. Kopiera data mellan två tabeller, skapade i ett annat schema.
  2. Kopiera data mellan två tabeller, skapade i olika databaser på samma server.
  3. Kopiera data mellan två skapade tabeller, i olika databaser finns den olika servern (Cross server-fråga)

Överför data mellan två tabeller skapade i ett annat schema.

För att kopiera data mellan två tabeller skapade i ett annat schema måste vi använda följande syntax:

INSERT INTO . (COLUMN1, COLUMN2, COLUMN3 .. ) VÄLJ KOLUMN1, COLUMN2, COLUMN3 FRÅN .

För demonstration kommer jag att använda WideWorldImportors databas. Jag vill kopiera alla poster från [Application].[People] tabellen till [dbo].[AnställdaUtanLogonnamn] tabell som har LOGONNAME lika med "NO LOGON .”

Låt oss först granska data från [Applikationen].[People] tabell. För att göra det, kör följande fråga:

VÄLJ [PERSONID], [FULLNAME], [PREFERREDNAME], [SÖKNAMN], [LOGONNAME], [TELEFONNUMMER], [FAXNUMMER], [EMAILADDRESS] FRÅN APPLIKATIONEN. PERSONER DÄR LOGONNAME ='INGEN LOGON'

Följande är en skärmdump av utdata:

Låt oss nu skapa [dbo].[EmployeesWithoutLogonName] tabell. För att göra det, kör följande fråga:

SKAPA TABELL ANSTÄLLDA UTAN LOGONNAME ( [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) )

Låt oss nu kopiera poster från [Application].[People] till [dbo].[Anställda utan inloggningsnamn] . För att göra det, kör följande fråga:

INSERT I [DBO].[EMPLOYEESWITHOUTLOGONNAME] ([FULL_NAME], [PREFERRED_NAME], [SEARCH_NAME], [LOGON_NAME], [PHONE_NUMBER], [FAX_NUMBER], [EMAIL_ADDRESS]) VÄLJ [FULLNAME], [PREFERREDNAME], [SÖKNAMN], [LOGONNAME], [TELEFONNUMMER], [FAXNUMMER], [EMAILADDRESS] FRÅN APPLICATION.PEOPLE WHERE LOGONNAME ='INGEN LOGON'

När data har infogats, kör följande fråga för att verifiera att data har kopierats.

VÄLJ * FRÅN MEDARBETAREWITHOUTLOGONNAME

Följande är utdata:

Kopiera data mellan två tabeller, skapade i en annan databas

Som jag förklarade ovan kan vi kopiera data mellan tabeller skapade i två olika scheman. På samma sätt kan vi kopiera data mellan två tabeller skapade i två olika databaser. För att kopiera data mellan två databaser måste användaren ha "db_datareader ” behörighet på källdatabasen och ”db_datawriter ” på destinationsdatabasen.

Följande är syntaxen:

INSERT INTO .. (COLUMN1, COLUMN2, COLUMN3 .. ) VÄLJ KOLUMN1, COLUMN2, COLUMN3 FRÅN .>. 

Nu för att demonstrera har jag skapat en ny databas med namnet "HR." För att skapa en databas, kör följande kommando.

SKAPA DATABAS HR

Nu vill jag kopiera data från Anställda utan inloggningsnamn tabell, skapad iWideWorldImportors databas till "Anställda ” tabell skapad i HR databas.

Låt oss först skapa en tabell med namnet "Anställda ” i HR databas. För att göra det, kör följande fråga:

ANVÄND HR GO SKAPA TABELL ANSTÄLLDA ( [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 för att kopiera data från "Anställda utan inloggningsnamn " tabellen till "ANSTÄLLDA ” tabell, låt oss köra följande fråga:

INSERT I HR.DBO.EMPLOYEES ([FULL_NAME], [PREFERRED_NAME], [SEARCH_NAME], [LOGON_NAME], [PHONE_NUMBER], [FAX_NUMBER], [EMAIL_ADDRESS]) VÄLJ FULL_NAME, PREFERRED_NAME, SEARCH_NAME, LOGON_NAME, PHEL FAX_NUMBER, EMAIL_ADDRESS FRÅN WIDEWORLDIMPORTERS.DBO.EMPLOYEESWITHOUTLOGONNAME

När data har infogats, kör följande fråga för att verifiera att data har kopierats.

VÄLJ * FRÅN HR.DBO.EMPLOYEES

Följande är utdata:

Kopiera data mellan två tabeller, skapade i de olika databaserna på olika servrar

Nu kan vi på liknande sätt kopiera data mellan två tabeller skapade på två separata databaser skapade på två olika servrar. Detta kan utföras med Länkad server eller OPENROWSET nyckelord.

Följande är syntaxen för att ansluta SQL-databas skapad på fjärrservern med hjälp av länkad server.

INSERT INTO ... (KOLUMN1, COLUMN2, COLUMN3 .. ) VÄLJ KOLUMN1, KOLUMN2, KOLUMN3 FRÅN FÖRRETAGNAMNAMN.> 

I den här demon kommer jag att kopiera data från Anställd tabell skapad på anställdas databas till SQL-databas skapad på Azure-molnet. För att göra det, skapa först en databas på Azure SQL Instance. Jag har skapat en SQL-serverresurspool med namnet "companyemployees.database.windows.net.

För att skapa en HR-databas på Azure-databasinstansen öppnar du SQL Server Management Studio. I servernamnstextrutan väljer du "companyemployees.database.windows.net." Vi kommer att använda SQL Server-autentisering för att ansluta SQL-instanser. För att göra det, välj "SQL Server-autentisering" i rullgardinsmenyn för autentiseringstyp. Ange lämpligt användarnamn och lösenord och klicka på anslut. Se följande skärmdump.

Nu ska du skapa "Cloud_HR_DB ” databas, tryck på Ctrl+N för att öppna frågeredigeringsfönstret och köra följande kommando.

SKAPA DATABAS CLOUD_HR_DB GÅ

Se följande bild.

När databasen har skapats, kör följande fråga för att skapa "cEmployees ” tabellen på Cloud_HR_DB databas. För att göra det, kör följande fråga i HR databas.

SKAPA TABELL MEDARBETARE ( [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 och tabellen väl har skapats måste vi skapa en länkad server för att utföra en korsserverförfrågan. För att skapa en länkad server mellan lokal SQL-serverinstans och Azure SQL-serverinstans, kör följande kommando på lokal SQL Server-instans.

ANVÄND [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' /* AV SÄKERHETSSKÄLSOR ÄR LÄNKAD SERVER FJÄRRINLOGGNINGSLÖSENORD ÄNDRAS MED ######## */ EXEC MASTER.DBO.SP_ADDLINKEDSRVLOGIN @RMTSRVNAME=N'AZURESSERF'=N'AZURESSERF'='FALSE', @LOCALLOGIN=NULL, @RMTUSER=N'NISARGUPADHYAY', @RMTPASSWORD='########' GÅ EXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'AZURE_SQL_SERVER', @OPTNAME=N' DATAÅTKOMST', @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 länkade servern har skapats kan du exportera data från anställda tabell, skapad på den lokala instansen av SQL-servern till cEmployees tabell skapad på Azure SQL Server Instance. För att göra det, kör följande fråga på lokal SQL Server-instans:

INSERT I [AZURE_SQL_SERVER].Cloud_HR_DB.DBO.cEMPLOYEES ([FULL_NAME], [PREFERRED_NAME], [SEARCH_NAME], [LOGON_NAME], [PHONE_NUMBER], [FAX_NUMBER], [EMAIL_ADDRESS]) VÄLJ FULL_NAME, PREEARCHERRED LOGON_NAME, PHONE_NUMBER, FAX_NUMBER, EMAIL_ADDRESS FRÅN HR..EMPLOYEES

När data har exporterats från en lokal instans till Azure Instance, kör följande fråga för att verifiera att data har kopierats.

VÄLJ * FRÅN [AZURE_SQL_SERVER].Cloud_HR_DB.DBO.cEMPLOYEES

Följande är utdata:

Vi kan också kopiera data till en fjärrserver utan att använda länkad server. För att göra det måste vi använda nyckelordet OPENROWSET. OPENROWSET är en ad-hoc-metod för att ansluta och komma åt fjärrdatakälla med OLEDB. För ytterligare läsning av OPENROWSET, se Microsofts dokumentation av OPENROWSET.

Nu i följande exempel kommer jag att kopiera data från c-anställda tabell skapad på Cloud_HR_DB till anställda databas skapad på den lokala instansen. Vi kopierar endast de poster som har E-postadress gilla” contoso.com.

För att kopiera data, skapa en tabell med namnet "ContosoEmployees " i "HR " databas. För att göra det, kör följande fråga:

SKAPA TABELL [DBO].[KONTOSOMRÅDE] ( [ID] [INT] IDENTITET(1, 1) INTE 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 ) GÅ

För att nu infoga data med OPENROWSET måste vi aktivera "Distribuerade ad hoc-frågor ” avancerat alternativ. För att göra det, kör följande kommando.

EXEC SP_CONFIGURE 'VISA AVANCERADE ALTERNATIV',1OMKONFIGURERA MED ÅSNITT EXEC SP_CONFIGURE 'AD HOC DISTRIBUTERADE FRÅGOR',1OMKONFIGURERA MED ÅSNITT

Nu ska du kopiera data fråncAnställda tabellen för Cloud_HR_DB (Azure Instance) databas till "ContosoEmployees " i "Anställda ” databas (Local Instance), kör följande fråga på den lokala servern:

ANVÄND HR GO SÄTT IN I KONTOSOMRÅDET ([FULL_NAME], [PREFERRED_NAME], [SÖKNAMN], [LOGON_NAME], [PHONE_NUMBER], [FAX_NUMBER], [EMAIL_ADDRESS]) VÄLJ * FRÅN OPENROWSET('SQLNCLI11', 'SERVER=FÖRETAGET COM%''')A

När data har exporterats från en lokal instans till Azure Instance, kör följande fråga för att verifiera att data har kopierats.

VÄLJ FULL_NAME, PREFERRED_NAME, SEARCH_NAME, LOGON_NAME, PHONE_NUMBER, FAX_NUMBER, EMAIL_ADDRESS FROM CONTOSOEMPLYEES

Följande är utdata:

I den här artikeln har jag förklarat hur man:

  1. Kopiera data mellan två tabeller skapade i ett annat schema.
  2. Kopiera data mellan två tabeller skapade i olika databaser på samma server.
  3. Kopiera data mellan två tabeller skapade i olika databaser på den olika servern (korsserverfråga).

  1. Anslut HP-UX Itanium till SQL Server

  2. Installera PHP med Postgresql på MAC med homebrew

  3. Använder row_to_json() med kapslade kopplingar

  4. Initial array i funktion för att aggregera flerdimensionell array