2017-02-01 15 views
0

テーブル名に基づいて:フィルタ列データ型

表1

Name    DataType 
PK_tablekey  INT 
FK_Table2Keu  INT 
CreateTime  datetime 
DateField1  datetime 
DateField2  datetime 
Createdby  NVARCHAR(32) 
Name1    NVARCHAR(32) 
Flag    BIT 
Value1   Decimal(19,4) 
Value2   Decimal(19,4) 

私は句

DateField1  datetime 
DateField2  datetime 
Name1   NVARCHAR(32) 
Flag    BIT 
Value1   Decimal(19,4) 
Value2   Decimal(19,4) 

クエリによってオーバー使用して、その外にのみ、これらのフィールドを照会したいです

SELECT 
    (ROW_NUMBER() OVER (ORDER BY ORDINAL_POSITION ASC)) AS ColumnNumber, 
    CAST(COLUMN_NAME AS NVARCHAR(150)) AS ColumnName  
FROM 
    INFORMATION_SCHEMA.COLUMNS 
WHERE 
    TABLE_NAME = N'Table1' 
    AND DATA_TYPE IN (N'decimal') 

UNION ALL      

SELECT 
    (ROW_NUMBER() OVER (ORDER BY ORDINAL_POSITION ASC)) AS ColumnNumber, 
    CAST(COLUMN_NAME AS NVARCHAR(150)) AS ColumnName  
FROM 
    INFORMATION_SCHEMA.COLUMNS 
WHERE 
    TABLE_NAME = N'Table1' 
    AND DATA_TYPE IN (N'nvarchar') 
    AND COLUMN_NAME = 'Name1 ' 

UNION ALL       

SELECT 
    (ROW_NUMBER() OVER (ORDER BY ORDINAL_POSITION ASC)) AS ColumnNumber, 
    CAST(COLUMN_NAME AS datetime) AS ColumnName, 
    CAST(COLUMN_NAME AS datetime) AS OverwriteColumnName 
FROM 
    INFORMATION_SCHEMA.COLUMNS 
WHERE 
    TABLE_NAME = N'Table1' 
    AND DATA_TYPE IN (N'datetime') 
    AND COLUMN_NAME IN ('DateField1', 'DateField2') 

このprocが呼び出されたときにエラーメッセージがスローされても動作しないようですGE

要求が失敗しました:無効な列名を:DateField1
は 要求が失敗しました:無効な列名:DateField2

も私もBIT列を追加したいが。

私がUNION ALLを使用しているので、クエリが短い場合は、誰でも助けてくれますか?

+0

あなたが取得したい結果をあなたの質問を編集して、ご提示ください。また、使用しているデータベースにタグを付けます。 –

答えて

0

rownumberを使用するとき、そのSQL Server。

最初に、クエリにエラーがあります。すべてのユニオンに同じ列が返される必要があります。 3番目の組合は、必要な2つではなく3つの列を返します。あなたのデータを注文する必要がある場合は

、あなたはこれを試すことができます。

SELECT 
    [ColumnNumber] 
    ,[ColumnName] 
FROM 
(
    SELECT 
     [ColumnNumber] = (ROW_NUMBER() OVER (ORDER BY ORDINAL_POSITION ASC)) 
     ,[ColumnName] = CAST(COLUMN_NAME AS NVARCHAR(150)) 
     FROM INFORMATION_SCHEMA.COLUMNS 
     WHERE TABLE_NAME = N'Table1' 
     AND DATA_TYPE IN (N'decimal') 

    UNION ALL      

    SELECT 
     [ColumnNumber] = (ROW_NUMBER() OVER (ORDER BY ORDINAL_POSITION ASC)) 
     ,[ColumnName] = CAST(COLUMN_NAME AS NVARCHAR(150)) 
     FROM INFORMATION_SCHEMA.COLUMNS 
     WHERE TABLE_NAME = N'Table1' 
     AND DATA_TYPE IN (N'Name1') 
     AND COLUMN_NAME = 'Name1 ' 

    UNION ALL       

    SELECT 
     [ColumnNumber] = (ROW_NUMBER() OVER (ORDER BY ORDINAL_POSITION ASC)) 
     ,[ColumnName] = CAST(COLUMN_NAME AS datetime) 
     -- , CAST(COLUMN_NAME AS datetime) AS OverwriteColumnName --you need 2 cols, not 3! 
     FROM INFORMATION_SCHEMA.COLUMNS 
     WHERE TABLE_NAME = N'Table1' 
     AND DATA_TYPE IN (N'datetime') 
     AND COLUMN_NAME IN ('DateField1','DateField2') 
) AS [r] 
ORDER BY 
    [r].[ColumnNumber] 
    ,[r].[ColumnName]; 
0

どうすればよいですか?

SELECT ROW_NUMBER() OVER (PARTITION BY DATA_TYPE ORDER BY ORDINAL_POSITION ASC) AS ColumnNumber, 
     CAST(COLUMN_NAME AS NVARCHAR(150)) AS ColumnName 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = N'Table1' AND 
     DATA_TYPE IN (N'decimal', N'datetime', N'Name1') ; 

代わりのDATA_TYPE、あなたがしたいですか列を指定することもできます。重要なアイデアはPARTITION BYです。

関連する問題