Laden...

Warum ein "*" ?

Erstellt von Paulo vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.478 Views
P
Paulo Themenstarter:in
172 Beiträge seit 2005
vor 16 Jahren
Warum ein "*" ?

verwendetes Datenbanksystem: Sql Server 2005

So sieht meine Stored Procedure aus:


ALTER PROCEDURE [dbo].[me_CountUsers]	
AS
BEGIN

declare @uCount varchar	

SET @uCount = (SELECT COUNT(*) FROM aspnet_Membership)
UPDATE me_datastore SET dData = @uCount WHERE dTitle = 'UserCount'

END

Als Ergebnis kommt jedoch ein * heraus anstatt die korrekte Zahl 12. Woran kann das liegen? Versuche einfach nur die Anzahl der Mitglieder zu speichern (stündlich).

Danke!

1.378 Beiträge seit 2006
vor 16 Jahren

Bei mir funktioniert eine ähnliche Abfrage(mit anderen Tabellen).

Vielleicht macht es auf folgende Weise ja einen Unterschied:

SELECT @uCount = COUNT(*) FROM aspnet_Membership

Lg XXX

4.506 Beiträge seit 2004
vor 16 Jahren

Hallo Paulo,

die Variable "@uCount" ist nicht dafür gekennzeichnet, dass sie zurückgegeben wird, versuche mal folgende Variablendefinition zu verwenden:

DECLARE @uCount INT OUTPUT

Dann sollte es auch richtig funktionieren.

Viele Grüße
Norman-Timo

Edit:
Warum wird die Anzahl als String (varchar) definiert?

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

476 Beiträge seit 2004
vor 16 Jahren

hallo norman_timo,

Original von norman_timo
die Variable "@uCount" ist nicht dafür gekennzeichnet, dass sie zurückgegeben wird, versuche mal folgende Variablendefinition zu verwenden:

DECLARE @uCount INT OUTPUT  

die Variable wird ja in der anschliessenden Update-Anweisung innerhalb der Prozedur verwendet, von daher ist das OUTPUT meiner Ansicht nach unnötig. (hab's aber auch nicht gleich gesehen...)

Original von norman_timo
Edit:
Warum wird die Anzahl als String (varchar) definiert?

Das Frage ich mich allerdings auch, vor allem muss bei varchar immer eine Feldgröße angegeben werden, andernfalls wird nur ein Zeichen verwendet, vermutlich daher das "*". Bei varchar(10) wäre das richtige Ergebnis, jedoch als String, herausgekommen.

-yellow

Selbst ein Weg von tausend Meilen beginnt mit einem Schritt (chinesisches Sprichwort).

Mein Blog: Yellow's Blog auf sqlgut.de

4.506 Beiträge seit 2004
vor 16 Jahren

Hallo yellow,

die Variable wird ja in der anschliessenden Update-Anweisung innerhalb der Prozedur verwendet, von daher ist das OUTPUT meiner Ansicht nach unnötig. (hab's aber auch nicht gleich gesehen...)

Du hast Recht, ich habe mir die Update Anweisung so gar nicht angeschaut, bin davon ausgegangen, dass die Stored Procedure für eine Rückgabe verwendet wird, und nicht, dass eine andere Tabelle upgedatet wird.

-> "UserCount", muss man so etwas in einer separaten Tabelle halten, oder ist es nicht sinnvoller immer ein "Select Count(*)" auf entsprechende Tabelle auszuführen, denn dann ist die Angabe IMMER aktuell und muss nicht noch blöde Trigger einbauen, falls mal User gelöscht werden etc...

Gruß
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

476 Beiträge seit 2004
vor 16 Jahren

hallo norman_timo,

Original von norman_timo
-> "UserCount", muss man so etwas in einer separaten Tabelle halten, oder ist es nicht sinnvoller immer ein "Select Count(*)" auf entsprechende Tabelle auszuführen, denn dann ist die Angabe IMMER aktuell und muss nicht noch blöde Trigger einbauen, falls mal User gelöscht werden etc...

ich bin auch ein Fan von Select Count(*) in dem Moment wo es gebraucht wird, habe aber speziell im Webbereich die Erfahrung gemacht, dass alles gepuffert wird. Ich denke hier ist der Geschwindigkeitsvorteil zum Abfragen eines Wertes aus einem Feld ausschlaggebend, und der Verwaltungsaufwand wird in Kauf genommen.

-yellow

Selbst ein Weg von tausend Meilen beginnt mit einem Schritt (chinesisches Sprichwort).

Mein Blog: Yellow's Blog auf sqlgut.de

P
Paulo Themenstarter:in
172 Beiträge seit 2005
vor 16 Jahren

Danke, hab in der Tat die Feldgröße beim varchar vergessen.

Es ist eine Web Applikation und das dynamische Ausführen von SELECT COUNT(*) würde zuviel Performance kosten.

Danke an alle!

476 Beiträge seit 2004
vor 16 Jahren

hallo Paulo,

hätte ich nur nicht den Hinweis mit der Feldgröße geschrieben. Verwende INT um das Ergebnis von Count(*) zu speichern, genau so wie es auch norman_timo schon sagte.

-yellow

Selbst ein Weg von tausend Meilen beginnt mit einem Schritt (chinesisches Sprichwort).

Mein Blog: Yellow's Blog auf sqlgut.de