48 votes

Insérer/Mettre à jour/Supprimer avec fonction dans SQL Server

Peut - on effectuer Insert/Update/Delete déclaration avec SQL Server Functions . J'ai essayé avec mais une erreur SQL Server s'est produite.

Erreur:

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

Quelqu'un a une idée pourquoi nous ne pouvons pas utiliser Insert/Update/Delete déclarations SQL Server functions.

En attente de vos bonnes idées

81voto

Mitch Wheat Points 169614

Non , vous ne pouvez pas.

À partir de la documentation en ligne de SQL Server :

Les fonctions définies par l'utilisateur ne peuvent pas être utilisées pour effectuer des actions qui modifient le état de la base de données.

Réf .

21voto

Anthony Faull Points 6490

Les fonctions dans SQL Server, comme dans les mathématiques, ne peuvent pas être utilisées pour modifier la base de données. Ils sont destinés à être en lecture seule et peuvent aider le développeur à implémenter la séparation commande-requête . En d'autres termes, poser une question ne doit pas changer la réponse. Lorsque votre programme doit modifier la base de données, utilisez plutôt une procédure stockée.

20voto

Yurii Tsurul Points 473

Oui, vous pouvez!))

Avis de non-responsabilité : ce n'est pas une solution, il s'agit plutôt d'un hack pour tester quelque chose. Les fonctions définies par l'utilisateur ne peuvent pas être utilisées pour effectuer des actions qui modifient l'état de la base de données.

J'ai trouvé un moyen de créer INSERT , UPDATE ou DELETE en fonction en utilisant xp_cmdshell .

Il vous suffit donc de remplacer le code dans la variable @sql.

 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

6voto

FistOfFury Points 630

Vous ne pouvez pas mettre à jour les tables à partir d'une fonction comme vous le feriez avec une procédure stockée, mais vous POUVEZ mettre à jour les variables de table.

Ainsi, par exemple, vous ne pouvez pas le faire dans votre fonction :

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

mais tu peux faire :

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

Update @myTable
set column1='My value'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X