Jag har en Store Procedure som i sig fungerar bra men det finns en hake någonstan (vilken ger mig gråa hår). 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: Jo det stämmer, Orter är en kommaseparerad sträng från deras ID. 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. Jag fick samma felmeddelande som jag fick med min variant. Du måste anropa den med alla id:n som en sträng: 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. 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? Tack för alla tips!! Du kan också joina tabellen med sig själv för att räkna poster med olika villkor: Jag skulle skrivit dem som:Store Procedure
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?
// StefanSv: Store Procedure
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)Sv: Store Procedure
Tyvärr blev det samma resultat även vid detta sätt. En ort går bra men inte flera.Sv: Store Procedure
Sv: Store Procedure
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?
// StefanSv: Store Procedure
strSQL = "Statistics '" & strIdn & "'"Sv: Store Procedure
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??Sv: Store Procedure
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>Sv: Store Procedure
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.....Sv: Store Procedure
<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>Sv: Store Procedure
<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.