none
Richtige Variablen deklarierung ? RRS feed

  • Frage

  • Hallo zusammen.

    Ich beschäftige mich erst seit kurzem mit dem Programmieren von SQL Replicationen und hab davon nicht sehr viel Ahnung ;) Jetzt habe durch den in den SQL Server integrierten Scriptgenerator ein Script generiert, welches einen Distributor erstellt.

    So weit so gut. Nun möchte ich, dass der Benutzer am Anfang des Scripts eine Variable (Server und DBName) einträgt und danach das Script durchläuft. Leider scheint dei Variable nach dem ersten exec bzw go "verloren" zu gehen... Wenn ich die Variable danach noch einmal benutze, kommt die Meldung das ich die Variable erst Deklarieren muss. Ich hoff ihr wisst was ich meine ;)

    Wie kann ich denn eine Variable erstellen, die durch das ganze Script "wirkt"?

    Hier ein Teil des Scripts, so wie ich es mir vorgestellt habe:

     

    /****** Scripting replication configuration. Script Date: 6/18/2010 9:49:31 AM ******/
    /****** Please Note: For security reasons, all password parameters were scripted with either NULL or an empty string. ******/
    
    /****** Begin: Script to be run at Publisher ******/
    
    /****** Installing the server as a Distributor. Script Date: 6/18/2010 9:49:31 AM ******/
    DECLARE @servername AS VARCHAR(30); -- Name des Datenbankservers
    DECLARE @datenbankname AS VARCHAR(30);		-- Name der Datenbank
    
    SET @servername = N'server0004';  -- Name of the Distributors
    SET @datenbankname = N'data0004'; -- Name of the Database
    
    use master
    exec sp_adddistributor @distributor = @Servername, @password = N''
    GO
    
    
    -- Adding the distribution databases
    use master
    exec sp_adddistributiondb @database = @datenbankname, @data_folder = N'E:\MSSQL\Data', @data_file = N'distribution.MDF', @data_file_size = 241, @log_folder = N'F:\MSSQL', @log_file = N'distribution.LDF', @log_file_size = 74, @min_distretention = 0, @max_distretention = 72, @history_retention = 48, @security_mode = 1
    GO
    
    -- Adding the distribution publishers
    exec sp_adddistpublisher @publisher = @servername, @distribution_db = N'distribution', @security_mode = 0, @login = N'sa', @password = N'', @working_directory = N'C:\Program Files\Microsoft SQL Server\MSSQL10.DEBAESRV16\MSSQL\ReplData', @trusted = N'false', @thirdparty_flag = 0, @publisher_type = N'MSSQLSERVER'
    GO
    
    exec sp_addsubscriber @subscriber = N'server0005', @type = 0, @description = N''
    GO
    exec sp_addsubscriber @subscriber = @servername, @type = 0, @description = N''
    GO
    
    
    /****** End: Script to be run at Publisher ******/
    Danke euch wieder einmal im Vorraus ;)
    Freitag, 18. Juni 2010 09:09

Antworten

  • Hallo Stefan86,

    Variablen sind nur innerhalb des Batches, in dem sie deklariert wurden, gültig. GO ist im Standard der Batchtrenner, d.h. danach ist die Variable nicht mehr gültig.
    Du musst also Dein Script so aufbauen, das es ohne GO auskommt, und beim Überfliegen des Scripte würde ich sagen, das sollte auch gehen.

    Da alles sich in der master DB abspielt, wird es reichen, einmalig USE [master] + GO zu verwenden, danach die Variablen zu deklarieren und dann die SP aufzurrufen.
    Alternative: Statt USE [master] kannst Du bei den SP den Datenbanknamen davor schreiben, z.B. EXEC master..sp_adddistributor ...

    Siehe auch:
    MSDN: http://msdn.microsoft.com/de-de/library/ms188927.aspx, dort nach Gültigkeitsbereich suchen.

     


    Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de
    Freitag, 18. Juni 2010 09:29