2017-09-22 38 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

相关问题