Ich muss ein Bereitstellungsskript schreiben, das funktioniert, wenn eine gespeicherte Prozedur vorhanden ist oder nicht. dh wenn es existiert, muss ich es ändern, sonst erstelle ich es.
Wie kann ich das in der SQL tun.
Ich verwende SQL Server 2005
Ich muss ein Bereitstellungsskript schreiben, das funktioniert, wenn eine gespeicherte Prozedur vorhanden ist oder nicht. dh wenn es existiert, muss ich es ändern, sonst erstelle ich es.
Wie kann ich das in der SQL tun.
Ich verwende SQL Server 2005
Antworten:
Wenn Sie die Prozedur fallen lassen und erstellen, verlieren Sie die Sicherheitseinstellungen. Dies kann Ihren DBA stören oder Ihre Anwendung insgesamt beschädigen.
Ich erstelle eine triviale gespeicherte Prozedur, wenn sie noch nicht existiert. Danach können Sie die gespeicherte Prozedur nach Ihren Wünschen ÄNDERN.
IF object_id('YourSp') IS NULL
EXEC ('create procedure dbo.YourSp as select 1')
GO
ALTER PROCEDURE dbo.YourSp
AS
...
Auf diese Weise überleben Sicherheitseinstellungen, Kommentare und andere Meta-Details die Bereitstellung.
if object_id('YourSp') is null BEGIN ... END, um die richtigen Berechtigungen nach dem Erstellen der gespeicherten Prozedur hinzuzufügen.
Am saubersten ist es, die Existenz zu testen, sie zu löschen, falls vorhanden, und sie dann neu zu erstellen. Sie können eine "create proc" -Anweisung nicht in eine IF-Anweisung einbetten. Das sollte gut gehen:
IF OBJECT_ID('MySproc', 'P') IS NOT NULL
DROP PROC MySproc
GO
CREATE PROC MySproc
AS
BEGIN
...
END
Wenn Sie nur mit gespeicherten Prozeduren arbeiten, ist es am einfachsten, den Prozess wahrscheinlich zu löschen und dann neu zu erstellen. Sie können den gesamten Code dazu mithilfe des Assistenten zum Generieren von Skripten in SQL Server generieren.
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[YourSproc]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[YourSproc]
CREATE PROCEDURE YourSproc...
if not exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[xxx]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
BEGIN
CREATE PROCEDURE dbo.xxx
Wo xxxist der Proc-Name?
Zusätzlich zu dem, was bereits gesagt wurde, möchte ich auch einen anderen Ansatz hinzufügen und die Verwendung einer differenziellen Skriptbereitstellungsstrategie befürworten. Anstatt ein statusbehaftetes Skript zu erstellen, das immer den aktuellen Status überprüft und basierend auf diesem Status handelt, stellen Sie es über eine Reihe zustandsloser Skripts bereit, die von bekannten Versionen aktualisiert werden . Ich habe diese Strategie angewendet und sie zahlt sich aus, da meine Bereitstellungsskripte jetzt alle "IF" -frei sind.
Sie können eine Abfrage wie folgt schreiben:
IF OBJECT_ID('ProcedureName','P') IS NOT NULL
DROP PROC ProcedureName
GO
CREATE PROCEDURE [dbo].[ProcedureName]
...your query here....
Um die obige Syntax genauer zu beschreiben:
OBJECT_ID ist eine eindeutige ID-Nummer für ein Objekt in der Datenbank, die intern von SQL Server verwendet wird. Da wir ProcedureName gefolgt von Ihrem Objekttyp P übergeben , teilt dies dem SQL Server mit, dass Sie das Objekt ProcedureName finden sollen, das vom Typ procedure ist, dh P.
Diese Abfrage findet die Prozedur und wenn sie verfügbar ist, wird sie gelöscht und eine neue erstellt.
Ausführliche Informationen zu OBJECT_ID und Objekttypen finden Sie unter: SYS.Objects
IF OBJECT_ID('SPNAME') IS NULL
-- Does Not Exists
ELSE
-- Exists
Ich habe einen gespeicherten Prozess, mit dem der Kunde die Validierung erweitern kann. Wenn er vorhanden ist, möchte ich ihn nicht ändern. Wenn er nicht erstellt werden soll, habe ich den besten Weg gefunden:
IF OBJECT_ID('ValidateRequestPost') IS NULL
BEGIN
EXEC ('CREATE PROCEDURE ValidateRequestPost
@RequestNo VARCHAR(30),
@ErrorStates VARCHAR(255) OUTPUT
AS
BEGIN
SELECT @ErrorStates = @ErrorStates
END')
END
Der folgende Code prüft, ob die gespeicherte Prozedur bereits vorhanden ist oder nicht.
Wenn es existiert, ändert es sich, wenn es nicht existiert, erstellt es eine neue gespeicherte Prozedur für Sie:
//syntax for Create and Alter Proc
DECLARE @Create NVARCHAR(200) = 'Create PROCEDURE sp_cp_test';
DECLARE @Alter NVARCHAR(200) ='Alter PROCEDURE sp_cp_test';
//Actual Procedure
DECLARE @Proc NVARCHAR(200)= ' AS BEGIN select ''sh'' END';
//Checking For Sp
IF EXISTS (SELECT *
FROM sysobjects
WHERE id = Object_id('[dbo].[sp_cp_test]')
AND Objectproperty(id, 'IsProcedure') = 1
AND xtype = 'p'
AND NAME = 'sp_cp_test')
BEGIN
SET @Proc=@Alter + @Proc
EXEC (@proc)
END
ELSE
BEGIN
SET @Proc=@Create + @Proc
EXEC (@proc)
END
go