Какой синтаксис T-SQL для подключения к другому серверу SQL? - PullRequest
57 голосов
/ 24 сентября 2008

Если мне нужно скопировать хранимую процедуру (SP) с одного сервера SQL на другой, я щелкаю правой кнопкой мыши на SP в SSMS и выбираю «Хранимая процедура сценария» как> СОЗДАТЬ в> Окно нового редактора запросов. Затем я меняю соединение, щелкнув правой кнопкой мыши в этом окне и выбрав Соединение> Изменить соединение ..., а затем выбрав новый сервер и F5 для запуска создания на новом сервере.

Итак, мой вопрос: «Что такое синтаксис T-SQL для подключения к другому SQL Server?» так что я могу просто вставить это в верхнюю часть скрипта создания и F5, чтобы запустить его, и он переключится на новый сервер и запустит скрипт создания.

Набирая вопрос, я понял, что, если я дам вам основание для того, что я пытаюсь сделать, вы могли бы предложить мне более быстрый и лучший способ сделать это.

Ответы [ 10 ]

83 голосов
/ 01 июля 2010

В SQL Server Management Studio включите режим SQLCMD из меню «Запрос». Затем в верхней части вашего скрипта введите команду ниже

:Connect server_name[\instance_name] [-l timeout] [-U user_name [-P password]

Если вы подключаетесь к нескольким серверам, обязательно вставьте GO между соединениями; в противном случае ваш T-SQL не будет работать на том сервере, который вы думаете.

49 голосов
/ 24 сентября 2008

Кроме того, убедитесь, что при написании запроса, связанного со связанным сервером, вы добавляете квадратные скобки следующим образом:

SELECT * FROM [LinkedServer].[RemoteDatabase].[User].[Table]

Я обнаружил, что по крайней мере в 2000/2005 скобки [] необходимы, по крайней мере вокруг имени сервера.

28 голосов
/ 24 сентября 2008

Обновление: для подключения к другому серверу SQL и выполнения операторов SQL необходимо использовать утилиту sqlcmd . Обычно это делается в командном файле. Вы можете комбинировать это с xmp_cmdshell , если хотите выполнить его в Management Studio.


Один из способов - настроить связанный сервер . Затем вы можете добавить связанный сервер и имя базы данных к имени таблицы. (выберите * в файле relatedserver.database.dbo.TableName)

USE master
GO
EXEC sp_addlinkedserver 
    'SEATTLESales',
    N'SQL Server'
GO
5 голосов
/ 24 сентября 2008

Если перефразировать вопрос - можно ли выбрать контекст сервера для выполнения запроса в DDL - ответ - нет. Только контекст базы данных может быть программно выбран с помощью USE. (предварительно предварительно выбрав контекст сервера)

Связанный сервер и OPEN QUERY могут предоставить доступ к DDL, но требуют некоторой переписывания вашего кода для инкапсуляции в виде строки - что затрудняет разработку / отладку.

В качестве альтернативы вы можете прибегнуть к программе внешнего драйвера для получения файлов SQL для отправки на удаленный сервер через OPEN QUERY. Однако в большинстве случаев вы могли бы также подключиться к серверу непосредственно на первом месте, чтобы оценить DDL.

4 голосов
/ 07 апреля 2014

Если вы подключаетесь к нескольким серверам, вы должны добавить «GO» перед переключением серверов, иначе ваши операторы sql будут работать с неверным сервером.

, например

:CONNECT SERVER1
Select * from Table
GO
enter code here
:CONNECT SERVER1
Select * from Table
GO

http://www.sqlmatters.com/Articles/Changing%20the%20SQL%20Server%20connection%20within%20an%20SSMS%20Query%20Windows%20using%20SQLCMD%20Mode.aspx

4 голосов
/ 18 ноября 2011

Всякий раз, когда мы пытаемся получить какие-либо данные с другого сервера, нам требуется два шага.

Первый шаг:

-- 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
2 голосов
/ 20 июня 2015

на моем диске 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

если все пойдет хорошо

Вот и все

2 голосов
/ 24 сентября 2008

Попробуйте создать связанный сервер (который вы можете сделать с помощью sp_addlinkedserver ), а затем использовать OPENQUERY

0 голосов
/ 12 февраля 2019

Попробуйте PowerShell Type, например:

$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();
0 голосов
/ 18 июня 2010

Если возможно, проверьте службы SSIS (службы интеграции SQL Server). Я просто мокну от этого инструментария, но уже зацикливаюсь на более чем 40 серверах и готовлюсь к разрушению;)

...