web-dev-qa-db-ja.com

代替サーバーを使用して「USE」を実行する

SQLサーバーリンクサーバーを使用していますが、クエリの実行中に問題が発生します。

以下は実際のクエリです。

USe testdb
SELECT 'Identitiy property OFF' where COLUMNPROPERTY( OBJECT_ID('Table_1'),'column1','IsIdentity')=0 

使用したリンクサーバーに対して実行するには

Use mylinkedserver.testdb
SELECT 'Identitiy property OFF' where COLUMNPROPERTY( OBJECT_ID('Table_1'),'column1','IsIdentity')=0 

しかし、これを実行すると、以下に示すようにエラーが発生します。データベース「mylinkedserver」は存在しません。名前が正しく入力されていることを確認してください。

select * from pc91sql.testdb.dbo.Table_1を正常に使用してテーブルをクエリできるところ。

では、上記のクエリを実行するにはどうすればよいですか(リンクサーバーで "USE"を使用できないと思います。代替手段は何ですか?

編集:

ニースの返信を得た後、これらのことを試しました。次に、OPENQUERYオプションを使用しました

SELECT * FROM OPENQUERY(pc91sql,'SELECT COLUMNPROPERTY( OBJECT_ID(''testdb.dbo.Table_1''),''column1'',''IsIdentity'')');

NULLを返しました。しかし、column1はID列であるため、1を返すはずでした。

次に、useコマンドを使用せずに元のクエリをリンクサーバーで直接実行することを再度確認したところ、NULLが返されました。 use testdbについて言及した後、またはリストからデータベースを選択した後にSSMSで同じクエリを実行すると、1が返されます。つまり、OBJECT_IDはデータベース名をテーブル名と一緒に使用できないことを意味します(例: '' testdb.dbo.Table_1 '')。

3
IT researcher

EXECを使用して、別のデータベースまたは別のサーバーで動的SQLを実行できます。また、これらの乱雑なメタデータ関数のすべてではなく、カタログビューを直接使用してみてください。

DECLARE @sql NVARCHAR(MAX) = N'SELECT ''Identity property OFF'' 
      FROM sys.columns AS c
      INNER JOIN sys.tables AS t
      ON c.[object_id] = t.[object_id]
      WHERE c.is_identity = 0
      AND t.name = N''Table_1''
      AND c.name = N''column1'';';

EXEC mylinkedserver.testdb.sys.sp_executesql @sql;

さらに良いことに、それをパラメーター化します。

DECLARE @t SYSNAME = N'Table_1', @c SYSNAME = N'column1';

DECLARE @sql NVARCHAR(MAX) = N'SELECT ''Identity property OFF'' 
      FROM sys.columns AS c
      INNER JOIN sys.tables AS t
      ON c.[object_id] = t.[object_id]
      WHERE c.is_identity = 0
      AND t.name = @t
      AND c.name = @c;';

EXEC mylinkedserver.testdb.sys.sp_executesql 
  @stmt = @sql,
  @params = N'@t SYSNAME, @c SYSNAME', 
  @t = @t, 
  @c = @c;
4
Aaron Bertrand

OPENQUERYをチェックしてください( BOLリファレンス

OPENQUERYは、リンクサーバーで直接クエリを実行するために特別に設計されています。

最初のパラメーターはリンクサーバーの名前です。2番目のパラメーターは、リンクサーバーに対して実行するクエリです。

クエリの構文は完全にはわかりませんが、このようなものが機能するはずです。

SELECT ipo 
FROM 
OPENQUERY(mylinkedserver, 
             'SELECT ''Identity property OFF'' AS ipo 
              FROM testdb.dbo.Table_1
              where COLUMNPROPERTY( OBJECT_ID(''Table_1''),''column1'',''IsIdentity'')=0'
);
3
Mark Sinkinson