Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Get table name in column  [new]
Ckey
Member

Откуда:
Сообщений: 56
Привет, мне нужна ваша помощь.
Есть несколько таблиц, с которых мне нужны данные.
Например:
select [DateTime1P], [MachineName], [Value] from [dbo].[LogicalDisk]
union 
select [DateTime1P], [MachineName], [Value] from [dbo].[MemoryAvailable]


+ в следующей колонке мне нужно знать с какой таблицы эти данные
Вот таким вот образом:
DateTime1P MachineName Value TableName
----------------------- -------------------- ---------------------- ----------------------
2012-09-12 20:46:00.000 VASYA 66.4742 LogicalDisk
2012-09-12 20:46:00.000 VASYA 393 MemoryAvailable

спасибо за помощь!
5 фев 13, 00:08    [13875162]     Ответить | Цитировать Сообщить модератору
 Re: Get table name in column  [new]
Gwa
Guest
Ckey,

select [DateTime1P], [MachineName], [Value], 'LogicalDisk' As TableName from [dbo].[LogicalDisk]
union 
select [DateTime1P], [MachineName], [Value], 'MemoryAvailable' As TableName from [dbo].[MemoryAvailable]
5 фев 13, 00:13    [13875175]     Ответить | Цитировать Сообщить модератору
 Re: Get table name in column  [new]
Ckey
Member

Откуда:
Сообщений: 56
Спасибо Gwa, а есть возможность вытащить эти названия используя sys.tables?
просто таблиц больше чем 40, и union собственно тоже :))
5 фев 13, 00:21    [13875206]     Ответить | Цитировать Сообщить модератору
 Re: Get table name in column  [new]
aleks2
Guest
Ckey
Спасибо Gwa, а есть возможность вытащить эти названия используя sys.tables?
просто таблиц больше чем 40, и union собственно тоже :))

Вытащить то можна... но суть не изменится. Надож знать чего тащить.
5 фев 13, 08:39    [13875545]     Ответить | Цитировать Сообщить модератору
 Re: Get table name in column  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
Ckey
Спасибо Gwa, а есть возможность вытащить эти названия используя sys.tables?
просто таблиц больше чем 40, и union собственно тоже :))
Разумеется, автоматически нельзя, потому что в общем случае нет понятия "таблица, из которой получили данные", там же могут быть и более сложные запросы, нежели одна таблица.
5 фев 13, 08:52    [13875566]     Ответить | Цитировать Сообщить модератору
 Re: Get table name in column  [new]
П-Л
Guest
А зачем сосбно было раскладывать в разные аналогичные таблицы, чтобы потом тратить усилия чтобы снова объединить данные ?
5 фев 13, 09:08    [13875617]     Ответить | Цитировать Сообщить модератору
 Re: Get table name in column  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Ckey
Спасибо Gwa, а есть возможность вытащить эти названия используя sys.tables?
просто таблиц больше чем 40, и union собственно тоже :))

Можно собрать динамический запрос, sys.tables не нужен:
DECLARE @sql NVARCHAR(MAX);

WITH Tables (TableName) AS
(
    SELECT N'LogicalDisk'     UNION ALL
    SELECT N'MemoryAvailable' UNION ALL
    SELECT N'Table111'        UNION ALL
    SELECT N'Table333'
)
SELECT @sql =
       STUFF
       (
           (
               SELECT N' union all' + NCHAR(13) + NCHAR(10) +
                      N'select [DateTime1P], [MachineName], [Value], ''' + t.TableName +
                      N''' as TableName from [dbo].' + QUOTENAME(t.TableName)
               FROM Tables t
               FOR XML PATH(''), TYPE
           ).value('.', 'nvarchar(max)'),
           1, 10, ''
       );

PRINT @sql;

--EXEC sp_executesql @sql;
5 фев 13, 10:03    [13875807]     Ответить | Цитировать Сообщить модератору
 Re: Get table name in column  [new]
Shurgenz
Member

Откуда: Питер
Сообщений: 1938
Гость333
Ckey
Спасибо Gwa, а есть возможность вытащить эти названия используя sys.tables?
просто таблиц больше чем 40, и union собственно тоже :))

Можно собрать динамический запрос, sys.tables не нужен:
DECLARE @sql NVARCHAR(MAX);

WITH Tables (TableName) AS
(
    SELECT N'LogicalDisk'     UNION ALL
    SELECT N'MemoryAvailable' UNION ALL
    SELECT N'Table111'        UNION ALL
    SELECT N'Table333'
)
SELECT @sql =
       STUFF
       (
           (
               SELECT N' union all' + NCHAR(13) + NCHAR(10) +
                      N'select [DateTime1P], [MachineName], [Value], ''' + t.TableName +
                      N''' as TableName from [dbo].' + QUOTENAME(t.TableName)
               FROM Tables t
               FOR XML PATH(''), TYPE
           ).value('.', 'nvarchar(max)'),
           1, 10, ''
       );

PRINT @sql;

--EXEC sp_executesql @sql;


можно пойти дальше :)

DECLARE @sql NVARCHAR(MAX);

WITH Tables (TableName) AS
(
    SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES A
    WHERE EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=A.TABLE_NAME GROUP BY TABLE_NAME HAVING SUM(CASE WHEN COLUMN_NAME IN ('DateTime1P', 'MachineName', 'Value') THEN 1 ELSE 0 END)=3)
)
SELECT @sql =
       STUFF
       (
           (
               SELECT N' union all' + NCHAR(13) + NCHAR(10) +
                      N'select [DateTime1P], [MachineName], [Value], ''' + t.TableName +
                      N''' as TableName from [dbo].' + QUOTENAME(t.TableName)
               FROM Tables t
               FOR XML PATH(''), TYPE
           ).value('.', 'nvarchar(max)'),
           1, 10, ''
       );

PRINT @sql;

--EXEC sp_executesql @sql;
5 фев 13, 11:05    [13876183]     Ответить | Цитировать Сообщить модератору
 Re: Get table name in column  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Shurgenz,

Ага, только правильнее будет так:

    WHERE EXISTS
       (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_NAME=A.TABLE_NAME AND TABLE_SCHEMA=A.TABLE_SCHEMA
        GROUP BY TABLE_NAME
        HAVING SUM(CASE WHEN COLUMN_NAME IN ('DateTime1P', 'MachineName', 'Value') THEN 1 ELSE 0 END)=3)
5 фев 13, 11:14    [13876231]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить