Database
 sql >> база данни >  >> RDS >> Database

Разширен SQL:Вариации и различни случаи на употреба на T-SQL Insert Statement

В предишната си статия демонстрирах:

  1. Вмъкнете изхода на функцията с таблична стойност в SQL таблицата.
  2. Вмъкнете изхода на функцията с таблична стойност, която е създадена на отдалечения сървър на база данни.

В тази статия ще демонстрирам:

  1. Копиране на данни между две таблици, създадени в различна схема.
  2. Копирайте данни между две таблици, създадени в различни бази данни на един и същ сървър.
  3. Копирайте данни между две създадени таблици, в различни бази данни се намира на различния сървър (заявка за кръстосани сървъри)

Прехвърляне на данни между две таблици, създадени в различна схема.

За да копираме данни между две таблици, създадени в различна схема, трябва да използваме следния синтаксис:

INSERT INTO . (COLUMN1, COLUMN2, COLUMN3 ..) ИЗБЕРЕТЕ КОЛОНА1, КОЛОНА2, КОЛОНА3 ОТ .

За демонстрация ще използвам WideWorldImportors база данни. Искам да копирам всички записи от [Приложение].[Хора] таблица към [dbo].[EmployeesWithoutLogonName] таблица, която има LOGONNAME равно на ”NO LOGON .”

Първо, нека прегледаме данните от [Приложение].[Хора] маса. За да направите това, изпълнете следната заявка:

ИЗБЕРЕТЕ [PERSONID], [FULLNAME], [PREFERREDNAME], [SEARCHNAME], [LOGONNAME], [PHONENUMBER], [FAXNUMBER], [EMAILADDRESS] ОТ APPLICATION.PEOPLE WHERE LOGONNAME ='NO LOGON'

Следва екранна снимка на изхода:

Сега нека създадем [dbo].[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) )

Сега нека копираме записи от [Приложение].[Хора] до [dbo].[EmployeesWithoutLogonName] . За да направите това, изпълнете следната заявка:

ВЪВЕТЕ ВЪВ [DBO].[СЛУЖИТЕЛИ БЕЗ ИМЕТО НА ИМЕТО] ([FULL_NAME], [PREFERRED_NAME], [SEARCH_NAME], [LOGON_NAME], [PHONE_NUMBER], [FAX_NUMBER], [EMAIL_ADDRESS]) ИЗБЕРЕТЕ [FULLNAME], [PREFERREDNAME] [SEARCHNAME], [LOGONNAME], [PHONENUMBER], [FAXNUMBER], [EMAILADDRESS] ОТ APPLICATION.PEOPLE WHERE LOGONNAME ='NO LOGON'

След като данните бъдат вмъкнати, изпълнете следната заявка, за да проверите дали данните са копирани.

ИЗБЕРЕТЕ * ОТ СЛУЖИТЕЛИ БЕЗ ИМЕ НА ВХОД

Следното е изходът:

Копиране на данни между две таблици, създадени в различна база данни

Както обясних по-горе, можем да копираме данни между таблици, създадени в две различни схеми. По същия начин можем да копираме данни между две таблици, създадени в две различни бази данни. За да копира данни между две бази данни, потребителят трябва да има „db_datareader ” разрешение за изходната база данни и „db_datawriter ” в целевата база данни.

Следва синтаксисът:

INSERT INTO .. ( COLUMN1, COLUMN2, COLUMN3 .. ) ИЗБЕРЕТЕ COLUMN1, COLUMN2, COLUMN3 ОТ  

Сега, за да демонстрирам, създадох нова база данни, наречена „HR“. За да създадете база данни, изпълнете следната команда.

СЪЗДАВАНЕ НА БАЗА ДАННИ HR

Сега искам да копирам данни на EmployeesWithoutLogonName таблица, създадена вWideWorldImportors база данни към „Служители ” таблица, създадена в HR база данни.

Първо, нека създадем таблица с име „Служители ” в HR база данни. За да направите това, изпълнете следната заявка:

ИЗПОЛЗВАЙТЕ HR GO CREATE ТАБЛИЧНИ СЛУЖИТЕЛИ ( [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) )

Сега, за да копирате данни от „EmployeesWithoutLogonName ” таблица към „СЛУЖИТЕЛИ ” нека изпълним следната заявка:

INSERT INTO HR.DBO.EMPLOYEES ([FULL_NAME], [PREFERRED_NAME], [SEARCH_NAME], [LOGON_NAME], [PHONE_NUMBER], [FAX_NUMBER], [EMAIL_ADDRESS]) ИЗБЕРЕТЕ FULL_NAME, PREFERRED_NAME, SEARCH_NAME, SEARCH_NAME, NAME FAX_NUMBER, EMAIL_ADDRESS ОТ WIDEWORLDIMPORTERS.DBO.EMPLOYEESWITHOUTLOGONNAME

