詳細資訊
| 產品名稱 | SQL Server |
| 事件識別碼 | 4186 |
| 事件來源 | MSSQLSERVER |
| 元件 | SQLEngine |
| 符號名稱 | |
| 消息正文 | 欄位 '%ls.%.*ls' 無法在 OUTPUT 子句中被引用,因為欄位定義包含子查詢或引用執行使用者或系統數據存取的函數。 函數如果不是結構描述繫結,根據預設會假設為要執行資料存取。 請考慮從數據行定義中移除子查詢或函式,或從 OUTPUT 子句中移除數據行。 |
說明
為了防止不確定行為,當欄位是由下列方法之一定義時,OUTPUT 子句無法從檢視或內嵌表值函數中引用該欄位:
子查詢。
執行使用者或系統數據存取的使用者定義函式,或假設要執行這類存取。
計算欄位,包含了一個使用者定義函數,此函數在其定義中執行使用者或系統的資料存取。
範例
檢視子查詢所定義的數據行
下列範例會建立檢視,該檢視會使用選取清單中的子查詢來定義資料行 State。 UPDATE 語句接著會在 OUTPUT 子句中參考 State 列,並因為選取清單中的子查詢而失敗。
USE AdventureWorks2012;
GO
CREATE VIEW dbo.V1
AS
SELECT City,
-- subquery to return the State name
(SELECT Name FROM Person.StateProvince AS sp
WHERE sp.StateProvinceID = a.StateProvinceID) AS State
FROM Person.Address AS a;
GO
--Reference the State column in the OUTPUT clause of an UPDATE statement
UPDATE dbo.V1
SET City = City + 'Test'
OUTPUT deleted.City, deleted.State, inserted.City, inserted.State
WHERE State = 'Texas';
GO
檢視函式所定義的數據行
下列範例會建立檢視,該檢視會使用選取清單中的數據存取純量函 dbo.ufnGetStock 式來定義資料行 CurrentInventory。 UPDATE 語句接著在 OUTPUT 子句中參考 CurrentInventory 欄。
USE AdventureWorks2012;
GO
CREATE VIEW Production.ReorderLevels
AS
SELECT ProductID, ProductModelID, ReorderPoint,
dbo.ufnGetStock(ProductID) AS CurrentInventory
FROM Production.Product;
GO
UPDATE Production.ReorderLevels
SET ReorderPoint += CurrentInventory
OUTPUT deleted.ReorderPoint, deleted.CurrentInventory,
inserted.ReorderPoint, inserted.CurrentInventory
WHERE ProductModelID BETWEEN 75 and 80;
使用者動作
錯誤 4186 可透過下列其中一種方式修正:
使用聯結,而不是子查詢來定義檢視或函式中的數據行。 例如,您可以重寫檢視
dbo.V1,如下所示。USE AdventureWorks2012; GO CREATE VIEW dbo.V1 AS SELECT City, sp.Name AS State FROM Person.Address AS a JOIN Person.StateProvince AS sp ON sp.StateProvinceID = a.StateProvinceID;檢查使用者定義函數的定義。 如果函式未執行使用者或系統數據存取,請改變 函式以包含WITH SCHEMABINDING子句。
從 OUTPUT 子句中移除資料行。