Get table name in column

Ckey
Дата: 05.02.2013 00:08:30
Привет, мне нужна ваша помощь.
Есть несколько таблиц, с которых мне нужны данные.
Например:
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

спасибо за помощь!
Gwa
Дата: 05.02.2013 00:13:31
Ckey,

select [DateTime1P], [MachineName], [Value], 'LogicalDisk' As TableName from [dbo].[LogicalDisk]
union 
select [DateTime1P], [MachineName], [Value], 'MemoryAvailable' As TableName from [dbo].[MemoryAvailable]
Ckey
Дата: 05.02.2013 00:21:49
Спасибо Gwa, а есть возможность вытащить эти названия используя sys.tables?
просто таблиц больше чем 40, и union собственно тоже :))
aleks2
Дата: 05.02.2013 08:39:28
Ckey
Спасибо Gwa, а есть возможность вытащить эти названия используя sys.tables?
просто таблиц больше чем 40, и union собственно тоже :))

Вытащить то можна... но суть не изменится. Надож знать чего тащить.
alexeyvg
Дата: 05.02.2013 08:52:15
Ckey
Спасибо Gwa, а есть возможность вытащить эти названия используя sys.tables?
просто таблиц больше чем 40, и union собственно тоже :))
Разумеется, автоматически нельзя, потому что в общем случае нет понятия "таблица, из которой получили данные", там же могут быть и более сложные запросы, нежели одна таблица.
П-Л
Дата: 05.02.2013 09:08:45
А зачем сосбно было раскладывать в разные аналогичные таблицы, чтобы потом тратить усилия чтобы снова объединить данные ?
Гость333
Дата: 05.02.2013 10:03:46
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;
Shurgenz
Дата: 05.02.2013 11:05:40
Гость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;
Гость333
Дата: 05.02.2013 11:14:16
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)