Ve svém předchozím článku jsem demonstroval:
- Vložte výstup funkce s hodnotou tabulky do tabulky SQL.
- 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:
- Kopírujte data mezi dvěma tabulkami vytvořenými v jiném schématu.
- Kopírujte data mezi dvěma tabulkami vytvořenými v různých databázích na stejném serveru.
- 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 HRNyní 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.EMPLOYEESWITHOUTLOGONNAMEPo 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 GOViz 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' GOPo 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..EMPLOYEESJakmile 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ĚSTNANCINá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ÍTAbychom 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ŘEPISEMNyní 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%''')AJakmile 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 CONTOSOEMPLOYEESNásleduje výstup:
V tomto článku jsem vysvětlil, jak:
- Kopírujte data mezi dvěma tabulkami vytvořenými v jiném schématu.
- Kopírujte data mezi dvěma tabulkami vytvořenými v různých databázích na stejném serveru.
- Kopírujte data mezi dvěma tabulkami vytvořenými v různých databázích různého serveru (dotaz mezi servery).