Каков синтаксис T-SQL для подключения к другому SQL-серверу?
-
02-07-2019 - |
Вопрос
Если мне нужно скопировать хранимую процедуру (SP) с одного SQL-сервера на другой, я щелкаю правой кнопкой мыши по SP в SSMS и выбираю Script Stored Procedure as > СОЗДАТЬ в > Новое окно редактора запросов.Затем я меняю подключение, щелкнув правой кнопкой мыши в этом окне и выбрав Подключение> Изменить подключение...а затем выберите новый сервер и клавишу F5, чтобы запустить команду создать на новом сервере.
Итак, мой вопрос таков: "Каков синтаксис T-SQL для подключения к другому SQL-серверу?" так что я могу просто вставить это в начало скрипта create и нажать F5, чтобы запустить его, и он переключится на новый сервер и запустит скрипт create.
Набирая вопрос, я понял, что если я расскажу вам о том, что я пытаюсь сделать, вы, возможно, придумаете более быстрый и качественный способ от меня добиться этого.
Решение
Кроме того, убедитесь, что при написании запроса с участием связанного сервера вы включаете скобки, подобные этой:
SELECT * FROM [LinkedServer].[RemoteDatabase].[User].[Table]
Я обнаружил, что, по крайней мере, в 2000/2005 году скобки [] необходимы, по крайней мере, вокруг имени сервера.
Другие советы
В среде SQL Server Management Studio включите режим SQLCMD в меню Запроса.Затем в верхней части вашего скрипта введите приведенную ниже команду
:Connect server_name[\instance_name] [-l timeout] [-U user_name [-P password]
Если вы подключаетесь к нескольким серверам, обязательно вставьте GO
между соединениями; в противном случае ваш T-SQL не будет выполняться на том сервере, на который вы рассчитываете.
Обновить:для подключения к другому sql-серверу и выполнения инструкций sql вы должны использовать Утилита sqlcmd.Обычно это делается в пакетном файле.Вы можете комбинировать это с xmp_cmdshell если вы хотите выполнить это в management studio.
одним из способов является настройка связанный сервер.затем вы можете добавить связанный сервер и имя базы данных к имени таблицы.(выберите * в linkedserver.database.dbo.имя_таблицы)
USE master
GO
EXEC sp_addlinkedserver
'SEATTLESales',
N'SQL Server'
GO
Если бы я перефразировал вопрос - возможно ли выбрать серверный контекст для выполнения запроса в DDL - ответ был бы отрицательным.Только контекст базы данных может быть выбран программно с помощью USE.(предварительно выбрав контекст сервера извне)
Связанный сервер и ОТКРЫТЫЙ ЗАПРОС могут предоставить доступ к DDL, но требуют некоторого переписывания вашего кода для инкапсуляции в виде строки, что затрудняет разработку / отладку.
В качестве альтернативы вы могли бы прибегнуть к внешней программе-драйверу для получения SQL-файлов для отправки на удаленный сервер с помощью ОТКРЫТОГО ЗАПРОСА.Однако в большинстве случаев вы могли бы с таким же успехом подключиться к серверу напрямую в первую очередь для оценки DDL.
Всякий раз, когда мы пытаемся получить какие-либо данные с другого сервера, нам нужно выполнить два шага.
Первый шаг:
-- Server one scalar variable
DECLARE @SERVER VARCHAR(MAX)
--Oracle is the server to which we want to connect
EXEC SP_ADDLINKEDSERVER @SERVER='ORACLE'
Второй шаг:
--DBO is the owner name to know table owner name execute (SP_HELP TABLENAME)
SELECT * INTO DESTINATION_TABLE_NAME
FROM ORACLE.SOURCE_DATABASENAME.DBO.SOURCE_TABLE
Если вы подключаетесь к нескольким серверам, вам следует добавить "GO" перед переключением серверов, иначе ваши инструкции sql будут выполняться не на том сервере.
например ,
:CONNECT SERVER1
Select * from Table
GO
enter code here
:CONNECT SERVER1
Select * from Table
GO
Попробуйте создать связанный сервер (что вы можете сделать с помощью sp_addlink - сервер) , а затем с помощью ОТКРЫТЫЙ ЗАПРОС
на моем диске C я сначала создаю текстовый файл для создания новой таблицы.Вы можете использовать в этом текстовом файле все, что захотите
в этом случае текстовый файл называется "Bedrijf.txt".
содержание:
Print 'START(A) create table'
GO 1
If not EXISTS
(
SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'Bedrijf'
)
BEGIN
CREATE TABLE [dbo].[Bedrijf] (
[IDBedrijf] [varchar] (38) NOT NULL ,
[logo] [varbinary] (max) NULL ,
[VolledigeHandelsnaam] [varchar] (100) NULL
) ON [PRIMARY]
сохрани это
затем я создаю другой текстовый файл с именем "Bedrijf.bat" и расширением bat.Это содержание:
OSQL.EXE -U Username -P Password -S IPaddress -i C:Bedrijf.txt -o C:Bedrijf.out -d myDatabaseName
сохраните его и в проводнике дважды щелкните, чтобы выполнить
Результаты будут сохранены в текстовом файле на вашем диске C с именем "Bedrijf.out".
это показывает
1> 2> 3> START(A) create table
если все пойдет хорошо
Вот и все
Если возможно, ознакомьтесь с SSIS (SQL Server Integration Services).Я только начинаю осваивать этот инструментарий, но уже перебираю более 40 серверов и готовлюсь сеять всевозможный хаос ;)
Попробуйте ввести в PowerShell что-то вроде:
$cn = new-object system.data.SqlClient.SQLConnection("Data Source=server1;Initial Catalog=db1;User ID=user1;Password=password1");
$cmd = new-object system.data.sqlclient.sqlcommand("exec Proc1", $cn);
$cn.Open();
$cmd.CommandTimeout = 0
$cmd.ExecuteNonQuery()
$cn.Close();