Как вернуть имя таблицы в имя столбца объединяемых таблиц - PullRequest
0 голосов
/ 17 октября 2011

У меня есть запрос ...

select * from Contact c
left join Employee e on c.ContactID=e.ContactID
left join [Role] r on e.EmployeeID=r.EmployeeID
where FirstName like '%pete%'

Возвращает информацию там, где находит ее в порядке. Однако я хотел бы иметь возможность видеть таблицы, из которых состоит каждый столбец, без необходимости явно выбирать каждый столбец и делать оператор «как» для имени столбца. Возможно ли это?

Ответы [ 3 ]

3 голосов
/ 17 октября 2011

Нет, я не думаю, что это возможно.В общем, в любом случае плохая идея использовать «select *» в запросах, так что вам лучше было бы печатать имена столбцов, это можно ускорить с помощью таких инструментов, как management studio.

Если вы используете select* это плохо, потому что

1) если кто-то изменит таблицу, запрос все равно будет работать, но будет сложнее проследить, почему вы больше не читаете данные.

2) вы можете вернуть больше данных, чем вам на самом деле нужно, тратить время на чтение и пропускную способность сети.Как правило, рекомендуется включать необходимые столбцы, а затем добавлять дополнительные, если они вам нужны.

1 голос
/ 17 октября 2011

Вы можете попробовать использовать следующий метод, но я предупреждаю вас: это не точно .

Для отображения списка столбцов (имя столбца, имя таблицы, псевдоним таблицы, имя базы данных), после хотя бы одного выполнения , это решение использует кэшированные планы.Следующий пример можно запустить в AdventureWorks2008 .

--First step is to run query
SET ANSI_WARNINGS ON;
GO
--QID:579F1EB7-3E68-4ED6-AED0-22E1890AF6CF
SELECT  TOP(10)
        h.SalesOrderID
        ,h.OrderDate
        ,e.JobTitle
        ,p.*
        ,p.FirstName + p.LastName --calculated field
FROM    Sales.SalesOrderHeader h
INNER JOIN HumanResources.Employee e ON e.BusinessEntityID = h.SalesPersonID
INNER JOIN Person.Person p ON e.BusinessEntityID = p.BusinessEntityID 
GO

--Second step
DECLARE  @plan_handle VARBINARY(64)
        ,@x XML;

SELECT  TOP(1)
        @plan_handle = qs.plan_handle
FROM    sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) txt
WHERE   txt.text LIKE '--QID:579F1EB7-3E68-4ED6-AED0-22E1890AF6CF%'
AND     txt.text NOT LIKE '%dm_exec_query_stats%'
--The last used plan (be careful with concurrent executions)
--Also, for the same query you may have many more plans (with parallelism or without)
ORDER BY qs.last_execution_time DESC;   

SELECT  @x = f.query_plan
FROM    sys.dm_exec_query_plan(@plan_handle) f;

WITH XMLNAMESPACES(DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
SELECT   a.b.value('@Database','NVARCHAR(128)') [Database]
        ,a.b.value('@Schema','NVARCHAR(128)')   [Schema]
        ,a.b.value('@Table','NVARCHAR(128)')    [Table]
        ,a.b.value('@Alias','NVARCHAR(128)')    [Alias]
        ,a.b.value('@Column','NVARCHAR(128)')   [Column]
FROM    @x.nodes('/ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple/QueryPlan/RelOp/OutputList/ColumnReference') a(b);

В начале целевого запроса я использовал этот комментарий --QID:guid (идентификатор запроса) для более точной идентификации.Если у вас есть хранимые процедуры, вместо sys.dm_exec_query_stats можно использовать представление sys.dm_exec_procedure_stats (я не проверял) для фильтрации по database_id и object_id (идентификатор хранимой процедуры).

Результаты:

Database               Schema             Table              Alias Column               
---------------------- ------------------ ------------------ ----- ---------------------
[AdventureWorks2008]   [Sales]            [SalesOrderHeader] [h]   SalesOrderID
[AdventureWorks2008]   [Sales]            [SalesOrderHeader] [h]   OrderDate
[AdventureWorks2008]   [HumanResources]   [Employee]         [e]   JobTitle
[AdventureWorks2008]   [Person]           [Person]           [p]   BusinessEntityID
[AdventureWorks2008]   [Person]           [Person]           [p]   PersonType
[AdventureWorks2008]   [Person]           [Person]           [p]   NameStyle
[AdventureWorks2008]   [Person]           [Person]           [p]   Title
[AdventureWorks2008]   [Person]           [Person]           [p]   FirstName
[AdventureWorks2008]   [Person]           [Person]           [p]   MiddleName
[AdventureWorks2008]   [Person]           [Person]           [p]   LastName
[AdventureWorks2008]   [Person]           [Person]           [p]   Suffix
[AdventureWorks2008]   [Person]           [Person]           [p]   EmailPromotion
[AdventureWorks2008]   [Person]           [Person]           [p]   AdditionalContactInfo
[AdventureWorks2008]   [Person]           [Person]           [p]   Demographics
[AdventureWorks2008]   [Person]           [Person]           [p]   rowguid
[AdventureWorks2008]   [Person]           [Person]           [p]   ModifiedDate
NULL                   NULL               NULL               NULL  Expr1006
1 голос
/ 17 октября 2011

Это может помочь вам. Все столбцы e находятся перед разделителем, а все столбцы r - после.

select e.*, '' as [_______], r.* from Contact c
left join Employee e on c.ContactID=e.ContactID
left join [Role] r on e.EmployeeID=r.EmployeeID
where FirstName like '%pete%'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...