次の方法で共有


MSSQLSERVER_4186

詳細

製品名 SQL Server
イベント ID 4186
イベント元 MSSQLSERVER
コンポーネント SQLEngine
シンボル名
メッセージ テキスト Column '%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 句から列を削除します。

こちらもご覧ください

OUTPUT 句 (Transact-SQL)