詳細
製品名 | 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 句から列を削除します。