sql >> Databáze >  >> RDS >> Database

Advanced SQL:Variace a různé případy použití T-SQL Insert Statement

Ve svém předchozím článku jsem demonstroval:

  1. Vložte výstup funkce s hodnotou tabulky do tabulky SQL.
  2. Vložte výstup funkce s hodnotou tabulky, která je vytvořena na vzdáleném databázovém serveru.

V tomto článku ukážu:

  1. Kopírujte data mezi dvěma tabulkami vytvořenými v jiném schématu.
  2. Kopírujte data mezi dvěma tabulkami vytvořenými v různých databázích na stejném serveru.
  3. Kopírujte data mezi dvěma vytvořenými tabulkami, v různých databázích se nachází jiný server (dotaz mezi servery)

Přenos dat mezi dvěma tabulkami vytvořenými v jiném schématu.

Ke kopírování dat mezi dvěma tabulkami vytvořenými v jiném schématu musíme použít následující syntaxi:

INSERT INTO . ( COLUMN1, COLUMN2, COLUMN3 .. ) VYBERTE COLUMN1, COLUMN2, COLUMN3 ZE .

Pro demonstraci použiji WideWorldImportors databáze. Chci zkopírovat všechny záznamy z [Aplikace].[Lidé] tabulky do [dbo].[EmployeesWithoutLogonName] tabulka, která má LOGONNAME rovno „NO LOGON .“

Nejprve se podívejme na data z [Aplikace].[Lidé] stůl. Chcete-li to provést, proveďte následující dotaz:

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

Následuje snímek obrazovky s výstupem:

Nyní vytvoříme [dbo].[EmployeesWithoutLogonName] stůl. Chcete-li to provést, proveďte následující dotaz:

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

Nyní zkopírujeme záznamy z [Aplikace].[Lidé] na [dbo].[EmployeesWithoutLogonName] . Chcete-li to provést, proveďte následující dotaz:

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

Po vložení dat proveďte následující dotaz, abyste ověřili, že data byla zkopírována.

VYBERTE * Z ZAMĚSTNANCŮ BEZ PŘIHLÁŠENÍ

Následuje výstup:

Kopírování dat mezi dvěma tabulkami vytvořenými v jiné databázi

Jak jsem vysvětlil výše, můžeme kopírovat data mezi tabulkami vytvořenými ve dvou různých schématech. Podobně můžeme kopírovat data mezi dvěma tabulkami vytvořenými ve dvou různých databázích. Pro kopírování dat mezi dvěma databázemi musí mít uživatel „db_datareader ” oprávnění ke zdrojové databázi a “db_datawriter ” v cílové databázi.

Následuje syntaxe:

INSERT INTO .. ( COLUMN1, COLUMN2, COLUMN3 .. ) VYBERTE COLUMN1, COLUMN2, COLUMN3 FROM CHEMA>. 

Abych to demonstroval, vytvořil jsem novou databázi s názvem „HR“. Chcete-li vytvořit databázi, spusťte následující příkaz.

VYTVOŘTE DATABÁZI HR

Nyní chci zkopírovat data EmployeesWithoutLogonName tabulka vytvořená vWorldImportors databázi „Zaměstnanci ” tabulka vytvořená v HR databáze.

Nejprve vytvořte tabulku s názvem „Zaměstnanci “ v HR databáze. Chcete-li to provést, proveďte následující dotaz:

POUŽÍVEJTE ZAMĚSTNANCE HR GO CREATE TABLE ( [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) )

Nyní zkopírujte data z „EmployeesWithoutLogonName “ do tabulky „ZAMĚSTNANCI ” proveďte následující dotaz:

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, PHONELOGON FAX_NUMBER, EMAIL_ADDRESS FROM WIDEWORLDIMPORTERS.DBO.EMPLOYEESWITHOUTLOGONNAME

Po vložení dat proveďte následující dotaz, abyste ověřili, že data byla zkopírována.

VYBERTE * Z HR.DBO.ZAMĚSTNANCŮ

Následuje výstup:

Kopírování dat mezi dvěma tabulkami vytvořenými v různých databázích na různých serverech

Nyní, podobně, můžeme kopírovat data mezi dvěma tabulkami vytvořenými na dvou samostatných databázích vytvořených na dvou různých serverech. To lze provést pomocí Propojeného serveru nebo OPENROWSET klíčové slovo.

Následuje syntaxe pro připojení SQL databáze vytvořené na vzdáleném serveru pomocí Linked Server.

INSERT INTO ... (COLUMN1, COLUMN2, COLUMN3 .. ) VYBERTE COLUMN1, COLUMN2, COLUMN3 FROMETA>NÁZEV NÁZEV SLOUPCE>.> 

V této ukázce zkopíruji data Zaměstnance tabulky vytvořené v databázi Zaměstnanci k databázi SQL vytvořené v cloudu Azure. Chcete-li to provést, nejprve vytvořte databázi na instanci Azure SQL. Vytvořil jsem fond zdrojů serveru SQL s názvem „companyemployees.database.windows.net.

Chcete-li nyní vytvořit databázi HR na instanci databáze Azure, otevřete SQL Server Management Studio. V textovém poli názvu serveru vyberte „companyemployees.database.windows.net“. K připojení instance SQL použijeme ověřování SQL Server. Chcete-li to provést, vyberte v rozevíracím seznamu typ ověřování „Ověření serveru SQL“. Zadejte příslušné uživatelské jméno a heslo a klikněte na připojit. Viz následující snímek obrazovky.

Nyní vytvořte „Cloud_HR_DB ” databáze, stiskněte Ctrl+N otevřete okno editoru dotazů a spusťte následující příkaz.

VYTVOŘTE DATABÁZI CLOUD_HR_DB GO

