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

85voto

Mitch Wheat Punkte 287474

Non können Sie nicht.

Von SQL Server Books Online:

Benutzerdefinierte Funktionen können nicht verwendet werden Aktionen durchführen, die den Zustand der Datenbankzustand verändern.

Ref .

24voto

Yurii Tsurul Punkte 523

Ja, das können Sie!))

Haftungsausschluss: Dies ist keine Lösung, sondern eher ein Hack, um etwas auszuprobieren. Benutzerdefinierte Funktionen können nicht verwendet werden, um Aktionen durchzuführen, die den Zustand der Datenbank verändern.

Ich habe einen Weg gefunden, um die INSERT , UPDATE o DELETE in Funktion über xp_cmdshell .

Sie müssen also nur den Code in der @sql-Variable ersetzen.

CREATE FUNCTION [dbo].[_tmp_func](@orderID NVARCHAR(50))
RETURNS INT
AS
BEGIN
DECLARE @sql varchar(4000), @cmd varchar(4000)
SELECT @sql = 'INSERT INTO _ord (ord_Code) VALUES (''' + @orderID + ''') '
SELECT @cmd = 'sqlcmd -S ' + @@servername +
              ' -d ' + db_name() + ' -Q "' + @sql + '"'
EXEC master..xp_cmdshell @cmd, 'no_output'
RETURN 1
END

21voto

Anthony Faull Punkte 16853

Funktionen in SQL Server können, wie in der Mathematik, nicht zur Änderung der Datenbank verwendet werden. Sie sind nur zum Lesen gedacht und können Entwicklern bei der Implementierung von Trennung von Befehl und Abfrage . Mit anderen Worten: Wenn Sie eine Frage stellen, sollte sich die Antwort nicht ändern. Wenn Ihr Programm die Datenbank ändern muss, verwenden Sie stattdessen eine gespeicherte Prozedur.

6voto

FistOfFury Punkte 6097

Sie können Tabellen nicht von einer Funktion aus aktualisieren, wie Sie es bei einer gespeicherten Prozedur tun würden, aber Sie können Tabellenvariablen aktualisieren.

So können Sie dies zum Beispiel nicht in Ihrer Funktion tun:

create table MyTable
(
    ID int,
    column1 varchar(100)
)
update [MyTable]
set column1='My value'

aber Sie können es:

declare @myTable table
(
    ID int,
    column1 varchar(100)
)

Update @myTable
set column1='My value'

4voto

Jonathan Magnan Punkte 10129

Ja können Sie.

Es erfordert jedoch SQL CLR mit EXTERNAL_ACCESS- oder UNSAFE-Berechtigung und die Angabe einer Verbindungszeichenfolge. Dies ist offensichtlich nicht empfohlen .

Zum Beispiel mit SQL.NET auswerten (eine SQL CLR, die es ermöglicht, C#-Syntax in SQL hinzuzufügen)

CREATE FUNCTION [dbo].[fn_modify_table_state]
    (
      @conn VARCHAR(8000) ,
      @sql VARCHAR(8000)
    )
RETURNS INT
AS
    BEGIN
        RETURN SQLNET::New('
using(var connection = new SqlConnection(conn))
{
    connection.Open();

    using(var command = new SqlCommand(sql, connection))
    {
        return command.ExecuteNonQuery();
    }
}
').ValueString('conn', @conn).ValueString('sql', @sql).EvalReadAccessInt()

    END

    GO

DECLARE @conn VARCHAR(8000) = 'Data Source=XPS8700;Initial Catalog=SqlServerEval_Debug;Integrated Security=True'
DECLARE @sql VARCHAR(8000) = 'UPDATE [Table_1] SET Value = -1 WHERE Name = ''zzz'''

DECLARE @rowAffecteds INT =  dbo.fn_modify_table_state(@conn, @sql)

Dokumentation: Ändern des Tabellenstatus innerhalb einer SQL-Funktion

Haftungsausschluss : Ich bin der Eigentümer des Projekts SQL.NET auswerten

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