След като данните бъдат вмъкнати, изпълнете следната заявка, за да проверите дали данните са копирани.

ИЗБЕРЕТЕ * ОТ HR.DBO.СЛУЖИТЕЛИ

Следното е изходът:

Копирайте данни между две таблици, създадени в различните бази данни на различни сървъри

Сега, по подобен начин, можем да копираме данни между две таблици, създадени в две отделни бази данни, създадени на два различни сървъра. Това може да се извърши с помощта на Свързан сървър или OPENROWSET ключова дума.

Следва синтаксисът за свързване на SQL база данни, създадена на отдалечения сървър с помощта на свързан сървър.

INSERT INTO ... (COLUMN1, COLUMN2, COLUMN3 ..) SELECT COLUMN1, COLUMN2, COLUMN3 FROMBASEURNAME> 

В тази демонстрация ще копирам данни на Служител таблица, създадена в базата данни на служителите към базата данни SQL, създадена в облака на Azure. За да направите това, първо създайте база данни на Azure SQL екземпляр. Създадох пул от ресурси на SQL сървър с име „companyemployees.database.windows.net.

Сега, за да създадете база данни за човешки ресурси в екземпляр на база данни Azure, отворете студио за управление на SQL Server. В текстовото поле за име на сървъра изберете „companyemployees.database.windows.net“. Ще използваме удостоверяване на SQL Server за свързване на SQL екземпляр. За да направите това, изберете „SQL Server authentication“ в падащото поле за тип удостоверяване. Предоставете подходящо потребителско име и парола и щракнете върху свързване. Вижте следната екранна снимка.

Сега, за да създадете „Cloud_HR_DB ” база данни, натиснете Ctrl+N за да отворите прозореца на редактора на заявки и изпълнете следната команда.

СЪЗДАВАНЕ НА БАЗА ДАННИ CLOUD_HR_DB GO

Вижте следното изображение.

След като базата данни е създадена, изпълнете следната заявка, за да създадете „cEmployees ” таблица в Cloud_HR_DB база данни. За да направите това, изпълнете следната заявка в HR база данни.

СЪЗДАВАНЕ НА СЛУЖИТЕЛИ НА ТАБЛИЦА ( [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) )

След като базата данни и таблицата са създадени, трябва да създадем свързан сървър, за да изпълним междусървърна заявка. За да създадете свързан сървър между екземпляр на локален SQL сървър и екземпляр на Azure SQL сървър, изпълнете следната команда на локален екземпляр на SQL сървър.

ИЗПОЛЗВАЙТЕ [MASTER] GO EXEC MASTER.DBO.SP_ADDLINKEDSERVER @SERVER =N'AZURE_SQL_SERVER', @SRVPRODUCT=N'', @PROVIDER=N'SQLNCLI', @DATASRC=N'COMPANYEMPLOYEES.DATABASE.NETWIND , @CATALOG=N'CLOUD_HR_DB' /* ОТ СЪОБРАЖЕНИЯ ЗА СИГУРНОСТ ПАРОЛАТА ЗА ОТДАЛЕН СЪРВЪР СЕ ПРОМЕНЯ С ######## */ EXEC MASTER.DBO.SP_ADDLINKEDSRVLOGIN @RMTSRVSQUELFNAME=N'NAZESURE 'FALSE', @LOCALLOGIN=NULL, @RMTUSER=N'NISARGUPADHYAY', @RMTPASSWORD='########' ОТКРИ EXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'AZURE_SQL_SERVER', @OPTNAME=N' ДОСТЪП ДО ДАННИ', @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 @SERVEROPTION =N'AZURE_SQL_SERVER', @OPTNAME=N'RPC OUT', @OPTVALUE=N'TRUE' GO EXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'AZURE_SQL_SERVER', @OPTNAME=N'ВРЕМЕ НА СЪЕДИНЕНИЕ', @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_S SERVER=N'AZURE_SQL_SERVER', @OPTNAME=N'REMOTE PROC ПРОМОЦИЯ НА ТРАНЗАКЦИИ', @OPTVALUE=N'TRUE' GO

След като свързаният сървър е създаден, позволява експортиране на данни на Служителите таблица, създадена на локалния екземпляр на SQL сървър за cEmployees таблица, създадена в екземпляра на Azure SQL Server. За да направите това, изпълнете следната заявка на локален екземпляр на SQL Server:

