タグ付けされた質問 「linked-server」

リンクサーバーでは、1つのクエリとして複数のサーバーを操作できます。

2
どちらがより効率的ですか:リンクサーバーから選択するか、リンクサーバーに挿入しますか?
あるサーバーから別のサーバーに(リンクサーバー経由で)データをエクスポートする必要があるとします。どのステートメントがより効率的ですか? ソースサーバーでの実行: INSERT INTO [DestinationLinkedServer].[DestinationDB].[dbo].[Table] SELECT a, b, c, ... FROM [dbo].Udf_GetExportData() または、ターゲットサーバーで実行します。 INSERT INTO [dbo].[Table] SELECT a, b, c, ... FROM OPENQUERY([OriginLinkedServer], 'SELECT a, b, c, ... FROM [OriginDB].[dbo].Udf_GetExportData()') どちらがより速く、合計でより少ないリソースを消費しますか(ソースサーバーとターゲットサーバーの両方)。両方のサーバーはSQL Server 2005です。

4
あるサーバーから別のサーバーに(数百の)テーブルをコピーする(SSMSを使用)
1つのサーバーから別のサーバーにコピーする必要があるテーブルは数百(現在は466ですが、増え続けています)です。 私はこれをする必要がなかったので、どのようにアプローチするのか全くわかりません。すべてのテーブルは同じ形式です。Cart<Eight character customer number> これは、これらすべてのCart<Number>テーブルを1つのCartsテーブルにマージするより大きなプロジェクトの一部ですが、それはまったく別の質問です。 これらのすべてのテーブルをコピーするために使用できるベストプラクティスの方法はありますか?両方のサーバーのデータベース名は、それが役立つ場合は同じです。先ほど言ったように、saAからBにデータを取得するために必要なことは何でもできるようにアカウントを持っています。両方のサーバーも同じサーバーファームにあります。

5
この明示的なキャストがリンクサーバーでのみ問題を引き起こすのはなぜですか?
オリジンサーバーのビューを介してリンクサーバーからデータをクエリしています。ビューは、次のような標準化された列のカップルを含める必要がありCreated、ModifiedかつDeleted、この場合には、ソース・サーバー上の表は、任意の適切な情報を持っていません。したがって、列はそれぞれの型に明示的にキャストされます。ビューを更新し、列を NULL AS Modified に CAST(NULL as DateTime) as Modified ただし、この更新の実行後、ビューは次のエラーメッセージをトリガーします。 メッセージ7341、レベル16、状態2、行3列 "(ユーザー生成式).Expr1002"の現在の行値をOLE DBプロバイダー "SQLNCLI11"からリンクサーバー ""に取得できません。 この「明示的なキャスト」の変更は、通常、問題なくオリジンサーバー全体で行われましたが、問題は関連するサーバーのバージョンに関連している可能性があります。このキャストを実際に適用する必要はありませんが、よりクリーンに感じます。今、私はなぜこれが起こっているのか興味があります。 サーバーバージョン(オリジン): Microsoft SQL Server 2012-11.0.5058.0(X64)2014年5月14日18:34:29 Copyright(c)Microsoft Corporation Enterprise Edition(64-bit)on Windows NT 6.1(Build 7601:Service Pack 1)(ハイパーバイザー) サーバーバージョン(リンク): Microsoft SQL Server 2008 R2(SP1)-10.50.2500.0(X64)2011年6月17日00:54:03 Copyright(c)Microsoft Corporation Enterprise Edition(64-bit)on Windows NT 6.1(Build 7601:Service Pack 1)(ハイパーバイザー) 編集 問題の列をすべて掲載しないことでミスを犯したことに気付いたので、重要な詳細を省いたことを謝罪する必要があります。これに気づかなかったのは早く分かりません。しかし、疑問はまだ残っています。 …

3
行を複数の列にピボットする
Oracleサーバーへのリンクサーバーを持つSQL Serverインスタンスがあります。PersonOptions次のデータを含む、呼び出されたOracleサーバー上のテーブルがあります。 ╔══════════╦══════════╗ ║ PersonID ║ OptionID ║ ╠══════════╬══════════╣ ║ 1 ║ A ║ ║ 1 ║ B ║ ║ 2 ║ C ║ ║ 3 ║ B ║ ║ 4 ║ A ║ ║ 4 ║ C ║ ╚══════════╩══════════╝ 結果が次のようになるように、そのデータをピボットする必要があります。 ╔══════════╦═════════╦══════════╦══════════╗ ║ PersonID ║ OptionA ║ Option B ║ …

