MSSQLSERVER_4186MSSQLSERVER_4186

In questo argomento si applica a: SìSQL ServernonDatabase SQL di AzurenonAzure SQL Data Warehouse non Parallel Data WarehouseTHIS TOPIC APPLIES TO: yesSQL ServernoAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

DettagliDetails

Nome prodottoProduct Name SQL ServerSQL Server
ID eventoEvent ID 41864186
Origine eventoEvent Source MSSQLSERVERMSSQLSERVER
ComponenteComponent SQLEngineSQLEngine
Nome simbolicoSymbolic Name
Testo del messaggioMessage Text Colonna '%ls.%. Impossibile fare riferimento a ls' nella clausola OUTPUT perché la definizione di colonna contiene una sottoquery o fa riferimento a una funzione che accede a dati utente o di sistema.Column '%ls.%.ls' cannot be referenced in the OUTPUT clause because the column definition contains a subquery or references a function that performs user or system data access. Si presuppone che le funzioni non associate a schema eseguano per impostazione predefinita l'accesso ai dati.A function is assumed by default to perform data access if it is not schemabound. Rimuovere la sottoquery o la funzione dalla definizione di colonna o rimuovere la colonna dalla clausola OUTPUT.Consider removing the subquery or function from the column definition or removing the column from the OUTPUT clause.

SpiegazioneExplanation

Per impedire un comportamento non deterministico, la clausola OUTPUT non può fare riferimento a una colonna di una vista o di una funzione inline con valori di tabella se la colonna in questione viene definita mediante uno dei metodi seguenti:To prevent nondeterministic behavior, the OUTPUT clause cannot reference a column from a view or inline table-valued function when that column is defined by one of the following methods:

  • Sottoquery.A subquery.

  • Funzione definita dall'utente che esegue, o si presume esegua, l'accesso ai dati dell'utente o di sistema.A user-defined function that performs user or system data access, or is assumed to perform such access.

  • Colonna calcolata che contiene una funzione definita dall'utente che esegue l'accesso ai dati dell'utente o di sistema nella relativa definizione.A computed column that contains a user-defined function that performs user or system data access in its definition.

EsempiExamples

Visualizzare una colonna definita da una sottoqueryView Column Defined by a Subquery

Nell'esempio seguente viene creata una vista che utilizza una sottoquery dell'elenco di selezione per definire la colonna State.The following example creates a view that uses a subquery in the select list to define the column State. Un'istruzione UPDATE fa quindi riferimento alla colonna State nella clausola OUTPUT e ha esito negativo a causa della sottoquery nell'elenco di selezione.An UPDATE statement then references the State column in the OUTPUT clause and fails because ob the subquery in the select list.

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  

Visualizzare una colonna definita da una funzioneView Column Defined by a Function

Nell'esempio seguente viene creata una vista che usa la funzione scalare di accesso ai dati dbo.ufnGetStockdell'elenco di selezione per definire la colonna CurrentInventory.The following example creates a view that uses the data accessing, scalar function dbo.ufnGetStock in the select list to define the column CurrentInventory. Un'istruzione UPDATE fa quindi riferimento alla colonna CurrentInventory nella clausola OUTPUT.An UPDATE statement then references the CurrentInventory column in the OUTPUT clause .

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;  

Azione dell'utenteUser Action

È possibile correggere l'errore 4186 in uno dei modi seguenti:Error 4186 can be corrected in one of the following ways:

  • Utilizzare i join anziché le sottoquery per definire la colonna nella vista o nella funzione.Use joins instead of subqueries to define the column in the view or function. È ad esempio possibile riscrivere la vista dbo.V1 come segue.For example, you can rewrite the view dbo.V1 as follows.

    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;  
    
  • Esaminare la definizione della funzione definita dall'utente.Examine the definition of the user-defined function. Se la funzione non esegue l'accesso ai dati dell'utente o del sistema, modificarla in modo da includere la clausola WITH SCHEMABINDING.If the function does not perform user or system data access, alter the function to include the WITH SCHEMABINDING clause.

  • Rimuovere la colonna dalla clausola OUTPUT. Remove the column from the OUTPUT clause.

Vedere ancheSee Also

Clausola OUTPUT (Transact-SQL)OUTPUT Clause (Transact-SQL)