Запрос для нахождения всех таблиц со столбцами даты в нем

Тот факт, что A::B b = A().getB() не работает, состоит в том, что B является частным членом класса A. Если вы сделаете это общедоступным, тогда ваш код будет скомпилирован. Он работает с auto, потому что auto просто проверяет тип назначенного ему объекта, не требуя вызова конструктора объекта (как declval). Поэтому он присваивает b возвращаемый тип getB, присутствующий в классе A. Вы также можете изменить свой код следующим образом:

decltype( declval<A>().getB() ) b = A().getB();

(Если declval является новым для вас, то я должен сказать вам, что он вернет rvalue возвращаемого типа функции (здесь getB, тип возвращаемого типа B) класса (здесь A) без вызова конструктора класса! (Однако это следует использовать только с функциями, такими как decltype и sizeof.) Таким образом, он предотвращает накладные расходы на создание объекта класса, а затем использование его функции.)

Теперь, по моему мнению, я не думаю, что это лазейка в стандарте, но я чувствую, что лазейка была удалена! Это видно из вашего собственного кода, см. Функцию getB. Как сложно создать экземпляр объекта B, потому что он определен частным! В таком случае работа с B становится затруднительной. Идея этого заключается в том, что имя типа (т.е. B) в классе A недоступно, но тип все еще используется, поэтому вы можете получить объект B. Вы можете понять использование auto, если вы понимаете этот код шаблона: -

#include <iostream>
#include <type_traits>  // for std::is_same
using namespace std;
class A
{
    class B
    {};
    public:
    B getB()
    {
        return B();
    }
};
template<typename T>
void check (T b)
{
    cout<<boolalpha;
    is_same<decltype( declval<A>().getB() ), T> x;  // checks if T & B are of same type
    cout<<x.value<<'\n';
}
int main()
{
    A obj;
    check (obj.getB());
    return 0;
}

Выход: -

true

Поскольку template может идентифицировать B ], поэтому auto также идентифицирует B.

19
задан bignose 12 June 2009 в 15:44
поделиться

2 ответа

Это должно добиться цели, просто добавить в дополнительных типах при необходимости в них:

select
    so.name table_name
   ,sc.name column_name
   ,st.name data_type
from sysobjects so
inner join syscolumns sc on (so.id = sc.id)
inner join systypes st on (st.type = sc.type)
where so.type = 'U'
and st.name IN ('DATETIME', 'DATE', 'TIME')

редактирование: это также работает в Sybase и любых других вариантах T-SQL.

19
ответ дан 29 November 2019 в 23:27
поделиться

Это использует INFORMATION_SCHEMA на таблицах в текущей базе данных.
Протестированный в SQL Server 2008.

    select distinct c.TABLE_NAME     
    from INFORMATION_SCHEMA.COLUMNS as c
    where c.DATA_TYPE = 'datetime'

Другой запрос для SQL 2005/2008 использование системных представлений:

select tbl.name as 'Table', c.name as 'Column Name', t.name as 'Type'
from sys.columns as c
inner join sys.tables as tbl
on tbl.object_id = c.object_id
inner join sys.types as t
on c.system_type_id = t.system_type_id
where t.name in ('datetime', 'date')
order by tbl.name
17
ответ дан 29 November 2019 в 23:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: