Avatar billede martin181 Nybegynder
01. august 2007 - 14:38 Der er 11 kommentarer og
2 løsninger

Problem med stored procedure, som skal opdatere i en anden db

Jeg sidder og bøvler med en stored procedure, som skal opdatere noget i vores webshop modul, når der sker ændringer i den oprindelige tabel.

Den data jeg skal have ind får jeg via et view, som jeg tidligere har oprettet i min database.

Mit view hedder: WWW_Varegruppe_view

Det er opgygget som følger:

GrouplanguageID - fast værdi på 1
Groupname - varchar
Groupnumber - varchar
GroupLargeImage - varchar
GroupDescription - varchar

her lige lavet en "create view" til nyt query window - det giver flg.:

USE [F0001]
GO
/****** Object:  View [dbo].[WWW_Varegruppe_view]    Script Date: 08/01/2007 14:19:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE VIEW [dbo].[WWW_Varegruppe_view]
AS
SELECT    44 AS GroupLanguageID, ISNULL
                          ((SELECT    TOP (1) Txt
                              FROM        dbo.Txt AS Txt_1
                              WHERE    (Lang = 45) AND (TxtTp = 145) AND (TxtNo = dbo.ProdCat.PrCatNo)), '') AS GroupName, PrCatNo AS GroupNumber, 1 AS GroupLargeImage,
                      ISNULL
                          ((SELECT    TOP (1) Txt
                              FROM        dbo.Txt AS Txt_1
                              WHERE    (Lang = 45) AND (TxtTp = 145) AND (TxtNo = dbo.ProdCat.PrCatNo)), '') AS GroupDescription
FROM        dbo.ProdCat

GO
EXEC sys.sp_addextendedproperty @name=N'MS_DiagramPane1', @value=N'[0E232FF0-B466-11cf-A24F-00AA00A3EFFF, 1.00]
Begin DesignProperties =
  Begin PaneConfigurations =
      Begin PaneConfiguration = 0
        NumPanes = 4
        Configuration = "(H (1[40] 4[20] 2[20] 3) )"
      End
      Begin PaneConfiguration = 1
        NumPanes = 3
        Configuration = "(H (1 [50] 4 [25] 3))"
      End
      Begin PaneConfiguration = 2
        NumPanes = 3
        Configuration = "(H (1 [50] 2 [25] 3))"
      End
      Begin PaneConfiguration = 3
        NumPanes = 3
        Configuration = "(H (4 [30] 2 [40] 3))"
      End
      Begin PaneConfiguration = 4
        NumPanes = 2
        Configuration = "(H (1 [56] 3))"
      End
      Begin PaneConfiguration = 5
        NumPanes = 2
        Configuration = "(H (2 [66] 3))"
      End
      Begin PaneConfiguration = 6
        NumPanes = 2
        Configuration = "(H (4 [50] 3))"
      End
      Begin PaneConfiguration = 7
        NumPanes = 1
        Configuration = "(V (3))"
      End
      Begin PaneConfiguration = 8
        NumPanes = 3
        Configuration = "(H (1[56] 4[18] 2) )"
      End
      Begin PaneConfiguration = 9
        NumPanes = 2
        Configuration = "(H (1 [75] 4))"
      End
      Begin PaneConfiguration = 10
        NumPanes = 2
        Configuration = "(H (1[66] 2) )"
      End
      Begin PaneConfiguration = 11
        NumPanes = 2
        Configuration = "(H (4 [60] 2))"
      End
      Begin PaneConfiguration = 12
        NumPanes = 1
        Configuration = "(H (1) )"
      End
      Begin PaneConfiguration = 13
        NumPanes = 1
        Configuration = "(V (4))"
      End
      Begin PaneConfiguration = 14
        NumPanes = 1
        Configuration = "(V (2))"
      End
      ActivePaneConfig = 0
  End
  Begin DiagramPane =
      Begin Origin =
        Top = 0
        Left = 0
      End
      Begin Tables =
        Begin Table = "ProdCat"
            Begin Extent =
              Top = 6
              Left = 227
              Bottom = 114
              Right = 378
            End
            DisplayFlags = 280
            TopColumn = 0
        End
      End
  End
  Begin SQLPane =
  End
  Begin DataPane =
      Begin ParameterDefaults = ""
      End
      Begin ColumnWidths = 9
        Width = 284
        Width = 1500
        Width = 1500
        Width = 1500
        Width = 1500
        Width = 1500
        Width = 1500
        Width = 1500
        Width = 1500
      End
  End
  Begin CriteriaPane =
      Begin ColumnWidths = 11
        Column = 7815
        Alias = 2730
        Table = 1170
        Output = 720
        Append = 1400
        NewValue = 1170
        SortType = 1350
        SortOrder = 1410
        GroupBy = 1350
        Filter = 1350
        Or = 1350
        Or = 1350
        Or = 1350
      End
  End
End
' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'VIEW',@level1name=N'WWW_Varegruppe_view'



GO
EXEC sys.sp_addextendedproperty @name=N'MS_DiagramPaneCount', @value=1 , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'VIEW',@level1name=N'WWW_Varegruppe_view'

Min stored procedure ser således ud:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        Martin Christoffersen
-- Create date: 31072007
-- Description:    Til import af varegrupper til DynamicWeb
-- =============================================
ALTER PROCEDURE [dbo].[WWW_Varegruppe_SP]
    -- Add the parameters for the stored procedure here
    @PrCatNo int = 0
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here

    -- hvis gruppen allerede er oprettet
If exists (select * from [dynamicweb].[dbo].[EcomGroups] Where GroupNumber = @PrCatNo)
    begin
        Declare @GroupLanguageID nvarchar
        Declare @Groupname nvarchar
        Declare @GroupNumber nvarchar
        Declare @GroupLargeImage nvarchar
        Declare @GroupDescription nvarchar

    Select @GroupLanguageID = GroupLanguageID from [F0001].[dbo].[WWW_Varegruppe_view] where GroupNumber = @PrCatNo
    Select @GroupName = GroupName from [F0001].[dbo].[WWW_Varegruppe_view] where GroupNumber = @PrCatNo
    Select @GroupNumber = GroupNumber from [F0001].[dbo].[WWW_Varegruppe_view] where GroupNumber = @PrCatNo
    Select @GroupLargeImage = GroupLargeImage from [F0001].[dbo].[WWW_Varegruppe_view] where GroupNumber = @PrCatNo
    Select @GroupDescription = GroupDescription from [F0001].[dbo].[WWW_Varegruppe_view] where GroupNumber = @PrCatNo

    UPDATE [dynamicweb].[dbo].[EcomGroups]
    set GrouplanguageID = @GroupLanguageID,
    GroupName = @GroupName,
    GroupLargeImage = @GroupLargeImage,
    GroupDescription = @GroupDescription
    Where Groupnumber = @PrCatNo

    end

else
    -- hvis gruppen ikke er oprettet
    begin
    Declare @HighID nVarChar

   
    -- find nuværende højeste GroupID
    select top(1) @HighID = GroupID from [dynamicweb].[dbo].[EcomGroups] Order by GroupID desc
    -- Sæt variablen @HighID til en højere end den fundne, for at få nyt unikt ID   
    set @HighID = @HighID + 1
       
        Select @GroupLanguageID = GroupLanguageID from [F0001].[dbo].[WWW_Varegruppe_view] where GroupNumber = @PrCatNo
        Select @GroupName = GroupName from [F0001].[dbo].[WWW_Varegruppe_view] where GroupNumber = @PrCatNo
        Select @GroupNumber = GroupNumber from [F0001].[dbo].[WWW_Varegruppe_view] where GroupNumber = @PrCatNo
        Select @GroupLargeImage = GroupLargeImage from [F0001].[dbo].[WWW_Varegruppe_view] where GroupNumber = @PrCatNo
        Select @GroupDescription = GroupDescription from [F0001].[dbo].[WWW_Varegruppe_view] where GroupNumber = @PrCatNo

    -- Insert into dbo.dynamicweb.EcomGroups (GroupID, GroupLanguageID, GroupName, GroupNumber, GroupLargeImage, GroupDescription) Values (@HighID, @GroupLanguageID, @GroupName, @GroupNumber, @GroupLargeImage, @GroupDescription)

INSERT INTO [dynamicweb].[dbo].[EcomGroups]
          ([GroupID]
          ,[GroupLanguageID]
          ,[GroupName]
          ,[GroupNumber]
          ,[GroupLargeImage]
          ,[GroupDescription]
          )
    VALUES
          (@HighID
          ,@GroupLanguageID
          ,@GroupName
          ,@GroupNumber
          ,@GroupLargeImage
          ,@GroupDescription
          )


    end

END

Min tabel i databasen Dynamicweb, som hedder EcomGroups ser således ud:

GroupID - nvarchar
GroupLanguageID - nvarchar
GroupName - nvarchar
GroupNumber - nvarchar
GroupPageIDRel - int
GroupParagraphIDRel - int
GroupSmallImage -nvarchar
GroupDescription - nvarchar
GroupAssortment - bit
GroupIcon - nvarchar

Jeg har indsat min stored procedure i en trigger, så jeg er sikker på at den bliver kørt, når der sker ændringer.

Mit problem er at jeg får fejl, når jeg kører den.

er der nogle af jer derude, som kan gennemskue fejlen?

Fejlmeldingerne kan ses her:

<center>
<a href="http://i160.photobucket.com/albums/t190/vb-fan/diverse/fejl2.jpg" target="_blank">
<img src="http://i160.photobucket.com/albums/t190/vb-fan/diverse/th_fejl2.jpg"></a>
<a href="http://i160.photobucket.com/albums/t190/vb-fan/diverse/fejl1.jpg" target="_blank">
<img src="http://i160.photobucket.com/albums/t190/vb-fan/diverse/th_fejl1.jpg"></a>
</center>
Avatar billede martin181 Nybegynder
01. august 2007 - 14:40 #1
Beklager den megen kode - men tænkte at det var den bedste måde at vise sammenhængen på.

Skal der bruges yderligere oplysninger, så giv endelig besked om dette.

Og fejl1 kommer før fejl 2, selv om det måske kan se anderledes ud, den måde jeg har indsat billederne - beklager.
Avatar billede teepee Nybegynder
01. august 2007 - 15:14 #2
Har du kigget på indholdet af [dynamicweb].[dbo].[EcomGroups].groupId?
er du sikker på at det er en integer?
Avatar billede martin181 Nybegynder
01. august 2007 - 15:21 #3
Ja, som jeg skrev højere oppe:
GroupID - nvarchar
- så nej, det er ikke en Integer...

Skulle måske lige uddybe at min fejl fremkommer, når jeg retter i min eksisterende data - ikke ved indsættelse af nyt - så min:
If exists (select * from [dynamicweb].[dbo].[EcomGroups] Where GroupNumber = @PrCatNo)
burde returnere SANDT og gå videre...
Avatar billede teepee Nybegynder
01. august 2007 - 16:01 #4
men du selecter  top (1) groupid ind i highid og lægger en til (+1) ?
Avatar billede martin181 Nybegynder
02. august 2007 - 14:43 #5
nu er jeg nået lidt videre... og har ændret min stored procedure til flg.:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        Martin Christoffersen
-- Create date: 31072007
-- Description:    Til import af varegrupper til DynamicWeb
-- =============================================
ALTER PROCEDURE [dbo].[WWW_Varegruppe_SP]
    -- Add the parameters for the stored procedure here
        @PrCatNo int
AS
BEGIN
        Declare @GroupLanguageID nvarchar
        Declare @Groupname nvarchar
        Declare @GroupNumber nvarchar
        Declare @GroupLargeImage nvarchar
        Declare @GroupDescription nvarchar
        Declare @GroupID nvarchar

    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here

    -- hvis gruppen allerede er oprettet
If exists (select * from [dynamicweb].[dbo].[EcomGroups] Where GroupNumber = @PrCatNo)
    begin
           
    Select @GroupLanguageID = GroupLanguageID from [F0001].[dbo].[WWW_Varegruppe_view] where GroupNumber = @PrCatNo
    Select @GroupName = GroupName from [F0001].[dbo].[WWW_Varegruppe_view] where GroupNumber = @PrCatNo
    Select @GroupNumber = GroupNumber from [F0001].[dbo].[WWW_Varegruppe_view] where GroupNumber = @PrCatNo
    Select @GroupLargeImage = GroupLargeImage from [F0001].[dbo].[WWW_Varegruppe_view] where GroupNumber = @PrCatNo
    Select @GroupDescription = GroupDescription from [F0001].[dbo].[WWW_Varegruppe_view] where GroupNumber = @PrCatNo

    UPDATE [dynamicweb].[dbo].[EcomGroups]
    set
    GrouplanguageID = @GroupLanguageID,
    GroupName = @GroupName,
    GroupLargeImage = @GroupLargeImage,
    GroupDescription = @GroupDescription
    Where Groupnumber = @PrCatNo

    end

else
    -- hvis gruppen ikke er oprettet
    begin
   
        Select @GroupID = GroupNumber from [F0001].[dbo].[WWW_Varegruppe_view] where GroupNumber = @PrCatNo
        Select @GroupLanguageID = GroupLanguageID from [F0001].[dbo].[WWW_Varegruppe_view] where GroupNumber = @PrCatNo
        Select @GroupName = GroupName from [F0001].[dbo].[WWW_Varegruppe_view] where GroupNumber = @PrCatNo
        Select @GroupNumber = GroupNumber from [F0001].[dbo].[WWW_Varegruppe_view] where GroupNumber = @PrCatNo
        Select @GroupLargeImage = GroupLargeImage from [F0001].[dbo].[WWW_Varegruppe_view] where GroupNumber = @PrCatNo
        Select @GroupDescription = GroupDescription from [F0001].[dbo].[WWW_Varegruppe_view] where GroupNumber = @PrCatNo

    -- Insert into dbo.dynamicweb.EcomGroups (GroupID, GroupLanguageID, GroupName, GroupNumber, GroupLargeImage, GroupDescription) Values (@HighID, @GroupLanguageID, @GroupName, @GroupNumber, @GroupLargeImage, @GroupDescription)

INSERT INTO [dynamicweb].[dbo].[EcomGroups]
          ([GroupID]
          ,[GroupLanguageID]
          ,[GroupName]
          ,[GroupNumber]
          ,[GroupPageIDRel]
          ,[GroupParagraphIDRel]
          ,[GroupSmallImage]
          ,[GroupLargeImage]
          ,[GroupDescription]
          ,[GroupIcon]
          )
    VALUES
          (@GroupID
          ,@GroupLanguageID
          ,@GroupName
          ,@GroupNumber
          ,1
          ,1
          ,1
          ,@GroupLargeImage
          ,@GroupDescription
          ,1
          )


    end

END

men jeg får stadig en fejl, når jeg kalder den fra min trigger - fejlen kan ses herunder:
http://i160.photobucket.com/albums/t190/vb-fan/diverse/fejl1-1.jpg

nogle gode ideer?
Avatar billede martin181 Nybegynder
02. august 2007 - 15:16 #6
som jeg lige ser det, så ligger fejlen ikke i min trigger, som kalder den stored procedure - men koden til denne er lige her alligevel...

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        Martin Christoffersen
-- Create date: 01-08-2007
-- Description:    Trigger, som skal udføres, når der ndres i tabellen ProdCat
-- =============================================
ALTER TRIGGER [dbo].[ProdCatTrigger]
  ON  [dbo].[ProdCat]
  AFTER INSERT,DELETE,UPDATE
AS
BEGIN
    DECLARE @PrCatNo int
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for trigger here
    select @PrCatNo = PrCatNo from inserted   

    exec WWW_Varegruppe_SP @PrCatNo
END
Avatar billede teepee Nybegynder
02. august 2007 - 15:56 #7
Ja, den er straks værrere. Hvorfor selecter du forskellige værdier ud i variable fra same række én ad gangen? Det giver da et frygteligt overhead.
SELECT @p1=xxx, @p2=yyy, @p3=zzz FROM...
Avatar billede martin181 Nybegynder
03. august 2007 - 09:36 #8
SELECT @p1=xxx, @p2=yyy, @p3=zzz FROM...

tror jeg opbyggede det hen ad vejen, men vil da lige ændre det efter din ide...
Avatar billede martin181 Nybegynder
03. august 2007 - 09:42 #9
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        Martin Christoffersen
-- Create date: 31072007
-- Description:    Til import af varegrupper til DynamicWeb
-- =============================================
ALTER PROCEDURE [dbo].[WWW_Varegruppe_SP]
    -- Add the parameters for the stored procedure here
        @PrCatNo int
AS
BEGIN
        Declare @GroupLanguageID nvarchar
        Declare @Groupname nvarchar
        Declare @GroupNumber nvarchar
        Declare @GroupLargeImage nvarchar
        Declare @GroupDescription nvarchar
        Declare @GroupID nvarchar

    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here

    -- hvis gruppen allerede er oprettet
If exists (select * from [dynamicweb].[dbo].[EcomGroups] Where GroupNumber = @PrCatNo)
    begin
           
    Select @GroupLanguageID = GroupLanguageID, @GroupName = GroupName, @GroupNumber = GroupNumber, @GroupLargeImage = GroupLargeImage, @GroupDescription = GroupDescription from [F0001].[dbo].[WWW_Varegruppe_view] where GroupNumber = @PrCatNo

    UPDATE [dynamicweb].[dbo].[EcomGroups]
    set
    GrouplanguageID = @GroupLanguageID,
    GroupName = @GroupName,
    GroupLargeImage = @GroupLargeImage,
    GroupDescription = @GroupDescription
    Where Groupnumber = @PrCatNo

    end

else
    -- hvis gruppen ikke er oprettet
    begin
   
        Select @GroupID = GroupNumber, @GroupLanguageID = GroupLanguageID, @GroupName = GroupName, @GroupNumber = GroupNumber, @GroupLargeImage = GroupLargeImage, @GroupDescription = GroupDescription from [F0001].[dbo].[WWW_Varegruppe_view] where GroupNumber = @PrCatNo

    -- Insert into dbo.dynamicweb.EcomGroups (GroupID, GroupLanguageID, GroupName, GroupNumber, GroupLargeImage, GroupDescription) Values (@HighID, @GroupLanguageID, @GroupName, @GroupNumber, @GroupLargeImage, @GroupDescription)

INSERT INTO [dynamicweb].[dbo].[EcomGroups]
          ([GroupID]
          ,[GroupLanguageID]
          ,[GroupName]
          ,[GroupNumber]
          ,[GroupPageIDRel]
          ,[GroupParagraphIDRel]
          ,[GroupSmallImage]
          ,[GroupLargeImage]
          ,[GroupDescription]
          ,[GroupIcon]
          )
    VALUES
          (@GroupID
          ,@GroupLanguageID
          ,@GroupName
          ,@GroupNumber
          ,1
          ,1
          ,1
          ,@GroupLargeImage
          ,@GroupDescription
          ,1
          )


    end

END
Avatar billede teepee Nybegynder
03. august 2007 - 10:41 #10
Fandt du ud af den sidste fejl? Det er vist noget man får når man laver en afrunding via datatyperne,, f.eks ved at smide en float ind i en number...
Avatar billede martin181 Nybegynder
03. august 2007 - 11:03 #11
ja, det sidder jeg og roder med lige pt... fandt også ud af at det var der, der var noget rod...
Avatar billede martin181 Nybegynder
06. august 2007 - 10:00 #12
jeg fik det løst - fik lidt hjælp fra dig - så du får nogle af pointene
Avatar billede martin181 Nybegynder
06. august 2007 - 10:00 #13
svar til at dele pointene
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