0

だから私はクエリから列情報を取得するクエリを書き込もうとしていますこれは私が試したものです:

Select login from TableName AS alias_name

SELECT COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,IS_NULLABLE,COLUMN_DEFAULT,
FROM  INFORMATION_SCHEMA.COLUMNS  WHERE TABLE_Name = 'alias_name' ORDER BY ORDINAL_POSITION ASC;

...クエリが一時テーブルとして保存されていないため、これは機能しません...

したがって、上記の2つのクエリの機能を1つのクエリにまとめる必要があります。

4

2 に答える 2

1

これを試して:

SELECT COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,IS_NULLABLE,COLUMN_DEFAULT, 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_Name IN (SELECT login from TableName) 
ORDER BY ORDINAL_POSITION ASC;

それはあなたがやろうとしていることですか?

于 2012-09-10T20:13:09.340 に答える
-1

これは不可能です; 純粋なSQLではありません。これはMySQLのプロパティではありません-他のRDBMS-esもこの方法でクエリメタデータを提供しません。

純粋なSQLでこれを解決するために最も近い方法は、クエリをビューに変換してから、そのビューの情報を取得することです。

CREATE OR REPLACE VIEW _query
AS 
SELECT login 
FROM   TableName 
;

SELECT *
FROM   information_schema.COLUMNS
WHERE  table_schema = SCHEMA()
AND    table_name   = '_query'
;

このアプローチの問題は、ビュー名が一意である必要があることです。そのため、複数の同時ユーザーがいるアプリケーションでは、ビューの一意の名前を考え出すことが課題になります。これは、動的SQLを使用して可能です。

SET @name = CONCAT(_query, connection_id())
,   @stmt = CONCAT(
        ' CREATE VIEW '
    ,   @name
    ,   ' AS SELECT login FROM Tablename'
    )
; 

PREPARE stmt FROM @stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SELECT *
FROM   information_schema.columns
WHERE  table_schema = schema()
AND    table_name = @name
;

最後に、後でビューをクリーンアップする必要があります。

SET @stmt = CONCAT('DROP VIEW ', @name); 
PREPARE stmt FROM @stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

問題は、なぜSQL内でこれが必要なのかということです。通常、結果セットのメタデータはSQLクライアントで使用できます。通常、SQLステートメントを準備するときにドライバーまたはクライアントライブラリがこれを提供します。たとえば、JDBC http://docs.oracle.com/javase/6/docs/api/java/sql/ResultSet.html#getMetaData()

于 2012-09-10T20:15:31.293 に答える