J'essaie de supprimer une procédure stockée si elle existe, puis de la recréer, le tout à l'intérieur d'une transaction.SQL Server: impossible de supprimer et de créer un SP dans la transaction
BEGIN TRANSACTION
BEGIN TRY
IF OBJECT_ID(N'dbo.GET_DATA', N'P') IS NOT NULL
BEGIN
DROP PROCEDURE [dbo].[GET_DATA]
END
CREATE PROCEDURE [dbo].[GET_DATA]
@date datetime2
AS
SET NOCOUNT ON
BEGIN
SELECT
dbo.Products.product_cod AS 'product_cod',
dbo.Product_Types.name AS 'product_type_name',
dbo.UM.name AS 'um_name',
dbo.Products.category_id AS 'category_id',
dbo.Bins_Products.bin_id AS 'product_bin_id'
FROM dbo.Products
LEFT JOIN dbo.Product_Types on Products.product_type_id = Product_Types.product_type_id
LEFT JOIN dbo.UM on Products.um_id = UM.um_id
LEFT JOIN Bins_Products ON Bins_Products.product_id = Products.product_id
WHERE
Products.update_date >= @date
END
COMMIT TRANSACTION
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE() AS 'ErrorMessage'
ROLLBACK TRANSACTION
END CATCH
Quand je lance le script ci-dessus, je reçois les erreurs suivantes:
Msg 156, Level 15, State 1, Line 9
Incorrect syntax near the keyword 'PROCEDURE'.
Msg 137, Level 15, State 2, Line 31
Must declare the scalar variable "@date".
Et je squiggly lignes sur le SET et @date.
L'instruction IF et l'instruction create fonctionnent correctement toutes seules.
Il vous manque une instruction GO avant la procédure de création et vous ne pouvez pas utiliser try/catch block. –
'CREATE PROCEDURE' et' DROP PROCEDURE' ne peuvent pas être faits transactionnellement. Au lieu de cela, créez une procédure vide si elle n'existe pas encore ("CREATE PROCEDURE GET_DATA COMME BEGIN RETURN END"), puis "ALTER" inconditionnellement. –
@ DeanSavović J'ai essayé d'utiliser GO mais cela ne fait que créer d'autres erreurs. – dmdany07