Share via


MSSQLSERVER_4186

適用於:SQL Server

詳細資料

屬性
產品名稱 SQL Server
事件識別碼 4186
事件來源 MSSQLSERVER
元件 SQLEngine
符號名稱
訊息文字 OUTPUT 子句中無法參考資料行 '%ls.%.*ls',因為此資料行定義包含子查詢,或者參考了執行使用者或系統資料存取的函數。 函數如果不是結構描述繫結,根據預設會假設為要執行資料存取。 請考慮從資料行定義中移除子查詢或函數,或者從 OUTPUT 子句中移除資料行。

說明

若要防止非決定性行為,當資料行由下列其中一個方法定義時,OUTPUT 子句無法從檢視或內嵌資料表值函式參考資料行:

  • 子查詢。

  • 執行使用者或系統資料存取的使用者定義函數,或假設會執行這類存取的使用者定義函數。

  • 包含使用者定義函數的計算資料行,而該函數會在其定義中執行使用者或系統資料存取。

範例

檢視子查詢所定義的資料行

下列範例會建立檢視,該檢視會使用選取清單中的子查詢來定義資料行 State 。 UPDATE 語句接著會參考 State OUTPUT 子句中的資料行,並因為選取清單中的子查詢而失敗。

USE AdventureWorks2022;  
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 語句接著會參考 CurrentInventory OUTPUT 子句 中的資料行。

USE AdventureWorks2022;  
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 AdventureWorks2022;  
    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 子句中移除資料行。

另請參閱

OUTPUT 子句 (Transact-SQL)