web-dev-qa-db-ja.com

別のSQL Serverに接続するためのT-SQL構文は何ですか?

あるSQL Serverから別のSQL Serverにストアドプロシージャ(SP)をコピーする必要がある場合は、SSMSでSPを右クリックし、[ストアドプロシージャとしてスクリプト]> [作成先]> [新しいクエリエディター]ウィンドウを選択します。次に、そのウィンドウを右クリックして[接続]> [接続の変更...]を選択し、新しいサーバーとF5を選択して新しいサーバーで作成を実行して、接続を変更します。

私の質問は、「別のSQL Serverに接続するためのT-SQL構文は何ですか?」です。そのため、作成スクリプトの上部にそれを貼り付けてF5を実行し、新しいサーバーに切り替えて作成スクリプトを実行します。

質問を入力している間、私がやろうとしていることの背景を教えてくれれば、これを達成するためのより速くてより良い方法を思いつくかもしれないことに気付きました。

57
Guy

また、リンクサーバーに関連するクエリを作成するときは、次のようなかっこを含めるようにしてください。

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

少なくとも2000/2005では、少なくともサーバー名の周りに[]ブラケットが必要であることがわかりました。

49
Codewerks

SQL Server Management Studioで、[クエリ]メニューからSQLCMDモードをオンにします。次に、スクリプトの上部で、以下のコマンドを入力します

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

複数のサーバーに接続する場合は、接続の間に必ずGOを挿入してください。 それ以外の場合、T-SQLは、あなたが考えているサーバー上で実行されません。

86
mwg2002

更新:別のSQLサーバーに接続してSQLステートメントを実行するには、 sqlcmd Utility を使用する必要があります。これは通常、バッチファイルで行われます。管理スタジオ内で実行する場合は、これを xmp_cmdshell と組み合わせることができます。


1つの方法は、 リンクサーバー を構成することです。その後、リンクサーバーとデータベース名をテーブル名に追加できます。 (linkedserver.database.dbo.TableNameから*を選択)

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

質問を言い換えると、DDLでクエリを実行するためのサーバーコンテキストを選択することは可能ですか?答えは「いいえ」です。 USEを使用してプログラムで選択できるのは、データベースコンテキストのみです。 (サーバーコンテキストを外部で事前に選択済み)

リンクサーバーとOPEN QUERYはDDLにアクセスできますが、文字列としてカプセル化するにはコードの書き換えが必要になるため、開発/デバッグが困難になります。

または、外部ドライバープログラムを使用してSQLファイルを取得し、OPEN QUERY経由でリモートサーバーに送信することもできます。ただし、ほとんどの場合、DDLを評価するために、最初の場所でサーバーに直接接続することもできます。

6
stephbu

別のサーバーからデータを取得しようとするたびに、2つのステップが必要です。

最初の一歩:

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

複数のサーバーに接続している場合、サーバーを切り替える前に「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
Oscar Fraxedas

リンクサーバー( sp_addlinkedserver で実行可能)を作成してから、 [〜#〜] openquery [〜#〜] を使用してみてください。

2
Wayne

cドライブで、最初にtxtファイルを作成して新しいテーブルを作成します。このテキストファイルで必要なものを使用できます。

この場合、テキストファイルの名前は「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という拡張子を持つ他のtxtファイルを作成します。内容です:

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

それを保存し、エクスプローラからダブルクリックして実行します

結果は、「Bedrijf.out」という名前でCドライブのtxtファイルに保存されます

それが示している

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

すべてがうまくいけば

それでおしまい

2
frans eilering

可能であれば、SSIS(SQL Server Integration Services)を確認してください。私はこのツールキットで足を濡らしていますが、すでに40以上のサーバーをループし、あらゆる種類の混乱を引き起こす準備をしています;)

0
MikeV

次のような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
Igor Krupitsky