/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
[MSSQL] Flere recordset fra en procedure?
Fra : Stefan Kristensen


Dato : 29-06-05 14:02

Hej NG.

Jeg har en procedure, der løber gennem en tabel og vælger en post i en
anden tabel ude fra den første:

CREATE PROCEDURE GetLDAPDN
   @OrgUnit varchar(8),
   @Computer varchar(64)
AS
   WHILE NOT @OrgUnit Is Null
      BEGIN -- WHILE
      SELECT DistinctName
      FROM EnterpriseOUs
      WHERE OrgUnit = @OrgUnit
      AND SysID = 'LDP'
      AND Computer = @Computer

      -- Next OrgUnit
      SELECT @OrgUnit = OrgUnitSup
      FROM Organization
      WHERE OrgUnit = @OrgUnit
      AND ParentInclude=1
      IF @@ROWCOUNT = 0
         SET @OrgUnit = NULL
      END -- WHILE
GO

Det virker sådan set også fint, men for hvert niveau proceduren kører i
gennem (i Organization tabellen) bliver der returneret et tomt
recordset. Så hvis proceduren gører gennem fire niveauer inden der
findes et DistictName, returnerer den tre tomme recordsets og til sidst
et med DistinctName.

Kan jeg nøjes med at returnere det sidste recordset?
Proceduren bliver kaldt fra Visual Basic 6.0 hvor man kan bruge
rs.GetNextRecordset. Kan man få at hvide hvor mange recordsets der er
blevet returneret?

Mvh
Stefan

 
 
Peter Lykkegaard (29-06-2005)
Kommentar
Fra : Peter Lykkegaard


Dato : 29-06-05 14:27

Stefan Kristensen wrote:
>
> Jeg har en procedure, der løber gennem en tabel og vælger en post i en
> anden tabel ude fra den første:
>
> CREATE PROCEDURE GetLDAPDN
>    @OrgUnit varchar(8),
>    @Computer varchar(64)
> AS

SET NOCOUNT ON

>    WHILE NOT @OrgUnit Is Null
>       BEGIN -- WHILE
>       SELECT DistinctName
>       FROM EnterpriseOUs
>       WHERE OrgUnit = @OrgUnit
>       AND SysID = 'LDP'
>       AND Computer = @Computer
>
>       -- Next OrgUnit
>       SELECT @OrgUnit = OrgUnitSup
>       FROM Organization
>       WHERE OrgUnit = @OrgUnit
>       AND ParentInclude=1
>       IF @@ROWCOUNT = 0
>          SET @OrgUnit = NULL
>       END -- WHILE

SET NOCOUNT OFF

> GO
>
Du kan evt lade Distinctname være en ooutpput parameter
Her skal du bruge adodb.command objectet i VB6 for at hente outputtet


Mht NOCOUNT - et klip fra books online:

<Quote>
When SET NOCOUNT is ON, the count (indicating the number of rows
affected by a Transact-SQL statement) is not returned. When SET NOCOUNT
is OFF, the count is returned.

The @@ROWCOUNT function is updated even when SET NOCOUNT is ON.

SET NOCOUNT ON eliminates the sending of DONE_IN_PROC messages to the
client for each statement in a stored procedure. When using the
utilities provided with Microsoft® SQL Server™ to execute queries,
the results prevent "nn rows affected" from being displayed at the end
Transact-SQL statements such as SELECT, INSERT, UPDATE, and DELETE.

For stored procedures that contain several statements that do not
return much actual data, this can provide a significant performance
boost because network traffic is greatly reduced.

The setting of SET NOCOUNT is set at execute or run time and not at
parse time.
</quote>



- Peter


Stefan Kristensen (29-06-2005)
Kommentar
Fra : Stefan Kristensen


Dato : 29-06-05 14:42

> SET NOCOUNT ON

Desværre. Jeg bruge NOCOUNT i en procedure der sletter data i 12
tabeller. Det sparer de 12 'X rows affected', men jeg får stadig de
tomme recordsets. Det passer (imho) også med din quote.

> Du kan evt lade Distinctname være en ooutpput parameter

Ja, det er jo en mulighed

Mvh
Stefan

Peter Lykkegaard (29-06-2005)
Kommentar
Fra : Peter Lykkegaard


Dato : 29-06-05 16:31

"Stefan Kristensen" wrote

>> SET NOCOUNT ON
>
> Desværre. Jeg bruge NOCOUNT i en procedure der sletter data i 12 tabeller.
> Det sparer de 12 'X rows affected', men jeg får stadig de tomme
> recordsets. Det passer (imho) også med din quote.
>
Hmm det var sgi da lidt sjovt
Jeg har brugt nocount med god success hvor jeg henter data over i T-SQL
variabler


Hvad med den her?

CREATE PROCEDURE GetLDAPDN
@OrgUnit varchar(8),
@Computer varchar(64)
AS
DECLARE @DistinctName VarChar(200)
SET NOCOUNT ON

WHILE NOT @OrgUnit Is Null
BEGIN -- WHILE
SELECT @DistinctName = DistinctName
FROM EnterpriseOUs
WHERE OrgUnit = @OrgUnit
AND SysID = 'LDP'
AND Computer = @Computer

-- Next OrgUnit
SELECT @OrgUnit = OrgUnitSup
FROM Organization
WHERE OrgUnit = @OrgUnit
AND ParentInclude=1
IF @@ROWCOUNT = 0
SET @OrgUnit = NULL
END -- WHILE

SELECT @DistinctName AS DistinctName

SET NOCOUNT OFF

?

Peter



Stefan Kristensen (29-06-2005)
Kommentar
Fra : Stefan Kristensen


Dato : 29-06-05 16:45

> Hmm det var sgi da lidt sjovt
> Jeg har brugt nocount med god success hvor jeg henter data over i T-SQL
> variabler

Ja, men jeg tror det er noget andet med et tomt recordset. Jeg vil
egentlig også hellere (normalt) have et tomt recordset end ingenting...

>
> Hvad med den her?
>
<snip>

Ja squ! :D
Det var jo lige sådan den ged skulle barberes. Ideen med output
variablen giver jo samme resultat, men det giver til gengæld problemer
ved automatisk konvertering til DB2 (som jeg heldigvis kan hælde over på
en kollega).

Mange tak for hjælpen.
Stefan

Søg
Reklame
Statistik
Spørgsmål : 177559
Tips : 31968
Nyheder : 719565
Indlæg : 6408934
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste