2015-03-25 3 views
-1

Я пытаюсь написать запрос, в котором два разных UID должны искать имя ресурса для обоих, но отдельно.Поиск двух отображаемых имен с использованием одной таблицы по 1 уникальному присваиванию в таблицах SQL

Другими словами, для каждой задачи есть назначенные ресурсы и один менеджер статусов. Это преобразует в SQl в Assignment, уникальное для ресурса, но с тем же менеджером состояний. Однако нет, где в базе данных можно увидеть имя диспетчера статуса по заданному назначению.

У заданий есть доступный «TaskStatusManagerUID». Имя Диспетчера состояния можно определить, привязав его обратно к таблице MSP_EPMResource, где TaskStatusManagerUID = ResourceUID.

Уловка для моего отчета, я должен иметь возможность посмотреть ResourceUID и TaskstatusManagerUID и определить имена каждого из них с тем же назначением.

Хотя я был успешным с соединением для отображения имени для одного или другого, я не смог определить, как показать имя как для Resource, так и для TaskStatusManager.

Это пример того, что я пытаюсь показать (круглые скобки добавлены для удобства чтения):

(AssignmentUID) (Task Name) (Имя ресурса) (Task Manager Статус Имя)

Смотреть подробнее ниже:

enter image description here

Это код, который я работаю с, но не увенчались успехом:

Select top 100 
c.[assignmentuid], 
a.[taskname], 
c.[resourceuid], 
b.[resourcename], 
a.[taskstatusmanageruid], 
d.[StatusManager] 

from [PRJPROD_ProjectWebApp].[dbo].[MSP_EpmAssignment] c 
join [PRJPROD_ProjectWebApp].[dbo].[MSP_EpmTask_UserView] a 
on a.[TaskUID] = c.[TaskUID] 
join [PRJPROD_ProjectWebApp].[dbo].[MSP_EpmResource] b 
on b.[ResourceUID] = c.[ResourceUID] 

join (select b.resourcename StatusManager 
from [PRJPROD_ProjectWebApp].[dbo].[MSP_EpmResource] b) d 
on d.[StatusManager] = a.[taskstatusmanageruid] 

group by 
c.[assignmentuid], 
a.[taskname], 
c.[resourceuid], 
b.[resourcename], 
a.[taskstatusmanageruid], 
d.[StatusManager] 

В настоящее время я получаю сообщение «Conversion failed при преобразовании из символьной строки в uniqueidentifier».

ответ

0

В ваших объединениях у вас есть on a.[TaskUID] = c.[TaskUID], on b.[ResourceUID] = c.[ResourceUID] и on d.[StatusManager] = a.[taskstatusmanageruid], из которых, я предполагаю, что последний вызывает у вас проблему. Попробуйте вместо

join (select b.resourcename StatusManager 
from [PRJPROD_ProjectWebApp].[dbo].[MSP_EpmResource] b) d 
on d.[StatusManager] = CONVERT(CHAR, a.[taskstatusmanageruid]) 

Это будет конвертировать GUID, содержащийся в taskstatusmanageruid в строку полукокса, что позволяет ему успешно сравнивать.

Вы могли бы также, вместо преобразования значения, отлитого значение CAST(a.[taskstatusmanageruid] AS CHAR

EDIT

Из-за характер GUID, вы не можете быть в состоянии преобразовать/бросьте в полукокса значение, в этом случае вам нужно будет конвертировать/отливать оба поля либо VARCHAR или NVARCHAR:

join (select b.resourcename StatusManager 
from [PRJPROD_ProjectWebApp].[dbo].[MSP_EpmResource] b) d 
on CONVERT([N]VARCHAR, d.[StatusManager]) = CONVERT([N]VARCHAR, a.[taskstatusmanageruid]) 

иЛИ

join (select b.resourcename StatusManager 
from [PRJPROD_ProjectWebApp].[dbo].[MSP_EpmResource] b) d 
on CAST(d.[StatusManager] AS [N]VARCHAR) = CAST(a.[taskstatusmanageruid] AS [N]VARCHAR) 
+0

Хороший улов, но он все еще не работает.Теперь он говорит мне: «Недостаточно пространства результатов для преобразования значения uniqueidentifier в char». как с Convert, так и с Cast. Любые другие идеи? – abauman

+0

Вместо преобразования/литья в char, конвертируйте оба значения в varchar или nvarchar, я отредактирую ответ соответствующим образом. –

0

Благодаря дополнительному набору глаз Джеффа Безе, мне было достаточно, чтобы я получил последний кусок на месте!

Select top 100 
c.[assignmentuid], 
a.[taskname], 
c.[resourceuid], 
b.[resourcename], 
a.[taskstatusmanageruid], 
d.[StatusManager] 

from [PRJPROD_ProjectWebApp].[dbo].[MSP_EpmAssignment] c 
join [PRJPROD_ProjectWebApp].[dbo].[MSP_EpmTask_UserView] a 
on a.[TaskUID] = c.[TaskUID] 
join [PRJPROD_ProjectWebApp].[dbo].[MSP_EpmResource] b 
on b.[ResourceUID] = c.[ResourceUID] 

join (select b.resourcename as StatusManager, 
      b.ResourceUID 
from [PRJPROD_ProjectWebApp].[dbo].[MSP_EpmResource] b) d 
on d.[resourceuid] = a.[taskstatusmanageruid] 


group by 
c.[assignmentuid], 
a.[taskname], 
c.[resourceuid], 
b.[resourcename], 
a.[taskstatusmanageruid], 
d.[StatusManager]