W moim poprzednim artykule zademonstrowałem:
- Wstaw wynik funkcji zwracającej tabelę do tabeli SQL.
- Wstaw dane wyjściowe funkcji zwracającej tabelę, która jest tworzona na zdalnym serwerze bazy danych.
W tym artykule pokażę:
- Skopiuj dane między dwiema tabelami utworzonymi w innym schemacie.
- Skopiuj dane między dwiema tabelami utworzonymi w różnych bazach danych na tym samym serwerze.
- Kopiuj dane między dwiema utworzonymi tabelami, w różnych bazach danych znajduje się inny serwer (zapytanie między serwerami)
Przesyłaj dane między dwiema tabelami utworzonymi w innym schemacie.
Aby skopiować dane między dwiema tabelami utworzonymi w innym schemacie, musimy użyć następującej składni:
INSERT INTO. ( COLUMN1, COLUMN2, COLUMN3 .. ) SELECT COLUMN1, COLUMN2, COLUMN3 FROM .
Do demonstracji użyję WideWorldImportors Baza danych. Chcę skopiować wszystkie rekordy z [Aplikacji].[Ludzie] tabeli do [dbo].[PracownicyBezLogonName] tabela, która ma nazwę LOGONNAME równą „BRAK LOGOWANIA ”.
Najpierw przejrzyjmy dane z [Aplikacji].[Ludzie] stół. Aby to zrobić, wykonaj następujące zapytanie:
SELECT [PERSONID], [FULLNAME], [PREFERREDNAME], [SEARCHNAME], [LOGONNAME], [PHONENUMBER], [FAXNUMBER], [EMAILADDRESS] FROM APPLICATION.PEOPLE WHERE LOGONNAME =„BRAK LOGOWANIA”
Poniżej znajduje się zrzut ekranu z danymi wyjściowymi:
Teraz utwórzmy [dbo].[EmployeesWithoutLogonName] stół. Aby to zrobić, wykonaj następujące zapytanie:
UTWÓRZ TABELĘ PRACOWNICYWITHOUTLOGONNAME ( [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) )
Teraz skopiujmy rekordy z [Aplikacja].[Ludzie] do [dbo].[PracownicyBezLogonName] . Aby to zrobić, wykonaj następujące zapytanie:
WSTAW DO [DBO].[EMPLOYEESWithOUTLOGONNAME] ([FULL_NAME], [PREFERRED_NAME], [SEARCH_NAME], [LOGON_NAME], [PHONE_NUMBER], [FAX_NUMBER], [EMAIL_ADDRESS]) SELECT [FULL_NAME], [PREFERREDNAME], [SEARCHNAME], [LOGONNAME], [PHONENUMBER], [FAXNUMBER], [EMAILADDRESS] Z APLIKACJI.LUDZIE WHERE LOGONNAME =„BRAK LOGOWANIA”
Po wstawieniu danych wykonaj następujące zapytanie, aby sprawdzić, czy dane zostały skopiowane.
WYBIERZ * Z PRACOWNIKÓWBEZ NAZWYLOGOWANIA
Oto wynik:
Kopiuj dane między dwiema tabelami, utworzone w innej bazie danych
Jak wyjaśniłem powyżej, możemy kopiować dane między tabelami utworzonymi w dwóch różnych schematach. Podobnie możemy skopiować dane między dwiema tabelami utworzonymi w dwóch różnych bazach danych. Aby skopiować dane między dwiema bazami danych, użytkownik musi mieć „db_datareader ” uprawnienie do źródłowej bazy danych i „db_datawriter ” w docelowej bazie danych.
Oto składnia:
INSERT INTO. . ( COLUMN1, COLUMN2, COLUMN3 .. ) SELECT COLUMN1, COLUMN2, COLUMN3 FROM . . Teraz, aby zademonstrować, stworzyłem nową bazę danych o nazwie „HR”. Aby utworzyć bazę danych, wykonaj następujące polecenie.
UTWÓRZ BAZĘ DANYCH HRTeraz chcę skopiować dane PracownikówBezLogonName tabela, utworzona wWideWorldImportors bazy danych do „Pracowników ” tabela utworzona w HR baza danych.
Najpierw utwórzmy tabelę o nazwie „Pracownicy ” w HR Baza danych. Aby to zrobić, wykonaj następujące zapytanie:
UŻYJ HR GO UTWÓRZ TABELĘ PRACOWNICY ( [ID] INT IDENTITY (1, 1), [FULL_NAME] VARCHAR (500), [PREFERRED_NAME] VARCHAR (500), [SEARCH_NAME] NVARCHAR(MAX), [LOGON_NAME] VARCHAR ( 250), [NUMER_TELEFONU] VARCHAR(50), [NUMER_FAXU] VARCHAR(100), [ADRES_EMAIL] NVARCHAR(250) )Teraz skopiuj dane z „PracownicyBezLogonName ” do tabeli „PRACOWNICY ”, wykonajmy następujące zapytanie:
WSTAW DO HR.DBO.EMPLOYEES ([FULL_NAME], [PREFERRED_NAME], [SEARCH_NAME], [LOGON_NAME], [PHONE_NUMBER], [FAX_NUMBER], [EMAIL_ADDRESS]) SELECT FULL_NAME, PREFERRED_NAME, SEARCH_NAME, LOGON_NAME, FAX_NUMBER, EMAIL_ADDRESS Z WIDEWORLDIMPORTERS.DBO.EMPLOYEESWITHOUTLOGONNAMEPo wstawieniu danych wykonaj następujące zapytanie, aby sprawdzić, czy dane zostały skopiowane.
WYBIERZ * Z HR.DBO.PRACOWNIKÓWOto wynik:
Kopiuj dane między dwiema tabelami, utworzone w różnych bazach danych na różnych serwerach
Teraz podobnie możemy kopiować dane między dwiema tabelami utworzonymi na dwóch osobnych bazach danych utworzonych na dwóch różnych serwerach. Można to zrobić za pomocą serwera połączonego lub OPENROWSET słowo kluczowe.
Poniżej znajduje się składnia połączenia z bazą danych SQL utworzoną na zdalnym serwerze przy użyciu połączonego serwera.
INSERT INTO. . . ( COLUMN1, COLUMN2, COLUMN3 .. ) SELECT COLUMN1, COLUMN2, COLUMN3 FROM NAZWY> W tym demo zamierzam skopiować dane Pracownika tabela utworzona na bazie danych Pracowników do bazy SQL utworzonej w chmurze Azure. Aby to zrobić, najpierw utwórz bazę danych w instancji Azure SQL. Utworzyłem pulę zasobów serwera SQL o nazwie „companyemployees.database.windows.net. ”
Teraz, aby utworzyć bazę danych HR w wystąpieniu bazy danych Azure, otwórz studio zarządzania SQL Server. W polu tekstowym nazwy serwera wybierz „firmaemployees.database.windows.net”. Do połączenia instancji SQL użyjemy uwierzytelniania SQL Server. Aby to zrobić, wybierz „Uwierzytelnianie SQL Server” w polu rozwijanym typu uwierzytelniania. Podaj odpowiednią nazwę użytkownika i hasło, a następnie kliknij Połącz. Zobacz poniższy zrzut ekranu.
Teraz utwórz „Cloud_HR_DB ”, naciśnij Ctrl+N aby otworzyć okno edytora zapytań i wykonać następujące polecenie.
UTWÓRZ BAZĘ DANYCH CLOUD_HR_DB GOZobacz poniższy obraz.
Po utworzeniu bazy danych wykonaj następujące zapytanie, aby utworzyć „pracowników ” tabela w Cloud_HR_DB Baza danych. Aby to zrobić, wykonaj następujące zapytanie w HR baza danych.
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 utworzeniu bazy danych i tabeli musimy utworzyć serwer połączony, aby wykonać zapytanie między serwerami. Aby utworzyć serwer połączony między instancją lokalnego serwera SQL a instancją serwera Azure SQL, wykonaj następujące polecenie na instancji lokalnego serwera SQL.
USE [MASTER] GO EXEC MASTER.DBO.SP_ADDLINKEDSERVER @SERVER =N'AZURE_SQL_SERVER', @SRVPRODUCT=N', @PROVIDER=N'SQLNCLI', @DATASRC=N'FIRMA PRACOWNICY.DATABASE.WINDOWS.NET' , @CATALOG=N'CLOUD_HR_DB' /* ZE WZGLĘDÓW BEZPIECZEŃSTWA HASŁO DO ZDALNEGO LOGOWANIA NA SERWERZE POŁĄCZONYM ZMIENIONE JEST NA ######## */ EXEC MASTER.DBO.SP_ADDLINKEDSRVLOGIN @RMTSRVNAME=N'AZURE_SQL_SERVER=', @USESELF 'FALSE', @LOCALLOGIN=NULL, @RMTUSER=N'NISARGUPADHYAY', @RMTPASSWORD='########' PRZEJDŹ DO EXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'AZURE_SQL_SERVER', @OPTNAME=N' DOSTĘP DO DANYCH', @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'LIMIT CZASU POŁĄCZENIA', @OPTVALUE=N „0” PRZEJDŹ DO 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'ZDALNA PROMOCJA TRANSAKCJI PROC', @OPTVALUE=N'TRUE'GOPo utworzeniu połączonego serwera wyeksportuj dane Pracowników tabela, utworzona na lokalnej instancji serwera SQL dla pracowników tabela utworzona w wystąpieniu Azure SQL Server. Aby to zrobić, wykonaj następujące zapytanie na lokalnej instancji SQL Server:
WSTAW DO [AZURE_SQL_SERVER].Cloud_HR_DB.DBO.cEMPLOYEES ([FULL_NAME], [PREFERRED_NAME], [SEARCH_NAME], [LOGON_NAME], [PHONE_NUMBER], [FAX_NUMBER], [EMAIL_ADDRESS]) SELECT FULL_, NAME, SEARFER_NAME LOGON_NAME, PHONE_NUMBER, FAX_NUMBER, EMAIL_ADDRESS OD HR... PRACOWNIKÓWPo wyeksportowaniu danych z wystąpienia lokalnego do wystąpienia platformy Azure wykonaj następujące zapytanie, aby sprawdzić, czy dane zostały skopiowane.
WYBIERZ * Z [AZURE_SQL_SERVER].Cloud_HR_DB.DBO.cPRACOWNICYOto wynik:
Możemy również kopiować dane na zdalny serwer bez korzystania z Linked Server. Aby to zrobić, musimy użyć słowa kluczowego OPENROWSET. OPENROWSET to doraźna metoda łączenia i uzyskiwania dostępu do zdalnego źródła danych przy użyciu OLEDB. Więcej informacji na temat OPENROWSET można znaleźć w dokumentacji firmy Microsoft dotyczącej OPENROWSET.
Teraz w poniższym przykładzie skopiuję dane od pracowników tabela utworzona w Cloud_HR_DB do Pracowników baza danych utworzona na instancji lokalnej. Skopiujemy tylko te rekordy, które mają Adres_e-mail jak” contoso.com. ”
Teraz, aby skopiować dane, utwórz tabelę o nazwie „ContosoEmployees ” w sekcji „HR " Baza danych. Aby to zrobić, wykonaj następujące zapytanie:
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 ) IdźTeraz, aby wstawić dane za pomocą OPENROWSET, musimy włączyć „Kwerendy rozproszone ad hoc ” opcja zaawansowana. Aby to zrobić, wykonaj następujące polecenie.
EXEC SP_CONFIGURE 'POKAŻ OPCJE ZAAWANSOWANE',1REKONFIGURUJ Z OVERRIDEEXEC SP_CONFIGURE 'ZAPYTANIA ROZPROSZONE AD HOC',1REKONFIGURUJ Z OVERRIDETeraz skopiuj dane odpracowników tabela Cloud_HR_DB (Instancja Azure) baza danych do „ContosoEmployees ” w sekcji „Pracownicy ” (lokalna instancja), wykonaj następujące zapytanie na lokalnym serwerze:
UŻYJ HR GO INSERT DO CONTOSOEMPLOYEES ([FULL_NAME], [PREFERRED_NAME], [SEARCH_NAME], [LOGON_NAME], [PHONE_NUMBER], [FAX_NUMBER], [EMAIL_ADDRESS]) WYBIERZ * Z OPENROWSET('SQLNCLI11', 'SERVER=COMPANYEMPLOYEES.DATABASE.WINDOWS.NET,1433;DATABASE=CLOUD_HR_DB;UID=NISARGUPADHYAY;[email protected]', 'WYBIERZ FULL_NAME, PREFERRED_NAME, SEARCH_NAME, LOGON_NAME, NUMER_TELEFONU, NUMER FAKSU, E-MAIL. COM%''')APo wyeksportowaniu danych z wystąpienia lokalnego do wystąpienia platformy Azure wykonaj następujące zapytanie, aby sprawdzić, czy dane zostały skopiowane.
SELECT FULL_NAME, PREFERRED_NAME, SEARCH_NAME, LOGON_NAME, PHONE_NUMBER, FAX_NUMBER, EMAIL_ADDRESS FROM CONTOSOEMPLOYEESOto wynik:
W tym artykule wyjaśniłem, jak:
- Skopiuj dane między dwiema tabelami utworzonymi w innym schemacie.
- Skopiuj dane między dwiema tabelami utworzonymi w różnych bazach danych na tym samym serwerze.
- Skopiuj dane między dwiema tabelami utworzonymi w różnych bazach danych różnych serwerów (zapytanie między serwerami).