Avatar billede roadrunr Nybegynder
12. november 2002 - 09:42 Der er 7 kommentarer og
1 løsning

Kopiering af stored procedure

Hvordan kan jeg kopiere en stored procedure mellem 2 databaser. Kopieringen skal forgå via et script, som jeg f.eks. kan kalde fra en 3. stored procedure. el.lign.
Avatar billede misbruger Nybegynder
12. november 2002 - 10:02 #1
Kan du ikke bare åbne den i Enterprise manager, og lave en god gammeldags cut'n'paste
Avatar billede roadrunr Nybegynder
12. november 2002 - 10:04 #2
Da problemet skal løses via et script, så er dette bestemt ikke en løsning. Jeg skal nemlig have mulig for, at kalde scriptet fra en anden applikation.
Avatar billede kichian Nybegynder
12. november 2002 - 10:41 #3
Indholdet af dine SP ligger i syscomments. Det store problem er hvis din SP er større end nvarchar(4000). Så er den nemlig fordelt over flere rækker.
Jeg løste problemet ved at udlæse og samle teksten i en ASP-applikation.
Avatar billede roadrunr Nybegynder
12. november 2002 - 10:54 #4
Hehe.. jeg have netop også lige fundet frem til syscomments. Lige nu har jeg problemer med at finde ud af hvordan jeg opretter den vha. den kode, som jeg har udlæst. Kan det gøres vha.:

Conn.Execute("CREATE PROCEDURE " & strSpcode)

Eller hvordan?
Avatar billede kichian Nybegynder
12. november 2002 - 11:04 #5
Du skal finde dine SP i sysobjects. Ud fra id kan du så finde teksten i syscomments. Bemærk at colid angiver rækkefølgen hvis en SP fylder mere end 1 række.
Og du behøver ikke selv CREATE PROCEDURE.
Det er bare Conn.Execute(strSpcode)

Du må meget gerne poste noget kode når du er færdig :-)
Avatar billede roadrunr Nybegynder
12. november 2002 - 13:23 #6
kichian: Tusing tak for hjælpen. Jeg har søgt nettet tyndt i 3 dage for en finde hjælp til at løse opgaven. Men alle steder blev der forslået én eller anden form for benyttelse af DTS eller manuelt via EM. Så der virkelig med stor lettelse, at jeg i dag kan komme videre i "opgavelisten".

/Martin
Avatar billede bennytordrup Nybegynder
14. november 2002 - 08:38 #7
Jeg faldt over følgende på nettet, som så vidt jeg kan se skulle løse problemet:

<SQL>
USE master
GO
IF EXISTS (SELECT 1 FROM dbo.sysobjects WHERE name = 'sp_CopyStoredprocedure')
  DROP PROCEDURE sp_CopyStoredprocedure
GO
CREATE PROCEDURE dbo.sp_CopyStoredprocedure
  (
  @procedure sysname
  ,@sourceDb  sysname
  ,@targetdb  sysname
  )
AS
/*******************************************************************************

  Written By  : Simon Sabin
  Date        : 25 October 2002
  Description : Copies a stored procedure from one database to another
              :
  History
  Date      Change
  ------------------------------------------------------------------------------
  25/10/2002 Created
*******************************************************************************/

DECLARE @lines int
DECLARE @line int
DECLARE @vline varchar(4)
DECLARE @objectid varchar(10)

DECLARE @DECLARE varchar(8000)
DECLARE @SELECT  varchar(8000)
DECLARE @EXECUTE varchar(8000)
DECLARE @PRINT  varchar(8000)
DECLARE @SQL    nvarchar(4000)

SET @SQL = 'USE ' + @sourcedb + '
SELECT @objectid = id, @lines = count(*)
  FROM ' + @sourcedb + '.dbo.syscomments
WHERE id = object_id(@procedure)
GROUP BY id'

EXEC sp_executesql @SQL, N'@objectid int OUTPUT, @lines int OUTPUT, @procedure sysname', @objectid OUTPUT, @lines OUTPUT, @procedure
SELECT @objectid , @lines , @procedure, @SQL

SET @DECLARE = ''
SET @SELECT  = ''
SET @EXECUTE = ''
SET @PRINT  = ''

SET @line = 0
WHILE @line <= @lines
  BEGIN
    SET @vline = @line
    SET @DECLARE = @DECLARE + char(10) + 'DECLARE @line' + @vline + ' nvarchar(4000)'
    SET @SELECT  = @SELECT  + char(10) + 'SELECT  @line' + @vline + ' = text FROM ' + @sourcedb + '.dbo.syscomments WHERE colid = ' + @vline + ' AND id = ' + @objectid
    SET @EXECUTE = @EXECUTE + '+ @line' + @vline

    SET @PRINT  = @PRINT  + char(10) + 'PRINT @line' + @vline
 
    SET @line = @line + 1 
  END

SET @DECLARE = @DECLARE + CHAR(10)
SET @SELECT  = @SELECT  + CHAR(10)
SET @EXECUTE = 'USE ' + @targetDb + char(10) + 'EXECUTE (''''' + @EXECUTE + ')'

SET @SQL = 'IF EXISTS (SELECT 1 FROM ' + @targetDB + '.dbo.sysobjects WHERE name = @procedure )
  DROP PROCEDURE ' + @procedure
exec sp_executesql @SQL, N'@procedure sysname ', @procedure

PRINT @DECLARE
PRINT @SELECT
PRINT @EXECUTE
PRINT @PRINT
EXECUTE (@DECLARE + @SELECT + @EXECUTE + @PRINT)

GO
</SQL>
Avatar billede roadrunr Nybegynder
14. november 2002 - 08:49 #8
benny.tordrup: tak for den alternative løsning, den vil jeg lige kigge mere på.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester