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

0voto

Aissa Saoudi Punkte 9

Funktionen sind nicht dazu gedacht, auf diese Weise verwendet zu werden. Wenn Sie Daten ändern möchten, können Sie dafür einfach eine Stored Proc erstellen.

-1voto

AnilaK Punkte 9

Wenn Sie das Löschen/Einfügen/Aktualisieren ausführen müssen, können Sie auch dynamische Anweisungen ausführen, d. h.:

declare 
    @v_dynDelete                 NVARCHAR(500);

 SET @v_dynDelete = 'DELETE some_table;'; 
 EXEC @v_dynDelete

-1voto

Vinicius Punkte 1467

Nur eine weitere Alternative mit sp_executesql (nur getestet in SQL 2016 ). Wie bereits in früheren Beiträgen festgestellt wurde, muss die Atomizität an anderer Stelle behandelt werden.

CREATE FUNCTION [dbo].[fn_get_service_version_checksum2]
(
    @ServiceId INT
)
RETURNS INT
AS
BEGIN
DECLARE @Checksum INT;
SELECT @Checksum = dbo.fn_get_service_version(@ServiceId);
DECLARE @LatestVersion INT = (SELECT MAX(ServiceVersion) FROM [ServiceVersion] WHERE ServiceId = @ServiceId);
-- Check whether the current version already exists and that it's the latest version.
IF EXISTS(SELECT TOP 1 1 FROM [ServiceVersion] WHERE ServiceId = @ServiceId AND [Checksum] = @Checksum AND ServiceVersion = @LatestVersion)
    RETURN @LatestVersion;
-- Insert the new version to the table.
EXEC sp_executesql N'
INSERT INTO [ServiceVersion] (ServiceId, ServiceVersion, [Checksum], [Timestamp])
VALUES (@ServiceId, @LatestVersion + 1, @Checksum, GETUTCDATE());',
N'@ServiceId INT = NULL, @LatestVersion INT = NULL, @Checksum INT = NULL',
@ServiceId = @ServiceId,
@LatestVersion = @LatestVersion,
@Checksum = @Checksum
;
RETURN @LatestVersion + 1;
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