Ich versuche eine gespeicherte Prozedur löschen, wenn es existiert, und erstellen Sie es dann, alles innerhalb einer Transaktion.SQL Server: Kann nicht abfallen und erstellen SP in Transaktion
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
Als ich das Drehbuch oben laufen lasse, erhalte ich folgende Fehler:
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".
Und ich habe verschnörkelte Linien auf der SET und @date.
Die IF-Anweisung und die create-Anweisung funktionieren alle von selbst.
Sie fehlen eine GO-Anweisung vor der Erstellungsprozedur, und Sie können try/catch-Block nicht verwenden. –
'CREATE PROCEDURE' und' DROP PROCEDURE' können nicht transaktional durchgeführt werden. Erstellen Sie stattdessen eine leere Prozedur, wenn sie noch nicht existiert ("CREATE PROCEDURE GET_DATA AS BEGIN RETURN END"), dann bedingungslos "ALTER". –
@ DeanSavović Ich habe versucht, mit GO, aber das schafft nur andere Fehler. – dmdany07