Avatar billede kenneth77 Nybegynder
24. november 2004 - 11:38 Der er 3 kommentarer og
1 løsning

Parameterliste i stored procedure

Jeg skal lave en stored procedure, som tager en parameterliste af værdier ind i, så jeg f.eks. kan lave en SELECT ... WHERE intUserID IN (<parameters>).

Jeg kan ikke sende en kommasepareret varchar med og så lave en SQL-streng inde i min stored procedure, idet jeg skal have resultatet over i en cursor, og man kan ikke få en cursor til at snakke sammen med en exec sp_executesql.

Er der nogen, der har et forslag?
Avatar billede trer Nybegynder
24. november 2004 - 12:27 #1
" og man kan ikke få en cursor til at snakke sammen med en exec sp_executesql."

jo, brug en global cursor

declare crsr cursor global for
  what ever...

men performance med dynamisk sql og cursors (både lokale og globale) er altid væsentlig lavere end med ren sql.
Avatar billede kenneth77 Nybegynder
24. november 2004 - 13:15 #2
Hej, trer.

Jeg er egentligt gået over til at generere SQL'en fra kode-siden, men har alligevel prøvet det, du skrev. Jeg gør f.eks. noget i den stil her:

DECLARE criterias_cursor cursor GLOBAL FOR
EXEC 'SELECT strSQL FROM tblDynamicMailGroup WHERE intDynamicMailGroupID IN (1,2)'

...men det giver en syntax error.

Hele min procedure ser sådan ud:

CREATE PROCEDURE [dbo].[stpGetDynamicMailGroupUserCount]

@uidCustomerID uniqueidentifier,
@strDynamicMailGroupIDs varchar(50)

AS

DECLARE @strSQL nvarchar(2000)
SET @strSQL = 'SELECT * FROM tblUser WHERE uidCustomerID = ''' + CONVERT(varchar(36), @uidCustomerID) + ''' AND '

DECLARE @strCriteria varchar(250)

DECLARE criterias_cursor cursor GLOBAL FOR
EXEC 'SELECT strSQL FROM tblDynamicMailGroup WHERE intDynamicMailGroupID IN (' + @strDynamicMailGroupIDs + ')'

OPEN criterias_cursor

FETCH NEXT FROM criterias_cursor INTO @strCriteria
WHILE (@@FETCH_STATUS = 0)
BEGIN
    SET @strSQL = @strSQL + '(' + @strCriteria + ')'

    FETCH NEXT FROM criterias_cursor INTO @strCriteria

    IF (@@FETCH_STATUS = 0)
    BEGIN
        SET @strSQL = @strSQL + ' OR '
    END
END

CLOSE criterias_cursor
DEALLOCATE criterias_cursor

SELECT @strSQL
GO
Avatar billede kenneth77 Nybegynder
24. november 2004 - 13:23 #3
Hov, glemte lige at få sp_executesql sat ind. Det virker dog stadigvæk ikke:

CREATE PROCEDURE [dbo].[stpGetDynamicMailGroupUserCount]

@uidCustomerID uniqueidentifier,
@strDynamicMailGroupIDs varchar(50)

AS

DECLARE @strSQL nvarchar(2000)
SET @strSQL = 'SELECT * FROM tblUser WHERE uidCustomerID = ''' + CONVERT(varchar(36), @uidCustomerID) + ''' AND '

DECLARE @strTemp nvarchar(250)
SET @strTemp = 'SELECT strSQL FROM tblDynamicMailGroup WHERE intDynamicMailGroupID IN (' + @strDynamicMailGroupIDs + ')'

DECLARE @strCriteria varchar(250)

DECLARE criterias_cursor cursor GLOBAL FOR
EXEC sp_executesql @strTemp

OPEN criterias_cursor

FETCH NEXT FROM criterias_cursor INTO @strCriteria
WHILE (@@FETCH_STATUS = 0)
BEGIN
    SET @strSQL = @strSQL + '(' + @strCriteria + ')'

    FETCH NEXT FROM criterias_cursor INTO @strCriteria

    IF (@@FETCH_STATUS = 0)
    BEGIN
        SET @strSQL = @strSQL + ' OR '
    END
END

CLOSE criterias_cursor
DEALLOCATE criterias_cursor

SELECT @strSQL
GO

Jeg skriver SELECT @strSQL til sidst for at få den genererede SQL-streng tilbage for at teste den...
Avatar billede trer Nybegynder
24. november 2004 - 18:07 #4
Din syntaks bør være

EXEC 'DECLARE criterias_cursor cursor GLOBAL FOR SELECT strSQL FROM tblDynamicMailGroup WHERE intDynamicMailGroupID IN (' + @strDynamicMailGroupIDs + ')'

Nu har du en global cursor åbnet fra dynamisk sql.  Du kan så kalde den videre fra dit script.
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