Database
 sql >> Baza danych >  >> RDS >> Database

Zaawansowany SQL:odmiany i różne przypadki użycia instrukcji Insert T-SQL

W moim poprzednim artykule zademonstrowałem:

  1. Wstaw wynik funkcji zwracającej tabelę do tabeli SQL.
  2. Wstaw dane wyjściowe funkcji zwracającej tabelę, która jest tworzona na zdalnym serwerze bazy danych.

W tym artykule pokażę:

  1. Skopiuj dane między dwiema tabelami utworzonymi w innym schemacie.
  2. Skopiuj dane między dwiema tabelami utworzonymi w różnych bazach danych na tym samym serwerze.
  3. 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 HR

Teraz 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.EMPLOYEESWITHOUTLOGONNAME

Po wstawieniu danych wykonaj następujące zapytanie, aby sprawdzić, czy dane zostały skopiowane.

WYBIERZ * Z HR.DBO.PRACOWNIKÓW

Oto 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 GO

Zobacz 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'GO

Po 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ÓW

Po 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.cPRACOWNICY

Oto 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 OVERRIDE

Teraz 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%''')A

Po 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 CONTOSOEMPLOYEES

Oto wynik:

W tym artykule wyjaśniłem, jak:

  1. Skopiuj dane między dwiema tabelami utworzonymi w innym schemacie.
  2. Skopiuj dane między dwiema tabelami utworzonymi w różnych bazach danych na tym samym serwerze.
  3. Skopiuj dane między dwiema tabelami utworzonymi w różnych bazach danych różnych serwerów (zapytanie między serwerami).

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dzielenie ciągów:teraz z mniejszą ilością T-SQL

  2. Używanie isql z parametrami połączenia

  3. Strojenie:dobre miejsce na rozpoczęcie

  4. Jakiej funkcji maskowania danych należy użyć?

  5. Skuteczna obsługa wartości NULL za pomocą funkcji SQL COALESCE dla początkujących