Avatar billede AnneMCh Juniormester
25. januar 2019 - 14:36 Der er 8 kommentarer

Få output parameter fra Stored Procedure vist på asp side

Hej

jeg har en udfordring med at få output parameter tilbage fra en Stored Procedure (sql server). Jeg kan godt få fat i værdien på asp siden, hvis jeg tager den som return value, men det kan jeg ikke bruge fordi det er en int.
Den værdi jeg vil have tilbage er en type real.

Stored Procedure:
ALTER PROCEDURE [dbo].[updateFlexTimeReg]
  @update int,
  @RecordedHoursTimeReg real output, @normalHoursTimeReg real output, @MissingDaysInHoursTimeReg real output, @flexHoursTimeReg real output, @flexAccountChange real output, @userIdOut int output, @oldflexAccount real output, @newflexAccount real output
AS
  DECLARE
    @userDate date, @userInit as string_short, @dayWorkHours real, @counter int, @userId INT
   
        DECLARE flex_Cursor CURSOR FAST_FORWARD FOR
            select distinct Id from userGroup where TimeCalculation = 0
            and id = 117618
            order by id asc

        OPEN flex_Cursor;
        FETCH NEXT FROM flex_Cursor INTO @userId;
        WHILE @@FETCH_STATUS = 0
            BEGIN
                exec NormalHoursTimeReg @userId, @normalHoursTimeReg output
                exec MissingDaysInHoursTimeReg @userId, @MissingDaysInHoursTimeReg output
                exec flexHoursTimeReg @userId, @flexHoursTimeReg output
                exec RecordedHoursTimeReg @userId, @RecordedHoursTimeReg output

                select @flexAccountChange = (@RecordedHoursTimeReg - @normalHoursTimeReg) + @flexHoursTimeReg + @MissingDaysInHoursTimeReg
                select @userIdOut = @userId
                print('normalHoursTimeReg')
                print(@normalHoursTimeReg)
                print('RecordedHoursTimeReg')
                print(@RecordedHoursTimeReg)
                print('MissingDaysInHoursTimeReg')
                print(@MissingDaysInHoursTimeReg)
                print('flexHoursTimeReg')
                print(@flexHoursTimeReg)

                print('flexAccountChange')
                print(@flexAccountChange)
                print('userId')
                print(@userIdOut)

                select @oldflexAccount = flexTimeHours from userGroup where id = @userId
                select @newFlexAccount = @oldflexAccount + @flexAccountChange
                IF @update = 0
                    begin   
                        update UserGroup set oldflexTimeHours = @oldflexAccount where id = @userId
                        update UserGroup set flexTimeHours = @newflexAccount where id = @userId
                        update UserGroup set flexUpdated = GETDATE() where id = @userId
                    end
                print('@oldflexAccount')
                print(@oldflexAccount)
                print('newFlexAccount')
                print(@newFlexAccount)
                FETCH NEXT FROM flex_Cursor INTO @userId;
            END;

        CLOSE flex_Cursor;
        DEALLOCATE flex_Cursor;
                --return @newFlexAccount
Avatar billede arne_v Ekspert
25. januar 2019 - 14:55 #1
cmd.Parameters.Append(cmd.CreateParameter("@xxxx", adSingle, adParamOutput))
Avatar billede AnneMCh Juniormester
25. januar 2019 - 15:32 #2
Jeg har ikke lavet ret mange stored procedure før, så hvor skal jeg sætte sætningen ind?
Avatar billede arne_v Ekspert
25. januar 2019 - 15:44 #3
Det skal bruges i ASP koden der kalder den SP.
Avatar billede arne_v Ekspert
25. januar 2019 - 22:21 #4
Hvorfor bruger du output parametre fremfor flere result set?
Avatar billede arne_v Ekspert
26. januar 2019 - 04:18 #5
Eksempel:

SP:


CREATE PROCEDURE usp_return @inarg INTEGER, @outarg INTEGER OUT
AS
BEGIN
    SELECT @inarg+1 AS v
    SELECT @outarg = @inarg+2
    RETURN @inarg+3
END;
GO


ASP:


adCmdStoredProc = 4
adParamInput = 1
adParamOutput = 2
adParamReturnValue = 4
adInteger = 3
Set con = CreateObject("ADODB.Connection")
con.Open "Provider=SQLOLEDB;Data Source=ARNEPC4\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=Test;"
Set cmd = CreateObject("ADODB.Command")
cmd.ActiveConnection = con
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "usp_return"
cmd.Parameters.Append(cmd.CreateParameter("@retval", adInteger, adParamReturnValue))
cmd.Parameters.Append(cmd.CreateParameter("@inarg", adInteger, adParamInput))
cmd.Parameters.Append(cmd.CreateParameter("@outarg", adInteger, adParamOutput))
cmd.Parameters("@inarg") = 123
Set rs = cmd.Execute
Do While Not rs.EOF
    WScript.Echo rs("v")
    rs.MoveNext
Loop
Set rs = Nothing
WScript.Echo cmd.Parameters("@outarg")
WScript.Echo cmd.Parameters("@retval")
Set cmd = Nothing
Set con = Nothing
Avatar billede AnneMCh Juniormester
28. januar 2019 - 13:47 #6
Min asp kode ser sådan ud, det er den metode jeg har lært og ikke andet, kan du hjælpe ud fra det?
Kan jeg i dette kald definere mine parametre som OUTPUT?

        <%dim calcParam1 (10,2)
        calcParam1(0,0)="update"
        calcParam1(0,1)=1
        calcParam1(1,0)="RecordedHoursTimeReg"
        calcParam1(1,1)=null
        calcParam1(2,0)="normalHoursTimeReg"
        calcParam1(2,1)=null
        calcParam1(3,0)="MissingDaysInHoursTimeReg"
        calcParam1(3,1)=null
        calcParam1(4,0)="flexHoursTimeReg"
        calcParam1(4,1)=null
        calcParam1(5,0)="flexAccountChange"
        calcParam1(5,1)=null
        calcParam1(6,0)="userIdOut"
        calcParam1(6,1)=null
        calcParam1(7,0)="oldFlexAccount"
        calcParam1(7,1)=null
        calcParam1(8,0)="newFlexAccount"
        calcParam1(8,1)=null
        FlexAccount=runsp("updateFlexTimeReg", calcParam1)%>
Avatar billede arne_v Ekspert
28. januar 2019 - 19:50 #7
Det tror jeg ikke.

Der er en runsp funktion som laver det egentligt kald. Og det ser ikke ud som om det er en mulighed at aendre paa dens opfoersel.
Avatar billede AnneMCh Juniormester
08. februar 2019 - 14:44 #8
Ok tak for svar.
Jeg prøver at komme rundt om udfordringen på anden vis. Tak for dine forskellige input.
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
Kurser inden for grundlæggende programmering

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