Avatar billede morten-hbm Nybegynder
13. december 2010 - 16:07 Der er 10 kommentarer og
1 løsning

Problemer med Stored Procedure i MSSQL

Jeg har problemer med noget stored procedure lige for tiden.

Jeg har følgende SP:
------------------------
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[SP_AddGroup]
@fromdate nvarchar(50)='',
@fromtime nvarchar(50)='',
@todate nvarchar(50)='',
@totime nvarchar(50)='',
@gruppenavn nvarchar(50)='',
@GruppeNr nvarchar(50)='',
@niveau int=0
AS
BEGIN
    IF((SELECT COUNT(*) FROM Gruppe WHERE fromdate = @fromdate AND fromtime = @fromtime AND todate = @todate AND @totime = totime AND gruppenavn = @gruppenavn) > 0)
    begin
        INSERT INTO Gruppe (FromDate, FromTime, ToDate, ToTime, Gruppenavn, GruppeNr, Niveau)
        VALUES (@fromdate, @fromtime, @todate, @totime, @gruppenavn, @GruppeNr, @niveau)
    end
END
begin
    SELECT Gruppe_id FROM Gruppe WHERE fromdate = @fromdate AND fromtime = @fromtime AND todate = @todate AND @totime = totime AND gruppenavn = @gruppenavn
end
--------------------------

Men når jeg kører:
-------------------------
EXEC    [dbo].[SP_AddGroup]
        @fromdate = 'q',
        @fromtime = 'q',
        @todate = 'q',
        @totime = 'q',
        @gruppenavn = 'q',
        @GruppeNr = '1',
        @niveau = 1
-----------------------

Får jeg følgende fejl
Msg 8144, Level 16, State 2, Procedure sp_addgroup, Line 0
Procedure or function sp_addgroup has too many arguments specified.