Viz následující obrázek.

Jakmile je databáze vytvořena, proveďte následující dotaz a vytvořte „cZaměstnanci ” v tabulce Cloud_HR_DB databáze. Chcete-li to provést, proveďte následující dotaz v HR databáze.

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

Po vytvoření databáze a tabulky musíme vytvořit propojený server, abychom mohli provést dotaz mezi servery. Chcete-li vytvořit propojený server mezi místní instancí serveru SQL a instancí serveru Azure SQL, spusťte následující příkaz na místní instanci serveru SQL.

POUŽÍVEJTE [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' /* Z BEZPEČNOSTNÍCH DŮVODŮ JE ZMĚNĚNO HESLO PRO VZDÁLENÉ PŘIHLÁŠENÍ K PROPOJENÉMU SERVERU S ######## */ EXEC MASTER.DBO.SP_ADDLINKEDSRVLOGIN @RMTSRVNAME=N'AZURE_SQLUSE_SQLUSE 'FALSE', @LOCALLOGIN=NULL, @RMTUSER=N'NISARGUPADHYAY', @RMTPASSWORD='########' PŘEJÍT EXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'AZURE_SQL_SERVER', @OPTNAME=N' PŘÍSTUP K DATŮM', @OPTVALUE=N'TRUE' PŘEJÍT EXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'AZURE_SQL_SERVER', @OPTNAME=N'RPC', @OPTVALUE=N'TRUE' PŘEJÍT 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' PŘEJÍT EXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'AZURE_SQL_SERVER', @OPTNAME=N'QUERY TIMEOUT', @OPTVALUE=N'0' PŘEJÍT EXEC MASTER.DBO.SP_SERVEROPTION @ SERVER=N'AZURE_SQL_SERVER', @OPTNAME=PROMOCE TRANSAKCE N'VZDÁLENÝCH PROCŮ', @OPTVALUE=N'TRUE' GO

Po vytvoření propojeného serveru umožňuje exportovat data zaměstnanců tabulky vytvořené na místní instanci serveru SQL pro cZaměstnanci tabulky vytvořené v instanci Azure SQL Server. Chcete-li to provést, proveďte následující dotaz na místní instanci serveru SQL:

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

Jakmile jsou data exportována z místní instance do Azure Instance, spusťte následující dotaz a ověřte, zda byla data zkopírována.

VYBERTE * Z [AZURE_SQL_SERVER].Cloud_HR_DB.DBO.cZAMĚSTNANCI

Následuje výstup:

Můžeme také kopírovat data na vzdálený server bez použití Linked Server. K tomu musíme použít klíčové slovo OPENROWSET. OPENROWSET je ad-hoc metoda pro připojení a přístup ke vzdálenému zdroji dat pomocí OLEDB. Další informace o OPENROWSET naleznete v dokumentaci společnosti Microsoft k OPENROWSET.

Nyní v následujícím příkladu zkopíruji data od cZaměstnanci tabulka vytvořená v Cloud_HR_DB na Zaměstnance databáze vytvořená na lokální instanci. Zkopírujeme pouze ty záznamy, které mají Email_Address jako “ contoso.com.

Nyní ke kopírování dat vytvořte tabulku s názvem „ContosoEmployees “ v „HR “databáze. Chcete-li to provést, proveďte následující dotaz:

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 ) PŘEJÍT

Abychom nyní mohli vkládat data pomocí OPENROWSET, musíme povolit „Ad Hoc distribuované dotazy “pokročilá možnost. Chcete-li to provést, spusťte následující příkaz.

EXEC SP_CONFIGURE 'ZOBRAZIT POKROČILÉ MOŽNOSTI',1ZNOVU KONFIGUROVAT S PŘEPISEMEXEC SP_CONFIGURE 'AD HOC DISTRIBUOVANÉ DOTAZY',1ZNOVU KONFIGUROVAT S PŘEPISEM

Nyní zkopírujte data odcZaměstnanci tabulky Cloud_HR_DB (Azure Instance) databázi „ContosoEmployees “ v části „Zaměstnanci ” databáze (místní instance), proveďte na místním serveru následující dotaz:

POUŽÍVEJTE HR GO INSERT INTO CONTOSOEMPLOYEES ([FULL_NAME], [PREFERRED_NAME], [SEARCH_NAME], [LOGON_NAME], [PHONE_NUMBER], [FAX_NUMBER], [EMAIL_ADDRESS]) VYBRAT * Z OPENROWSET('SQL'NCLIVER11=', COMPANYEMPLOYEES.DATABASE.WINDOWS.NET,1433;DATABASE=CLOUD_HR_DB;UID=NISARGUPADHYAY;[email protected]', 'SELECT FULL_NAME, PREFERRED_NAME, SEARCH_NAME, LOGON_NAME, FAX_KEDRONEY_EMAIL'NUMBER'EMAIL'% EMAIL_CONCESOAD COM%''')A

Jakmile jsou data exportována z místní instance do Azure Instance, spusťte následující dotaz a ověřte, zda byla data zkopírována.

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

Následuje výstup:

V tomto článku jsem vysvětlil, jak:

  1. Kopírujte data mezi dvěma tabulkami vytvořenými v jiném schématu.
  2. Kopírujte data mezi dvěma tabulkami vytvořenými v různých databázích na stejném serveru.
  3. Kopírujte data mezi dvěma tabulkami vytvořenými v různých databázích různého serveru (dotaz mezi servery).

  1. 5 úloh, které vyžadují Microsoft Access

  2. Jak zrušit tabulky a sloupce pomocí SQL

  3. Hlavní trendy ve správě databází

  4. Jednotky data a času v MySQL (úplný seznam)