web-dev-qa-db-fra.com

Quelle est la syntaxe T-SQL pour se connecter à un autre serveur SQL?

Si j'ai besoin de copier une procédure stockée (SP) d'un serveur SQL à un autre, je clique avec le bouton droit de la souris sur SP dans SSMS et sélectionnez Procédure stockée de script sous> CRÉER dans> Nouvelle fenêtre de l'éditeur de requête. Je modifie ensuite la connexion en cliquant avec le bouton droit de la souris sur cette fenêtre et en sélectionnant Connexion> Modifier la connexion ..., puis en sélectionnant le nouveau serveur et F5 pour exécuter la création sur le nouveau serveur.

Ma question est donc la suivante: "Quelle est la syntaxe T-SQL pour se connecter à un autre serveur SQL?" afin que je puisse simplement coller cela en haut du script de création et que F5 l'exécute, il basculera vers le nouveau serveur et exécutera le script de création.

En tapant la question, je me suis rendu compte que si je vous expliquais ce que j'essayais de faire, vous pourriez trouver un moyen plus rapide et meilleur de ma part pour y parvenir.

55
Guy

Assurez-vous également que lorsque vous écrivez la requête impliquant le serveur lié, vous incluez des crochets comme ceci:

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

J'ai trouvé qu'au moins pour 2000/2005, les crochets [] sont nécessaires, du moins autour du nom du serveur.

48
Codewerks

Dans SQL Server Management Studio, activez le mode SQLCMD à partir du menu Requête . Puis, en haut de votre script, tapez la commande ci-dessous.

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

Si vous vous connectez à plusieurs serveurs, veillez à insérer GO entre les connexions. Sinon, votre T-SQL ne sera pas exécuté sur le serveur que vous envisagez.

82
mwg2002

Mise à jour: pour vous connecter à un autre serveur SQL et exécuter des instructions SQL, vous devez utiliser sqlcmd Utility . Cela se fait généralement dans un fichier de commandes . Vous pouvez combiner ceci avec xmp_cmdshell si vous voulez l'exécuter dans studio de gestion.


une solution consiste à configurer un serveur lié . vous pouvez ensuite ajouter le serveur lié et le nom de la base de données au nom de la table. (sélectionnez * à partir du serveur lié.database.dbo.NomTable)

USE master
GO
EXEC sp_addlinkedserver 
    'SEATTLESales',
    N'SQL Server'
GO
28
Gulzar Nazim

Si je devais paraphraser la question - est-il possible de choisir le contexte du serveur pour l'exécution de la requête dans le DDL - la réponse est non. Seul le contexte de base de données peut être choisi par programme avec USE. (ayant déjà présélectionné le contexte du serveur en externe)

Le serveur lié et OPEN QUERY peuvent donner accès au DDL, mais nécessitent en quelque sorte une réécriture de votre code à encapsuler sous forme de chaîne, ce qui rend difficile le développement/le débogage. 

Vous pouvez également recourir à un programme de pilote externe pour récupérer les fichiers SQL à envoyer au serveur distant via OPEN QUERY. Cependant, dans la plupart des cas, vous pourriez aussi bien vous être connecté au serveur directement à la 1ère place pour évaluer le DDL.

5
stephbu

Chaque fois que nous essayons de récupérer des données d’un autre serveur, nous avons besoin de deux étapes.

Premier pas:

-- Server one scalar variable
DECLARE @SERVER VARCHAR(MAX)
--Oracle is the server to which we want to connect
EXEC SP_ADDLINKEDSERVER @SERVER='Oracle'

Deuxième étape:

--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
4
SASMITA MOHAPATRA

Si vous vous connectez à plusieurs serveurs, vous devez ajouter un "GO" avant de changer de serveur, sinon vos instructions SQL s'exécutent sur le mauvais serveur.

par exemple.

: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

3
Oscar Fraxedas

Essayez de créer un serveur lié (ce que vous pouvez faire avec sp_addlinkedserver ), puis avec OPENQUERY

2
Wayne

sur mon lecteur C, je crée d’abord un fichier txt pour créer une nouvelle table. Vous pouvez utiliser ce que vous voulez dans ce fichier texte

dans ce cas, le fichier texte s'appelle "Bedrijf.txt"

le contenu:

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]

sauvegarde le

puis je crée un autre fichier txt avec le nom "Bedrijf.bat" et l'extension bat . C'est le contenu:

OSQL.EXE  -U Username -P Password -S IPaddress -i C:Bedrijf.txt -o C:Bedrijf.out -d myDatabaseName

enregistrer et à partir de l'explorateur double-cliquez pour exécuter

Les résultats seront enregistrés dans un fichier txt sur votre lecteur C avec le nom "Bedrijf.out".

ça montre

1> 2> 3> START(A) create table

si tout va bien

C'est tout

2
frans eilering

Si possible, consultez SSIS (SQL Server Integration Services). Je commence tout juste à me familiariser avec cette boîte à outils, mais je suis déjà en train de mettre en boucle plus de 40 serveurs et de me préparer à faire toutes sortes de dégâts;)

0
MikeV

Essayez PowerShell Type comme:

$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
Igor Krupitsky