MSSQLSERVER_4186
Szczegóły
Nazwa produktu |
SQL Server |
Wersja produktu |
10.50 |
Numer kompilacji produktu |
|
Identyfikator zdarzenia |
4186 |
Źródło zdarzenia |
MSSQLSERVER |
Składnik |
SQLEngine |
Nazwa symboliczna |
|
Tekst komunikatu |
Kolumna ' % ls.%. * ls nie można odwoływać się w klauzula WYJŚCIOWEGO, ponieważ definicja kolumna zawiera podzapytanie lub odwołuje się do funkcja, która wykonuje użytkownika lub dostępu do danych systemu.Funkcja zakłada, że domyślnie wykonywać dostępu do danych, jeśli nie jest schemabound.Rozważ usunięcie podzapytanie lub funkcja z definicji kolumn lub usunięcie kolumna z klauzula WYJŚCIOWEGO. |
Wyjaśnienie
Aby zapobiec rodzaju klauzula wyjścia nie odwołanie kolumna z widoku lub wbudowane funkcja zwracająca tabelę po tej kolumna jest definiowana przez jedną z następujących metod:
podzapytanie.
Funkcja zdefiniowana przez użytkownika, wykonującego dostępu do danych użytkownika lub systemu lub zakłada, że przeprowadzenie takiego dostępu.
A kolumna obliczana zawierający zdefiniowanej przez użytkownika funkcja wykonuje użytkownika lub dostępu do danych systemu w jego definicję.
Przykłady
Kolumna widoku zdefiniowane przez podkwerendy
Poniższy przykład tworzy widok, który używa podzapytanie na liście wybierz do zdefiniowania kolumna State.Instrukcja UPDATE następnie odwołuje się State kolumna w klauzula wyjścia i kończy się niepowodzeniem, ponieważ bo na liście select podzapytanie.
USE AdventureWorks2008R2;
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
Zdefiniowany przez funkcję Kolumna widoku
Poniższy przykład tworzy widok, który używa funkcja wartość skalarna, dostęp do danych dbo.ufnGetStock na liście wybierz do zdefiniowania kolumna CurrentInventory.Instrukcja UPDATE następnie odwołuje się do CurrentInventory kolumna w klauzula WYJŚCIOWEGO.
USE AdventureWorks2008R2;
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;
Akcja użytkownika
Błąd 4186 można poprawić w jednym z następujących sposobów:
Użyć sprzężeń, zamiast podkwerendy do zdefiniowania kolumna w widoku lub funkcja.Na przykład można napisać ponownie widoku dbo.V1 w następujący sposób.
USE AdventureWorks2008R2; 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;
Zbadać definicji funkcja zdefiniowanej przez użytkownika.Jeśli funkcja nie wykonuje użytkownika lub dostępu do danych systemu, zmianę funkcji, aby uwzględnić SCHEMABINDING Z klauzula.
Usuń kolumna z klauzula WYJŚCIOWEGO.