52 Stimmen

Einfügen/Ändern/Löschen mit Funktion in SQL Server

Können wir die Insert/Update/Delete Anweisung mit SQL Server Functions . Ich habe versucht, mit aber SQL Server Fehler aufgetreten ist.

Fehler:

Invalid use of side-effecting or time-dependent operator in 'DELETE' within a function.

Hat irgendjemand eine Idee, warum wir nicht mit Insert/Update/Delete Aussagen mit SQL Server functions.

Ich warte auf Ihre guten Ideen

1voto

Sie können eine Tabellenvariable als Rückgabetyp haben und dann auf der Grundlage dieser Ausgabe eine Tabelle aktualisieren oder einfügen. Mit anderen Worten, Sie können die Variablenausgabe als Originaltabelle festlegen, die Änderungen vornehmen und dann eine Einfügung in die Originaltabelle anhand der Funktionsausgabe vornehmen. Es ist ein kleiner Hack, aber wenn Sie die @output_table aus der Originaltabelle einfügen und dann zum Beispiel sagen: Insert into my_table select * from meine_funktion

dann können Sie das Ergebnis erreichen.

0voto

Ajay Sharma Punkte 31

Wir können nicht sagen, ob es möglich ist oder nicht, dass es eine andere Möglichkeit gibt, Aktualisierungsvorgänge in benutzerdefinierten Funktionen durchzuführen. Direkt DML ist in UDF nicht möglich, das ist sicher.

Die nachfolgende Abfrage funktioniert einwandfrei:

create table testTbl
(
id int identity(1,1) Not null,
name nvarchar(100)
)
GO

insert into testTbl values('ajay'),('amit'),('akhil')
Go

create function tblValued()
returns Table
as
return (select * from testTbl where id = 1)
Go

update tblValued() set name ='ajay sharma' where id = 1
Go

select * from testTbl 
Go

0voto

user11378203 Punkte 1

"Funktionen haben nur READ-ONLY Datenbankzugriff" Wenn DML-Operationen in Funktionen erlaubt wären, wäre die Funktion einer gespeicherten Prozedur sehr ähnlich.

0voto

Majedur Punkte 2282

Nein, Sie können nicht einfügen/aktualisieren/löschen.

Funktionen funktionieren nur mit select Erklärungen. Und es hat nur READ-ONLY Datenbankzugriff.

Darüber hinaus:

  • Die Funktionen werden jedes Mal kompiliert.
  • Funktionen müssen einen Wert oder ein Ergebnis zurückgeben.
  • Funktionen arbeiten nur mit Eingabeparametern.
  • Try- und Catch-Anweisungen werden in Funktionen nicht verwendet.

0voto

Jovan Ilic Punkte 21
  CREATE FUNCTION dbo.UdfGetProductsScrapStatus
(
@ScrapComLevel INT
) 
RETURNS @ResultTable TABLE
( 
ProductName VARCHAR(50), ScrapQty FLOAT, ScrapReasonDef VARCHAR(100), ScrapStatus VARCHAR(50)
) AS BEGIN
        INSERT INTO @ResultTable
            SELECT PR.Name, SUM([ScrappedQty]), SC.Name, NULL
                FROM [Production].[WorkOrder] AS WO
                        INNER JOIN 
                        Production.Product AS PR
                        ON Pr.ProductID = WO.ProductID
                        INNER JOIN Production.ScrapReason AS SC
                        ON SC.ScrapReasonID = WO.ScrapReasonID
                WHERE WO.ScrapReasonID IS NOT NULL
                GROUP BY PR.Name, SC.Name
UPDATE @ResultTable
            SET ScrapStatus = 
            CASE WHEN ScrapQty > @ScrapComLevel THEN 'Critical'
            ELSE 'Normal'
            END

RETURN
END

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X