Udostępnij za pośrednictwem


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.

Zobacz także

Odwołanie