2
Windows認証を使用してリンクサーバーを機能させるにはどうすればよいですか?
ドメイン環境で「ログインの現在のセキュリティコンテキストを使用して作成する」を使用して、別のサーバーServerBで作成されたServerAにリンクサーバーを取得しようとしています。Kerberosを有効にするには、各サーバーでSQL Serverを実行するサービスアカウント用にSPNを作成する必要があることを読みました。私はそれを行っており、認証スキームがKerberosであることを両方とも示していますが、まだエラーに直面しています: "Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'". Active Directoryでは、ServerBのサービスアカウントがMSSQLSvcへの委任に対して信頼されていることがわかりますが、ServerAのサービスアカウントでは「このユーザーを委任に対して信頼」が有効になっていないことに気付きました。ターゲットサーバーでもそのオプションを有効にする必要がありますか?現在のWindowsログインを使用してリンクサーバーを使用できるようにするために、他に必要なものはありますか?

5
リンクサーバーでCASE式に10ブランチという制限があるのはなぜですか?
なぜこのCASE式は: SELECT CASE column WHEN 'a' THEN '1' WHEN 'b' THEN '2' ... c -> i WHEN 'j' THEN '10' WHEN 'k' THEN '11' END [col] FROM LinkedServer.database.dbo.table この結果を生成しますか? エラーメッセージ:メッセージ8180、レベル16、状態1、行1 ステートメントを準備できませんでした。メッセージ125、レベル15、状態4、行1のケース式はレベル10にのみネストできます。 CASE10個以上の「ブランチ」がありますが、ここには明らかにネストされた式はありません。 もう一つの奇妙な。このインラインテーブル値関数は、同じエラーを生成します。 ALTER FUNCTION [dbo].[fn_MyFunction] ( @var varchar(20) ) RETURNS TABLE AS RETURN ( SELECT CASE column WHEN 'a' …

3
リンクサーバーをリロードする方法は?
Microsoft SQL Server 2014 Enterprise Editionを使用しています。サーバーを再起動するか、MSSQLSERVERサービスを停止する必要があるリンクサーバーで問題が発生します。サーバーが再び実行されると、(DB2への)リンクされたサーバーは正しく機能せず、SQL Serverは次のエラーを表示します。 メッセージ7302、レベル16、状態1、行10 リンクサーバー "Airspe"のOLE DBプロバイダー "DB2OLEDB"のインスタンスを作成できません。 サーバーを数回再起動した後にのみ、リンクサーバーが機能し始めます。 リンクサーバーを起動するためにサーバーを数回再起動する必要があるのはなぜですか? 他の解決策はありますか? これは、リンクサーバーの1つを作成するスクリプトです。 EXEC master.dbo.sp_addlinkedserver @server = N'AIRS', @srvproduct=N'Microsoft OLE DB Provider for DB2', @provider=N'DB2OLEDB', @datasrc=N'###.###.###.##',@provstr=N'Provider=DB2OLEDB; Data Source=#####;Persist Security Info=True;Password=**********; User ID=######;Initial Catalog=######; Network Address=###.###.###;Package Collection=AICOLDP;DBMS Platform=DB2/AS400', @catalog=N'#####' EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'AIRS',@useself=N'False',@locallogin=NULL,@rmtuser=N'#####',@rmtpassword='########' EXEC master.dbo.sp_serveroption @server=N'AIRS', @optname=N'collation compatible', @optvalue=N'false' …

3
自身を指すリンクサーバーの作成
servername\instancename次の呼び出しを使用して、SQL Server 2014インスタンスにリンクサーバーを作成しようとしています。 EXEC master.dbo.sp_addlinkedserver @server = N'servername\instancename', @srvproduct=N'SQL Server' エラーが発生しています: Msg 15028, Level 16, State 1, Procedure sp_addlinkedserver, Line 82 The server 'servername\instancename' already exists. これはSQL Server 2005で正常に機能し、MSDNによると、 リンクサーバーはSQL Serverの別のインスタンスである必要はありませんが、 そのため、これを許可しない最近のバージョンで何が変更されたのかわかりません。UIを使用すると、同様のメッセージが生成されます。 ローカルSQL Serverをリンクサーバーとして作成することはできません。 リクエストするのは奇妙なことだと理解していますが、2005年に機能した(かつては別のインスタンスにあった)レガシーコードをサポートすることです。ドキュメントには、動作するはずであると記載されていますが、動作しません。2014年にこれを機能させる方法はありますか、それとも基になるコードを変更する必要がありますか?

5
TRY-CATCHでキャッチされないリンクサーバーエラー
リンクサーバーのリストをループし、各サーバーに対して特定のクエリを実行するジョブを設定しています。TRY-CATCHブロック内でクエリを実行しようとしているので、特定のサーバーに問題がある場合はログに記録できますが、他のサーバーで続行します。 ループ内で実行しているクエリは次のようになります。 BEGIN TRY SELECT * FROM OPENQUERY([server1], 'SELECT 1 AS c;'); END TRY BEGIN CATCH SELECT ERROR_NUMBER(), ERROR_MESSAGE(); END CATCH; PRINT 'We got past the Catch block!'; サーバーへの接続に問題がある場合、コードはただちに失敗し、CATCHブロックに転送されません。サーバーは接続しているが、実際のクエリにエラーがある場合(ゼロ除算など)、CATCHブロックで期待どおりにキャッチされます。 たとえば、存在しないことがわかっている名前でリンクサーバーを作成しました。上記を実行するとき、私はちょうど得る: OLE DB provider "SQLNCLI" for linked server "nonserver" returned message "Login timeout expired". OLE DB provider "SQLNCLI" for linked server …

5
SQL Serverリンクサーバーのパフォーマンス:リモートクエリがそれほど高価なのはなぜですか?
リンクサーバー経由で接続された2つのデータベースサーバーがあります。どちらもSQL Server 2008R2データベースであり、リンクサーバー接続は、現在のログインのセキュリティコンテキストを使用して、通常の「SQL Server」リンクを介して行われます。リンクされたサーバーは両方とも同じデータセンターにあるため、接続は問題になりません。 次のクエリを使用して、identifierローカルではなくリモートで使用可能な列の値を確認します。 SELECT identifier FROM LinkedServer.RemoteDb.schema.[TableName] EXCEPT SELECT DISTINCT identifier FROM LocalDb.schema.[TableName] 両方のテーブルには、列に非クラスター化インデックスがありますidentifier。ローカルは約260万行、リモートは54行のみです。しかし、クエリプランを見ると、実行時間の70%が「リモートクエリの実行」に費やされています。また、完全なクエリプランを調べる場合、推定ローカル行の数1は2695380(の後に来るクエリのみを選択した場合の推定行の数)の代わりになりますEXCEPT。 このクエリを実行すると、実際に時間がかかります。 不思議に思う:これはなぜですか?推定値は「ちょうど」外れていますか、それともリンクサーバーでのリモートクエリは本当にそれほど高価ですか?

3
リンクサーバーのリスク
複数のサーバー上のデータベースからのデータを必要とする新機能を実装しています。これらすべてのサーバーのデータを結合して並べ替えるだけです。頭に浮かぶ2つのオプションは次のとおりです。 リンクサーバーを使用して簡単なクエリを作成し、1つのサーバーから実行して他のサーバーからデータを収集するデータを結合して並べ替えます。 アプリケーションを使用してすべてのサーバーからデータを収集し、それをSQL Serverに返して並べ替えます(アプリケーションに並べ替えを実装しないでください)。 SQL Server 2008 r2では、アクティブ/アクティブクラスターでサーバーを実行しています。すべてのデータベースに同じ権限があり、1つのデータベース/サーバーにアクセスできる場合は、それらすべてに権限があります。これは一般向けアプリケーションです(ユーザーログインが必要です)。 リンクサーバーを使用するリスクは何ですか?心配すべきセキュリティ上の欠陥はありますか?アクティブ/アクティブクラスターでリンクサーバーを実行するときに問題はありますか?他の方法と比較して、パフォーマンスに重大な問題はありますか? リンクサーバーに関する一般的な否定的な「話題」があるようですが、実際に懸念があると思わせるような具体的な情報は見つかりません。

1
リンクサーバーに対するOPENQUERYの8000文字の制限
OPENQUERYSSRS / SQL Server 2014で実行しようとしているクエリがありますが、次のエラーが発生し続けます。 [...]で始まる文字列が長すぎます。最大長は8000です。 この制限を回避する方法はありますか? 参考までに、リンクされたMySQLサーバーを介してSSRSからクエリを実行しようとしています。

1
データベースプロジェクトでOPENQUERYを使用したリンクサーバーを使用する
SQL Server 2008でTFSに投入したいデータベースを実行しています。したがって、私はDBをインポートしたVisual Studio 2013データベースプロジェクトを使用しました。たくさんのエラーを修正した後、エラーが1つだけ残っています。 1つのビューではOPENQUERY、リンクサーバーへのアクセスに使用される開発者。そこで、適切なデータベースを含むDACPACをインポートAdd Database Referenceし、次の参照オプションを使用してプロジェクトに追加しました。 スクリプトの初期バージョン 以下は、元のビュー作成の短いバージョンです。 CREATE VIEW dbo.vwStatus AS SELECT StatusID, StatusName FROM OPENQUERY(LinkedServer, 'SELECT * FROM [DB].[dbo].tbStatus') AS derivedtbl_1 これにより、次のエラーが発生します。 エラー136 SQL71501:ビュー:[dbo]。[vwStatus]には、オブジェクト[LinkedServer]への未解決の参照があります。 最初の試み それで、サーバー名変数を挿入しようとしました FROM OPENQUERY($(LinkedServer), 'SELECT * FROM [DB].[dbo].tbStatus') AS derivedtbl_1 につながる エラー176 SQL46010:$(LinkedServer)付近の構文が正しくありません。 さらなる試み 私は少し手探りで次のことを試しました(引用符付き識別子を有効にした場合と有効にしない場合): FROM OPENQUERY("$(LinkedServer)", 'SELECT * FROM [DB].[dbo].tbStatus') AS …

1
リンクされたSQL Serverにはどのような大きな制限が予想されますか?
当社の製品は、Microsoft SQL Serverに基づいています。現在、3つのデータベースを使用しており、常に1つのSQL Serverインスタンスに展開しています。 3つのデータベースは、OLTP、OLAP、および監査です。OLAPデータベースには、クロスデータベースクエリを使用して、OLTPと監査の両方からのEODに関する大規模な受信データがあります。 ご質問 これらの3つのデータベースを単一の物理サーバー内の3つの別々のStandard Edition インスタンスに展開し、SQL Serverのリンクサーバー機能を使用してそれらをバインドするとします。 アプリケーションコードに対してどの程度透過的ですか?どのくらいの変化を期待できますか? OLAPへのインバウンドデータの量は5万〜10万行で、EODあたりのペイロードは200〜500 MBでした。どのくらいのパフォーマンス低下が予想されますか? 他にどんな大きな制限を期待する必要がありますか? バックグラウンド 現在、最初の潜在的なクライアントを500人以上の同時ユーザーに売り込んでいます。 64コアと256GB RAMを含むサーバー仕様を作成しています。SQL Serverがこれらの豊富なリソースをすべて利用するには、クライアントはEnterprise Editionを購入する必要があります。EnterpriseEditionは、SQL Server 2016ではコア単位のライセンスでのみ利用できます。 ライセンス費用だけ(64 x $ 7400)でそれらが下がることを恐れています。したがって、データベースをStandard Editionの3つのインスタンスに分割し、それらをリンクして、リンク機能がアプリケーションコードから透過的になることを期待しています。

2
リンクサーバーを参照するポータブルSQLを作成するにはどうすればよいですか?
リンクサーバーを参照するストアドプロシージャを持っています。手順全体のいくつかの場所で、次のようなものが得られます。 INSERT INTO [TableName] (...Columns...) SELECT ...Columns... FROM [ServerName\InstanceName].[Catalogue].[dbo].[TableName] WHERE TableNameID = @TableNameID この手順は、私の開発環境、テスト環境、およびライブ環境に存在します。 問題は、サーバー名が環境ごとに異なるため、プロシージャの各コピーが微妙に異なることです。これにより、スクリプト更新の展開の管理が面倒になります。 各環境で同じバージョンのプロシージャを実行できるように、プロシージャを移植可能にする方法はありますか? そうでない場合、スクリプトの展開を間違い/エラーに陥らなくするために私ができることはありますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.