Tabellen ser sådan ud:
----------------------
USE [Dansupport]
GO
/****** Object:  Table [dbo].[Gruppe]    Script Date: 12/13/2010 16:03:56 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Gruppe](
    [Gruppe_id] [int] IDENTITY(1,1) NOT NULL,
    [Fromdate] [nvarchar](50) COLLATE Danish_Norwegian_CI_AS NOT NULL,
    [Fromtime] [nvarchar](50) COLLATE Danish_Norwegian_CI_AS NOT NULL,
    [Todate] [nvarchar](50) COLLATE Danish_Norwegian_CI_AS NOT NULL,
    [Totime] [nvarchar](50) COLLATE Danish_Norwegian_CI_AS NOT NULL,
    [Gruppenavn] [nvarchar](50) COLLATE Danish_Norwegian_CI_AS NOT NULL,
    [GruppeNr] [nvarchar](50) COLLATE Danish_Norwegian_CI_AS NOT NULL,
    [Niveau] [int] NOT NULL,
CONSTRAINT [PK_Gruppe] PRIMARY KEY CLUSTERED
(
    [Gruppe_id] ASC
)WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
---------------------------

Håber der er en venlig sjæl der kan hjælpe mig
Avatar billede Syska Mester
13. december 2010 - 19:56 #1
Den brokker sig over din signatur på din SP ... men kan ikke lige gennenskue det.

Kan du prøve at fjerne default values from din SP ?

Bare mig elelr er der ikke også rod i din SP ?


BEGIN ved start af SP
BEGIN ved if
END IF
END SP
BEGIN some select
END some select

burde den ikke se ud som:
BEGIN ved start af SP
BEGIN ved if
END IF
BEGIN some select
END some select
END SP

mvh
Avatar billede bkp Nybegynder
14. december 2010 - 06:33 #2
Hvad skal den ekstra Begin End?
Jeg tror hvis du fjerner de 2 linier fra din procedurer og først slutter din procedurer af med en enkelt end i slutningen, at det måske virker.
;-)
Avatar billede Syska Mester
14. december 2010 - 10:29 #3
Som skrevet overfor, så er jeg enig.

Jeg tror han vil udvælge det han lige har indsat ... dvs han auto incremental id ...

men det ville jeg nok gøre som:

SELECT SCOPE_IDENTITY();
Avatar billede bkp Nybegynder
14. december 2010 - 10:43 #4
Ja og det ser ud til at dato, tid og GruppeNr er strenge, det er ikke optimalt, med mindre der er en gyldig grund til dette.

Dette er dog ikke grunden til fejlen, men mere bad practice :-)
Avatar billede morten-hbm Nybegynder
14. december 2010 - 11:04 #5
Tak for jeres svar, jeg vil senere i dag kigge på det og vende tilbage om det er fejlen. Ang. det med dato og tid, så ved jeg godt at det skal være datetime format, var bare lige den nemmeste måde i første omgang, indtil at jeg fik løsningen til at virke :)

GruppeNr er en streng af den grund, at formatet f.eks. er '\2\233\'

Men regner med at vende tilbage kl. 14 med svar på det.
Avatar billede morten-hbm Nybegynder
14. december 2010 - 11:07 #6
Og ja, jeg vil gerne have det jeg lige har tilføjet ud. Men hvis den i forvejen findes, så skal jeg jo have dens id ud. Id'et er incremental.

Derfor jeg har valgt denne løsning, om der findes en anden og bedre løsning ved jeg ikke, men sig det gerne hvis det er :-)
Avatar billede Syska Mester
14. december 2010 - 11:11 #7
Hvis du laver en insert, så burde du bruge SCOPE_INDENTITY eller er den anden måde vel fin nok.

mvh
Avatar billede morten-hbm Nybegynder
14. december 2010 - 13:35 #8
Okay, jeg fandt ud af, at når jeg kaldte min SP, så var det ikke min SP der blev kaldt, men sys.sp_addgroup, som mssql selv har liggende.

Derefter, så ser min SP nu således ud:
-------------
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[SP_DSAddGroup]
@fromdate nvarchar(50),
@fromtime nvarchar(50),
@todate nvarchar(50),
@totime nvarchar(50),
@gruppenavn nvarchar(50),
@GruppeNr nvarchar(50),
@niveau int=0
AS

BEGIN
    IF((SELECT COUNT(*) FROM Gruppe WHERE fromdate = @fromdate AND fromtime = @fromtime AND todate = @todate AND @totime = totime AND gruppenavn = @gruppenavn) = 0)
    BEGIN
        INSERT INTO Gruppe (FromDate, FromTime, ToDate, ToTime, Gruppenavn, GruppeNr, Niveau)
        VALUES (@fromdate, @fromtime, @todate, @totime, @gruppenavn, @GruppeNr, @niveau)
    END
    BEGIN
        SELECT Gruppe_id FROM Gruppe WHERE fromdate = @fromdate AND fromtime = @fromtime AND todate = @todate AND @totime = totime AND gruppenavn = @gruppenavn
    END
END
-------------

Og min tabel ser stadig ud som tidligere. Dog fandt jeg ud af, at min SP faktisk virker som den skal, om de BEGIN END står rigtigt osv, så virker det uden problemer og det gør som jeg vil have det. Fejlen har bare ligget i, at jeg har kaldt den forkerte SP, som jeg så ikke vidste :/

Men læg et svar hvis point ønskes.
Avatar billede Syska Mester
14. december 2010 - 13:48 #9
Her ville det nok ikke betyde det store, da det nok give mere mening hvor der er mere logic eller flere SP'er i samme kørsel.

Jeg er lidt i tvivl om hvordan den kan kalde:
sys.sp_addgroup når du kalder dbo.sp_addgroup

altså:
EXEC sys.sp_addgroup
EXEC dbo.sp_addgroup

Overstående burde jo ikke kunne ramme hinanden når man angiver schema eller mig der tager fejl her ?
Avatar billede morten-hbm Nybegynder
14. december 2010 - 14:12 #10
Hvordan det kan lade sig gøre er også mig en gåde, men efter at jeg kaldte min for SP_DSAddGroup, så virkede det fint.

Men lige nu spiller det som det skal, og jeg er glad for at være over dette problem! :)
Avatar billede morten-hbm Nybegynder
04. januar 2011 - 10:51 #11
Lukker
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