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 '')。
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;
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'
);