2016-02-17 272 views
0

我在Visual Studio 2015和SQL Server 2014中使用了SSRS/SSDT。存在大於8年的錯誤,其中you can't select multiple columns from different tables that have the same name。爲了解決這個問題,我需要使用子查詢。我發現每一個答案都會重寫給定的查詢以刪除子查詢,這通常會很好,但不適用於這種情況。如何將參數傳遞給SQL Server中的子查詢?將參數傳遞給子查詢

列別名不適用於此錯誤 - 使用AS會在「重複」列上返回未知列錯誤,即使它與所有其他列一起使用。 SELECT子句中的最後兩行工作是因爲正在查詢值以便報表可以使用它們,但實際查詢的其餘部分不使用它們。

這是我當前的代碼(因爲子查詢返回多行不起作用)。

SELECT t.[Description], 
     t.RequestedCompletionDate, 
     t.CommitDate, 
     t.StatusId, 
     t.PriorityId, 
     p.ProjectNumber, 
     s.Name AS StatusDescription, 
     pr.Name AS PriorityDescription 
FROM ProjectTask t 
inner join Project p 
    on p.Id = t.ProjectId 
inner join Project_TaskStatus s 
    on s.Id = t.StatusId 
inner join Project_Priority pr 
    on pr.Id = t.PriorityId 
WHERE t.Type = 'ET' 
AND t.StatusId NOT IN (4,7) 
AND 
(
    SELECT StatusId FROM Project 
    -- WHERE ? 
) 
NOT IN (3, 4) 
ORDER BY t.PriorityId, 
     t.CommitDate, 
     t.RequestedCompletionDate 

這是帶有註釋中所要求的別名的代碼。它拋出一個錯誤:

SELECT t.[Description], 
     t.RequestedCompletionDate, 
     t.CommitDate, 
     t.StatusId AS TaskStatusId, 
     t.PriorityId, 
     p.ProjectNumber, 
     p.StatusId AS ProjectStatusId, 
     s.Name AS StatusDescription, 
     pr.Name AS PriorityDescription 
FROM ProjectTask t 
inner join Project p 
    on p.Id = t.ProjectId 
inner join Project_TaskStatus s 
    on s.Id = TaskStatusId 
inner join Project_Priority pr 
    on pr.Id = t.PriorityId 
WHERE t.Type = 'ET' 
AND TaskStatusId NOT IN (4,7) 
AND ProjectStatusId NOT IN (3,4) 
ORDER BY t.PriorityId, 
     t.CommitDate, 
     t.RequestedCompletionDate 

-- Invalid column name 'TaskStatusId'. 
-- Invalid column name 'TaskStatusId'. 
-- Invalid column name 'TaskStatusId'. 
-- Invalid column name 'ProjectStatusId'. 
-- Invalid column name 'ProjectStatusId'. 

理想的代碼如下,但它引發錯誤An item with the same key has already been added,這是錯誤SSRS/SSDT試圖返回同名的多個列時拋出。

SELECT t.[Description], 
     t.RequestedCompletionDate, 
     t.CommitDate, 
     t.StatusId, 
     t.PriorityId, 
     p.ProjectNumber, 
     p.StatusId, 
     s.Name AS StatusDescription, 
     pr.Name AS PriorityDescription 
FROM ProjectTask t 
inner join Project p 
    on p.Id = t.ProjectId 
inner join Project_TaskStatus s 
    on s.Id = t.StatusId 
inner join Project_Priority pr 
    on pr.Id = t.PriorityId 
WHERE t.Type = 'ET' 
AND t.StatusId NOT IN (4,7) 
AND p.StatusId NOT IN (3,4) 
ORDER BY t.PriorityId, 
     t.CommitDate, 
     t.RequestedCompletionDate 
+1

只給'p.StatusId'像'p.StatusId作爲ProjectStatusId'什麼 – JamieD77

+0

@ JamieD77,這不符合SSRS工作一個新的名字,我只是編輯這個問題要澄清一下。 – vaindil

+0

爲什麼當您的示例查詢中沒有參數時,您的問題是「傳遞參數」? –

回答

0

我覺得這很愚蠢,但顯然它只是在子查詢中調用p.Id。它知道我引用父查詢的值,即使它在子查詢中。感謝大家的幫助。

SELECT t.[Description], 
     t.RequestedCompletionDate, 
     t.CommitDate, 
     t.StatusId, 
     t.PriorityId, 
     p.ProjectNumber, 
     s.Name AS StatusDescription, 
     pr.Name AS PriorityDescription 
FROM ProjectTask t 
inner join Project p 
    on p.Id = t.ProjectId 
inner join Project_TaskStatus s 
    on s.Id = t.StatusId 
inner join Project_Priority pr 
    on pr.Id = t.PriorityId 
WHERE t.Type = 'ET' 
AND t.StatusId NOT IN (4,7) 
AND 
(
    SELECT StatusId FROM Project WHERE Id = p.Id 
) 
NOT IN (3, 4) 
ORDER BY t.PriorityId, 
     t.CommitDate, 
     t.RequestedCompletionDate 
+0

這與你原來的問題沒有任何關係。這是有效的,因爲你已經從選擇列表中刪除了p.StatusId。 –

+0

這就是爲什麼這可以解決問題。我想你是正確的,它不涉及像最初想要的問題那樣傳遞參數,但它解決了問題。我可以重新修改問題以更好地適應。 – vaindil

+0

你的問題是你試圖在JOINS和WHERE語句中使用字段別名。僅僅因爲你在SELECT中說't.StatusId AS TaskStatusID'並不意味着你可以在'inner join Project_TaskStatus中使用'TaskStatusID' s on s.Id = TaskStatusId'你必須使用字段名稱,例如s.Id = t.StatusID'上的內連接Project_TaskStatus。唯一可以使用'ALIAS'的地方在'ORDER BY'中 – JamieD77

0

解決方法是容易的,無論是重命名第二列,iebField1 AS Field01或只是省略場一起

+0

我需要使用這兩個字段。使用'AS'不起作用,我添加了另一個代碼塊來顯示它。 – vaindil

+0

SSRS僅在爲數據集確定字段時才查看列名,如果從一個或多個表中選擇具有相同名稱的兩列,則會引發此錯誤。 – GabrielVa

+0

我明白了,那就是我想要解決的問題。我想避免必須自己重命名列。 – vaindil

1

current code (doesn't work because the subquery returns multiple rows).

所以不是這個

AND 
(
    SELECT StatusId FROM Project 
    -- WHERE ? 
) 
NOT IN (3, 4) 

你可以這樣做

AND 
EXISTS (
    SELECT 1 FROM Project p2 
    WHERE p2.StatusId IN (3, 4) AND p2.Id = p.Id 
) 
+0

這將選擇'StatusId'爲3或4的'Project'表中的首行,它不會根據任務關聯的項目進行檢查。 – vaindil

+0

@Vaindil好吧,我已經更新了我的答案。這不行嗎? (我與oracle的工作,我不熟悉SQL Server ...) – radoh

1

試試這個:

SELECT t.[Description], 
     t.RequestedCompletionDate, 
     t.CommitDate, 
     t.StatusId AS TaskStatusId, 
     t.PriorityId, 
     p.ProjectNumber, 
     p.StatusId AS ProjectStatusId, 
     s.Name AS StatusDescription, 
     pr.Name AS PriorityDescription 
FROM ProjectTask t 
inner join Project p 
    on p.Id = t.ProjectId 
inner join Project_TaskStatus s 
    on s.Id = t.StatusId 
inner join Project_Priority pr 
    on pr.Id = t.PriorityId 
WHERE t.Type = 'ET' 
AND t.StatusId NOT IN (4,7) 
AND p.StatusId NOT IN (3,4) 
ORDER BY t.PriorityId, 
     t.CommitDate, 
     t.RequestedCompletionDate