ВЪВЕТЕ ВЪВ [AZURE_SQL_SERVER].Cloud_HR_DB.DBO.cEMPLOYEES ([FULL_NAME], [PREFERRED_NAME], [SEARCH_NAME], [LOGON_NAME], [PHONE_NUMBER], [FAX_NUMBER], [EMAIL_ADDRESS]) ИЗБЕРЕТЕ ПРЕДВАРИТЕЛНО ИМЕ, FULLFERCHRED_NAME LOGON_NAME, PHONE_NUMBER, FAX_NUMBER, EMAIL_ADDRESS ОТ HR..СЛУЖИТЕЛИ

След като данните се експортират от локален екземпляр към Azure екземпляр, изпълнете следната заявка, за да проверите дали данните са копирани.

ИЗБЕРЕТЕ * ОТ [AZURE_SQL_SERVER].Cloud_HR_DB.DBO.cEMPLOYEES

Следното е изходът:

Можем също да копираме данни на отдалечен сървър, без да използваме свързан сървър. За да направим това, трябва да използваме ключовата дума OPENROWSET. OPENROWSET е ad-hoc метод за свързване и достъп до отдалечен източник на данни с помощта на OLEDB. За по-нататъшно четене на OPENROWSET вижте документацията на Microsoft за OPENROWSET.

Сега в следващия пример ще копирам данни от cEmployees таблица, създадена в Cloud_HR_DB доСлужителите база данни, създадена на локалния екземпляр. Ще копираме само онези записи, които имат Email_Address харесвам”contoso.com.

Сега, за да копирате данни, създайте таблица с име „ContosoEmployees ” в „HR " база данни. За да направите това, изпълнете следната заявка:

СЪЗДАВАНЕ НА ТАБЛИЦА [DBO].[CONTOSOEMPLOYEES] ( [ID] [INT] IDENTITY(1, 1) НЕ НУЛЕВО, [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 ) GO

Сега, за да вмъкнем данни с помощта на OPENROWSET, трябва да активираме „Ad Hoc разпределени заявки ” разширена опция. За да направите това, изпълнете следната команда.

EXEC SP_CONFIGURE 'ПОКАЗВАНЕ НА РАЗПРЕДЕЛЕНИТЕ ОПЦИИ',1ПРЕКОНФИГУРИРАНЕ С OVERRIDEEXEC SP_CONFIGURE 'AD HOC РАЗПРЕДЕЛЕНИ ЗАПИСКИ',1ПРЕКОНФИГУРИРАНЕ С ОТМЕНЯНЕ

Сега, за да копирате данни отcEmployees таблица на Cloud_HR_DB (екземпляр на Azure) база данни към „ContosoEmployees ” в „Служители ” база данни (локален екземпляр), изпълнете следната заявка на локалния сървър:

ИЗПОЛЗВАЙТЕ HR GO INSERT INTO CONTOSOEMPLOYEES ([FULL_NAME], [PREFERRED_NAME], [SEARCH_NAME], [LOGON_NAME], [PHONE_NUMBER], [FAX_NUMBER], [EMAIL_ADDRESS]) SELECT * FROM OPENROWSET('VER'SQLNC'LISER1=) COMPANYEMPLOYEES.DATABASE.WINDOWS.NET,1433;DATABASE=CLOUD_HR_DB;UID=NISARGUPADHYAY;[email protected]', 'ИЗБЕРЕТЕ ПЪЛНО_ИМЕ, PREFERRED_NAME, SEARCH_NAME, LOGON_NAME, FROMADHERCEMPEMAIL_NAME, KEDREEHER ИМЕЕЙЛ ЗА ИМЕЙЛ. COM%''')A

След като данните се експортират от локален екземпляр към Azure екземпляр, изпълнете следната заявка, за да проверите дали данните са копирани.

ИЗБЕРЕТЕ FULL_NAME, PREFERRED_NAME, SEARCH_NAME, LOGON_NAME, PHONE_NUMBER, FAX_NUMBER, EMAIL_ADDRESS ОТ CONTOSOEMPLOYEES

Следното е изходът:

В тази статия обясних как да:

  1. Копирайте данни между две таблици, създадени в различна схема.
  2. Копирайте данни между две таблици, създадени в различни бази данни на един и същ сървър.
  3. Копирайте данни между две таблици, създадени в различни бази данни на различния сървър (заявка за кръстосани сървъри).

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Маскиране на данни в DB приложения

  2. SQL АКТУАЛИЗАЦИЯ за начинаещи

  3. Решения за читатели за предизвикателството на специалните острови

  4. Няколко начина за вмъкване на разделени разделени низове в колона

  5. Създаване на просто уеб приложение с бутилка, SQLAlchemy и API на Twitter