返される列の数に圧倒されるだけで、ストアドプロシージャを実行したことがありますか?たぶんあなたは1つか2つのコラムしか必要としませんでした、しかしそれはあなたに方法を提示しました この特定の機会に必要な列が多すぎます。
幸い、ストアドプロシージャから選択した列を取得するために使用できるちょっとしたトリックがあります。これにより、必要な列だけを取得できます。
そして最良の部分は、一時的なテーブルを作成したり、データをシャッフルしたりする必要がないことです。
行う必要があるのは、ストアドプロシージャをOPENROWSET()
に渡すことだけです。 働き。
同じ概念をOPENQUERY()
にも適用できます。 機能。
例
sp_columns
を取得します たとえば、システムストアドプロシージャ。 19列を返します。
EXEC sp_columns Cats;
結果:
+-------------------+---------------+--------------+---------------+-------------+--------------+-------------+----------+---------+---------+------------+-----------+--------------+-----------------+--------------------+---------------------+--------------------+---------------+----------------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | COLUMN_NAME | DATA_TYPE | TYPE_NAME | PRECISION | LENGTH | SCALE | RADIX | NULLABLE | REMARKS | COLUMN_DEF | SQL_DATA_TYPE | SQL_DATETIME_SUB | CHAR_OCTET_LENGTH | ORDINAL_POSITION | IS_NULLABLE | SS_DATA_TYPE | |-------------------+---------------+--------------+---------------+-------------+--------------+-------------+----------+---------+---------+------------+-----------+--------------+-----------------+--------------------+---------------------+--------------------+---------------+----------------| | Pets | dbo | Cats | CatId | 4 | int identity | 10 | 4 | 0 | 10 | 0 | NULL | NULL | 4 | NULL | NULL | 1 | NO | 56 | | Pets | dbo | Cats | CatName | 12 | varchar | 60 | 60 | NULL | NULL | 1 | NULL | NULL | 12 | NULL | 60 | 2 | YES | 39 | +-------------------+---------------+--------------+---------------+-------------+--------------+-------------+----------+---------+---------+------------+-----------+--------------+-----------------+--------------------+---------------------+--------------------+---------------+----------------+
このような手順では、多くの場合、興味のある列を見つけるために、ガチョウの追跡で横にスクロールする必要があります。
19個すべてではなく、4個の特定の列を見たいだけかもしれません。
次のクエリを実行して、それを実行できます。
SELECT
c.COLUMN_NAME,
c.TYPE_NAME,
c.PRECISION,
c.LENGTH
FROM OPENROWSET(
'SQLOLEDB',
'SERVER=localhost;Trusted_Connection=yes;',
'EXEC Pets.dbo.sp_columns Cats'
) c;
結果:
+---------------+--------------+-------------+----------+ | COLUMN_NAME | TYPE_NAME | PRECISION | LENGTH | |---------------+--------------+-------------+----------| | CatId | int identity | 10 | 4 | | CatName | varchar | 60 | 60 | +---------------+--------------+-------------+----------+
OPENROWSET()
関数は主にリモートデータを取得するために設計されましたが、localhost
を指定することで、ローカルインスタンスでも使用できます。 接続文字列内(この例で行ったように)
OPENQUERY()関数
前述のように、同じ概念をOPENQUERY()
に適用できます。 機能。
SELECT
c.COLUMN_NAME,
c.TYPE_NAME,
c.PRECISION,
c.LENGTH
FROM OPENQUERY(
Homer,
'EXEC Pets.dbo.sp_columns Cats'
) c;
結果:
+---------------+--------------+-------------+----------+ | COLUMN_NAME | TYPE_NAME | PRECISION | LENGTH | |---------------+--------------+-------------+----------| | CatId | int identity | 10 | 4 | | CatName | varchar | 60 | 60 | +---------------+--------------+-------------+----------+
この場合、Homer
というリンクサーバーを指定しました ローカルサーバーの代わりに。
「サーバーがデータアクセス用に構成されていません」というエラーが表示された場合は、ローカルインスタンスにクエリを実行している場合でも、サーバーのデータアクセスを有効にする必要があります。これを行う方法については、データアクセスを有効/無効にする方法を参照してください。