Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Store Procedure

Postades av 2004-05-08 11:13:57 - Stefan Sjöberg, i forum asp - allmänt, Tråden har 12 Kommentarer och lästs av 456 personer

Jag har en Store Procedure som i sig fungerar bra men det finns en hake någonstan (vilken ger mig gråa hår).

Jag ger en kortare variant för att skådligöra vad jag menar.

CREATE PROCEDURE sp_Statistics
@orter int
AS
SELECT Year(DatumUt) AS Artal,
COUNT(ID) AS Antal,
FROM lagerlogg
WHERE Status = 3 AND Delivery = 1 AND Ort IN(@orter)
GROUP BY Year(DatumUt)
ORDER BY Year(DatumUt)
GO

Det jag väljer i ett tidigare läge är vilka orter som statistiken skall gälla för, detta sker via checkboxar.

Allt fungerar bra så länge jag bara bockar för EN ort. Väljer jag fler än en ort får jag följande meddelande.

"Procedure or function sp_Statistics has too many arguments specified"

Kan man komma runt detta på något sätt?

// Stefan


Svara

Sv: Store Procedure

Postades av 2004-05-08 15:10:59 - Raderat konto

Problemet är att du skulle kunna få flera värden här. Men du skulle kunna göra en s.k dynamisk Sproc (och förresten bör du inte prefixa dina SP med 'sp_', det är reserverat för system procedurer). Exempel:

CREATE PROCEDURE Statistics
(
@orter varchar(100)
)

AS

DECLARE @sqlStatement varchar(255)

SELECT @sqlStatement =
'SELECT Year(DatumUt) AS Artal,
COUNT(ID) AS Antal,
FROM lagerlogg
WHERE Status = 3 AND Delivery = 1 AND Ort IN(' + @orter + ')
GROUP BY Year(DatumUt)
ORDER BY Year(DatumUt)'

EXEC (@sqlStatement)

Vi förutsätter här att @Orter är en kommaseparerad sträng (1,3,34,56,78)


Svara

Sv: Store Procedure

Postades av 2004-05-08 18:54:21 - Stefan Sjöberg

Jo det stämmer, Orter är en kommaseparerad sträng från deras ID.

Tyvärr blev det samma resultat även vid detta sätt. En ort går bra men inte flera.


Svara

Sv: Store Procedure

Postades av 2004-05-08 18:57:29 - Raderat konto

Då är det något annat som är fel. Jag testade det ovanstående (dock med Products tabellen i Northwinds db) och det funkade perfekt.


Svara

Sv: Store Procedure

Postades av 2004-05-08 20:12:19 - Göran Andersson

Vad får du för felmeddelande med adecs sp?


Svara

Sv: Store Procedure

Postades av 2004-05-08 23:53:23 - Stefan Sjöberg

Jag fick samma felmeddelande som jag fick med min variant.

För att föräkra att inget är galet med frågan har jag kört den i Query Analyzer och det ser bra ut.

Det måste vara något med strängen (orter) i sig som inte lirar?? Eller?

// Stefan


Svara

Sv: Store Procedure

Postades av 2004-05-09 00:38:51 - Göran Andersson

Du måste anropa den med alla id:n som en sträng:

strSQL = "Statistics '" & strIdn & "'"


Svara

Sv: Store Procedure

Postades av 2004-05-09 00:43:39 - Stefan Sjöberg

Så enkelt fel det kan vara. Enkelfnuttarna hade jag inte satt dit.

TACK!


Svara

Sv: Store Procedure

Postades av 2004-05-09 02:55:13 - Stefan Sjöberg

Som om inte det var nog. Efter jag fått orterna att lira la jag dit resten av select satsen och nu blev det inte roligare.

Titta på följande......

CREATE PROCEDURE Statistics
(
@orter varchar(100)
)
AS

DECLARE @sqlStatement varchar(255)

SELECT @sqlStatement =

'SELECT Year(DatumUt) AS Artal,
COUNT(ID) AS Antal,
(SELECT COUNT(ID) FROM lagerlogg WHERE Year(DatumUt) = Year(a.DatumUt) AND Status = 3 AND Utkorning = 1 AND Ort IN(' + @orter + ')) AS Ja,
(SELECT COUNT(ID) FROM lagerlogg WHERE Year(DatumUt) = Year(a.DatumUt) AND Status = 3 AND Utkorning = 2 AND Ort IN(' + @orter + ')) AS Nej
FROM lagerlogg AS a
WHERE Status = 3 AND Utkorning IN(1,2) AND Ort IN(' + @orter + ')
GROUP BY Year(DatumUt)
ORDER BY Year(DatumUt)'

EXEC (@sqlStatement)

*******************

Den fungerar alldeles utmärkt när jag kör den i Query Analyzer

Felmeddelandet ser ut som följer:

Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC SQL Server Driver][SQL Server]Line 4: Incorrect syntax near ')'

Vad är det som händer??


Svara

Sv: Store Procedure

Postades av 2004-05-09 03:25:01 - Andreas Hillqvist

JAg tycker det känns onödigt at ha en Proceduer som anropar en dynamisk skapd fråga. Är det inte bättre att direkt ställa frågan?

I vilket fall kan du skriva om din fråga/stored prodeure:

<code>
CREATE PROCEDURE Statistics
(
@orter varchar(100)
)
AS

DECLARE @sqlStatement varchar(255)

SET @sqlStatement =

'SELECT Year(DatumUt) AS Artal,
COUNT(ID) AS Antal, SUM(CASE Utkorning WHEN 1 THEN 1 ELSE 0 END) AS Ja,
SUM(CASE Utkorning WHEN 2 THEN 1 ELSE 0 END) AS Nej
FROM lagerlogg AS a
WHERE Status = 3 AND Utkorning IN(1, 2) AND Ort IN(' + @orter + ')
GROUP BY Year(DatumUt)'

EXEC (@sqlStatement)
</code>

Eller:

<code>
Public Function ValidateIN(Value)
Dim re
Set re = New RegExp
re.Pattern = "^\d+(,\s*\d+)*$"
ValidateIN = re.Test(Value)
End Function

Dim rs
Dim con

Dim strIN
Dim strSQL

strIN = Trim(Request.Form("orter"))
If Len(strIN) Then
If ValidateIN(strIN) Then
Set con = Server.CreateObject("ADODB.Connection")
con.Open "<<<Din anslutningssträng>>>"

strSQL = "SELECT Year(DatumUt) AS Artal, " & vbCrLf & _
" COUNT(*) AS Antal, " & vbCrLf & _
" SUM(CASE Utkorning WHEN 1 THEN 1 ELSE 0 END) AS Ja, " & vbCrLf & _
" SUM(CASE Utkorning WHEN 2 THEN 1 ELSE 0 END) AS Nej" & vbCrLf & _
"FROM lagerlogg" & vbCrLf & _
"WHERE Status = 3 AND Utkorning IN(1, 2) AND Ort IN(' + strIN + ')" & vbCrLf & _
"GROUP BY Year(DatumUt)"
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open strSQL, con

Do until rs.EOF
rs.MoveNext
Loop

rs.Close
Set rs = Nothing

con.Close
Set con = Nothing
Else
Response.Write "Av någon underlig anledning har du inte skickat
en korrekt In sats. Du försöker väl inte hacka sidan?"
End If
Else
Response.Write "Du har inte angivit några orter..."
End If

</code>


Svara

Sv: Store Procedure

Postades av 2004-05-09 23:11:09 - Stefan Sjöberg

Tack för alla tips!!

När det gäller sista varianten från Andreas så fungerar det om jag bara lägger ett alternativ Sum(CASE Utkorning.........osv.
Lägger jag till både SUM..... AS Ja samt SUM...... AS Nej, får jag ett annat fel svar tillbaka:

[Microsoft][ODBC SQL Server Driver][SQL Server]Line 7: Incorrect syntax near 'Datum'

Nu tror jag man behöver gå och lägga sig ett tag.....


Svara

Sv: Store Procedure

Postades av 2004-05-10 01:09:43 - Göran Andersson

Du kan också joina tabellen med sig själv för att räkna poster med olika villkor:

<code>CREATE PROCEDURE Statistics
@orter varchar(100)
AS

DECLARE @sqlStatement varchar(255)

SET @sqlStatement =
'SELECT Year(a.DatumUt) AS Artal,
COUNT(a.ID) AS Antal,
COUNT(j.ID) AS Ja,
COUNT(n.ID) AS Nej
FROM lagerlogg a
INNER JOIN lagerlogg j on j.ID=a.ID and j.Utkorning=1
INNER JOIN lagerlogg n on n.ID=a.ID and n.Utkorning=2
WHERE a.Status = 3 AND a.Utkorning IN(1, 2) AND a.Ort IN(' + @orter + ')
GROUP BY Year(a.DatumUt)'

EXEC (@sqlStatement)</code>


Svara

Sv: Store Procedure

Postades av 2004-05-10 13:27:25 - Andreas Hillqvist

Jag skulle skrivit dem som:
<code>
Public Function ValidateIN(Value)
Dim re
Set re = New RegExp
re.Pattern = "^\d+(,\s*\d+)*$"
ValidateIN = re.Test(Value)
End Function

Dim strSQL
Dim strOrter
strOrter = Trim(Request.Form("orter"))
If ValidateIN(strOrter) Then
strSQL = "SELECT Year(lagerlogg.DatumUt) AS Artal, COUNT(*) AS Antal, COUNT(J.ID) AS Ja, COUNT(n.ID) AS Nej" & vbCrLf & _
"FROM lagerlogg LEFT JOIN" & vbCrLf & _
" (SELECT lagerlogg.*" & vbCrLf & _
" FROM lagerlogg" & vbCrLf & _
" WHERE lagerlogg.Status = 3 AND lagerlogg.Utkorning = 1 AND lagerlogg.Ort IN(" & strOrter & ")) AS J ON J.ID = lagerlogg.ID LEFT JOIN " & vbCrLf & _
" (SELECT lagerlogg.*" & vbCrLf & _
" FROM lagerlogg" & vbCrLf & _
" WHERE lagerlogg.Status = 3 AND lagerlogg.Utkorning = 2 AND lagerlogg.Ort IN(" & strOrter & ")) AS N ON N.ID = lagerlogg.ID " & vbCrLf & _
"WHERE lagerlogg.Status = 3 AND lagerlogg.Utkorning IN(1, 2) AND lagerlogg.Ort IN(" & strOrter & ") " & vbCrLf & _
"GROUP BY Year(lagerlogg.DatumUt)"

Set con = Server.CreateObject("ADODB.Connection")
con.Open "<<<Din anslutningssträng>>>"

Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open strSQL, con

Do Until rs.EOF

rs.MoveNext
Loop

rs.Close
Set rs = Nothing

con.Close
Set con = Nothing
Else
Response.Write "Du har inte markerat några orter..."
End If
</code>
Jag förutsätter att orter är ett numeriskt fält vilket refererar till en tabell med orternas namn.


Svara

Nyligen

  • 08:28 Butiksskyltar: Hur upplever utbude
  • 22:31 Slappna av
  • 19:55 kick-off med fokus på hälsa?
  • 19:53 kick-off med fokus på hälsa?
  • 16:24 Föreslå en skönhetsklinik online
  • 16:23 Föreslå en skönhetsklinik online
  • 18:42 Hvor finder man håndlavede lamper
  • 18:41 Hvor finder man håndlavede lamper

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 787
27 960
271 761
6 433
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies