2017-09-22 83 views
0

我有一種觀點,我可以使用SQL Server 2012 Enterprise版本11.0.6251 Windows NT 6.3(15063)進行更新。更新基於union select的SQL Server視圖中的數據

但是,該視圖不允許我在SQL Server 2012企業版11.0.3128 Windows NT 6.2(9200)上進行更新。

我只是試圖更新視圖中的一列。 (CreditSigned專欄)

我看了看是否有辦法將SQL Server 11.0.3128升級到11.0.3128,但SQL Server告訴我我有最新版本,並且沒有任何升級。

有我丟失的東西,讓我來更新SQL Server在視圖中的數據2012企業11.0.3128

CREATE VIEW [dbo].[Credits] AS SELECT * FROM (SELECT 
    [g].[SortNbr], 
    [g].[GradeName] + ' ' + (CASE WHEN [g].[PersonID] IS NULL THEN '' ELSE [t].[LastName] + ', ' + [t].[FirstName] END) AS GradeLongName, 
    [m].[MealID], 
    [MealDate], 
    [MealLine1], 
    [MealLine2], 
    [MealLine3], 
    [op].[FirstName] + ' ' + [op].[LastName] + ' ' + ISNULL(NULLIF ([op].[UniqueName], ''), '') + ': ' + [Drink] + ' ' + ISNULL(NULLIF ([OrderComment], ''), '') AS OrderText, 
    [gt].[GradeTypeID], 
    [g].[GradeID], 
    [o].[OrderID], 
    [o].[CreditIssued] 
FROM ((([People] AS op 
INNER JOIN ([DrinkOptions] AS do 
INNER JOIN ([Meals] AS m 
INNER JOIN [Orders] AS o 
ON [m].[MealID] = [o].[MealID]) 
ON [do].[DrinkID] = [o].[DrinkID]) 
ON [op].[PersonID] = [o].[PersonID]) 
INNER JOIN [Grades] AS g 
ON [op].[GradeID] = [g].[GradeID]) 
LEFT JOIN [People] AS t 
ON [g].[PersonID] = [t].[PersonID]) 
INNER JOIN [GradeTypes] AS gt 
ON [g].[GradeTypeID] = [gt].[GradeTypeID] 
UNION SELECT   
    [g].[SortNbr], 
    [g].[GradeName] + ' ' + (CASE WHEN [g].[PersonID] IS NULL THEN '' ELSE [op].[LastName] + ', ' + [op].[FirstName] END) AS GradeLongName, 
    [m].[MealID], 
    [MealDate], 
    [MealLine1], 
    [MealLine2], 
    [MealLine3], 
    [op].[FirstName] + ' ' + [op].[LastName] + ' ' + ISNULL(NULLIF ([op].[UniqueName], ''), '') + ': ' + [Drink] + ' ' + ISNULL(NULLIF ([OrderComment], ''), '') AS OrderText, 
    [gt].[GradeTypeID], 
    [g].[GradeID], 
    [o].[OrderID], 
    [o].[CreditIssued] 
FROM ((([People] AS op 
INNER JOIN [Grades] AS g 
ON [op].[LunchTimeID] = [g].[GradeID]) 
INNER JOIN ([Meals] AS m 
INNER JOIN [Orders] AS o 
ON [m].[MealID] = [o].[MealID]) 
ON [op].[PersonID] = [o].[PersonID]) 
INNER JOIN [DrinkOptions] AS do 
ON [o].[DrinkID] = [do].[DrinkID]) 
INNER JOIN [GradeTypes] AS gt 
ON [g].[GradeTypeID] = [gt].[GradeTypeID]) a 
WHERE SortNbr != 18 
+2

你得到了什麼錯誤?你試圖「更新」它意味着什麼? – scsimon

+1

這種觀點有點瘋狂。這種連接語法是由自動化工具編寫的,或者是一個真正想讓事情變得比他們需要的更復雜的人。我在這兩個查詢中看到的唯一區別是,第一個參數將People表格以相同的值連接到People上。我想也許這是一個父母/小孩的事情,但不是,它只是與它加入的同一行。您也可以將where謂詞添加到每個查詢中,並完全消除對外部查詢的需要。 –

+0

正如@Dan已經提到的那樣,具有'union'或'union all'選項*的視圖通常*是不可更新的*。我實際上有時會故意創建這種類型的視圖。 – cars10m

回答

0

對於非可更新視圖(如UNION ALL結構),你需要使用觸發器INSTEAD OF

+0

以下語句在SQL Server 2012企業版11.0.6251 Windows NT 6.3(15063)上正常工作,但不在SQL Server 2012企業版11.0.3128上正常工作Windows NT 6.2(9200):更新信用SET CreditIssued = 1 Where OrderID =? 「。該語句在Microsoft Windows NT 6.3上的SQL Server Standard 13.0.4206.0上也可以正常工作 – TroyF

相關問題