webForumDet fria alternativet

Retunera två värden

8 svar · 344 visningar · startad av Dino

DinoMedlem sedan sep. 20011 914 inlägg
#1

SQL Server 2005

Har väldigt förenklat en sp som ser ut som nedan. Problemet är att jag inte kan spara denna sp i vs.net pga raden med fet stil. Så hur skall jag retunera antal rader som Templist har?

ALTER PROCEDURE up_Selectxxx
(
   @cat int,
   @pageindex int,
   @numrows int,
   @rowcount int OUTPUT
)
AS
BEGIN
	
   DECLARE @startrowindex int
   SET @startrowindex = (@pageindex * @numrows) + 1;
	
   WITH Templist AS (
      SELECT ROW_NUMBER() OVER (ORDER BY Id) AS Row, Id, Title FROM Table1 WHERE Visible = 1 AND CatId = @catid
   )
     
   [b]SET @rowcount = (SELECT COUNT(Id) FROM Templist)[/b]
   SELECT * FROM Templist WHERE Row BETWEEN @startrowindex AND @startrowindex+@numrows-1
END
@ndersMedlem sedan juni 200032 969 inlägg
#2

Varför kan du inte spara den? Felmeddelande?
Kan du inte lägga med den som en subquery?

DinoMedlem sedan sep. 20011 914 inlägg
#3

Felmeddelandet lyder "Incorrect syntax near the keyword 'SET'".
Subquery, var?

@ndersMedlem sedan juni 200032 969 inlägg
#4

Typ?

SELECT *, (SELECT COUNT(Id) FROM Templist) as foo 
FROM Templist WHERE Row BETWEEN @startrowindex AND @startrowindex+@numrows-1
BrimbaMedlem sedan dec. 19995 875 inlägg
#5
SELECT @rowcount = COUNT(Id) FROM Templist
DinoMedlem sedan sep. 20011 914 inlägg
#6

Brimbas fungerar inte. Felmeddelande, "Could not use view or function 'Templist' because of binding errors.".

@nders fungerar. Men vill ju att count värdet skall in i output parametern(@rowcount) och inte vara en del av det andra resultatet.

BrimbaMedlem sedan dec. 19995 875 inlägg
#7

Du kan bara använda den en gång (Templist).
http://msdn2.microsoft.com/en-us/library/ms146017(en-US,SQL.90).aspx

Mitt förslag:

ALTER PROCEDURE up_Selectxxx
(
   @cat int,
   @pageindex int,
   @numrows int,
   @rowcount int OUTPUT
)
AS
BEGIN
	
   DECLARE @startrowindex int
   SET @startrowindex = (@pageindex * @numrows) + 1;
	
   WITH Templist AS (
      SELECT ROW_NUMBER() OVER (ORDER BY Id) AS Row, Id, Title FROM Table1 WHERE Visible = 1 AND CatId = @catid
   )
   
SELECT * FROM Templist WHERE Row BETWEEN @startrowindex AND @startrowindex+@numrows-1
  
   SET @rowcount = (SELECT @rowcount = COUNT(Id) FROM Table1 WHERE Visible = 1 AND CatId = @catid)
   
END
@ndersMedlem sedan juni 200032 969 inlägg
#8

Men vill ju att count värdet skall in i output parametern(@rowcount) och inte vara en del av det andra resultatet.

Jo, jag förstod det, men eftersom du sa att det inte gick gav jag ett förslag till en alternativ lösning.

DinoMedlem sedan sep. 20011 914 inlägg
#9

Hade hoppats att jag inte skulle behöva göra två select för att selecten i dess fulla skick är ganska maffig, men får väl bli så i vilket fall. Eller helt enkelt använda @nders alternativ. Får se vilket som visar sig vara mer effektivt.

Tack för svaren.

251 ms totalt · 3 externa anrop · v20260731065814-full.beb2e261
129 ms — hämta forumlista (db)
118 ms — hämta statistik (db)
130 ms — hämta tråd, inlägg och bilagor (db)