webForumDet fria alternativet

problem med SP

4 svar · 182 visningar · startad av hakan@4u2.se

hakan@4u2.seMedlem sedan aug. 2000333 inlägg
#1

Om jag vill göra en SP och skicka in värden i @nysql samt @nysql2 då fungerar det inte i kod1

@nysql2 = t3.fraga1 like '%,1,%'
@nysql = t2.fraga1 like '%,1,%'

Får felmeddelandet
"Incorrect syntax near ')'"
"Incorrect syntax near keyword 'Group'

I kod2 har jag redan lagt in värdena direkt, då fungerar det!

Någon som vet vad jag gör för fel?

Tack på förhand

Kod1 fungerar inte

CREATE procedure dbo.Test
@nysql nvarchar(512),
@nysql2 nvarchar(512)

as

SELECT t1.typ_av_fraga,t1.antal_knappar, 

  (SELECT SUM(svar) FROM svar t2 INNER JOIN deltagare_ny ON   t2.deltagare_id = deltagare_ny.deltagare_id WHERE fraga_nummer = t1.id and @nysql) AS fldSumma, 

(SELECT COUNT(DISTINCT t3.deltagare_id) FROM svar t3 INNER JOIN deltagare_ny ON t3.deltagare_id = deltagare_ny.deltagare_id WHERE @nysql2 GROUP BY fraga_nummer HAVING fraga_nummer = t1.id) AS fldAntal_Deltagare

, t1.id, TEXT_fragor.fraga_text, t1.fraga_nummer FROM fragor t1 INNER JOIN TEXT_fragor ON t1.id = TEXT_fragor.fraga_id INNER JOIN kampanj ON t1.kampanj_id = kampanj.kampanj_id 
GO

Kod2 fungerar

CREATE procedure dbo.test2

as

SELECT t1.typ_av_fraga,t1.antal_knappar, 

  (SELECT SUM(svar) FROM svar t2 INNER JOIN deltagare_ny ON   t2.deltagare_id = deltagare_ny.deltagare_id WHERE fraga_nummer = t1.id and t3.fraga1 like '%,1,%') AS fldSumma, 

(SELECT COUNT(DISTINCT t3.deltagare_id) FROM svar t3 INNER JOIN deltagare_ny ON t3.deltagare_id = deltagare_ny.deltagare_id WHERE t2.fraga1 like '%,1,%' GROUP BY fraga_nummer HAVING fraga_nummer = t1.id) AS fldAntal_Deltagare

, t1.id, TEXT_fragor.fraga_text, t1.fraga_nummer FROM fragor t1 INNER JOIN TEXT_fragor ON t1.id = TEXT_fragor.fraga_id INNER JOIN kampanj ON t1.kampanj_id = kampanj.kampanj_id 
GO
LarsGMedlem sedan dec. 200012 464 inlägg
#2

Om du vill skicka kolumnnamn och sökoperator i parametrar så måste du använda dynamisk sql, dvs du bygger ihop en sträng som du gör exec på.

declare @st varchar(4000)
set @st = 'kod ' + @nysql + 'mer kod ' + @nysql2 + 'ännu mer kod '
exec(@st)

Det är inte speciellt bra för prestandan. Kan du inte skriva om det så att du bara skickar sökvärdet

hakan@4u2.seMedlem sedan aug. 2000333 inlägg
#3

Problemet är att @nysql är dynamisk uppbyggt i ASP så jag vet inte innan hur många värden den kommer att innehålla. Hur kan jag lösa det, att bara skicka in sökvärden verkar omöjligt eller?

Ett exempel på nysql!!

 
@nysql = 
((deltagare_ny.fraga1 LIKE '%,1,%' OR
                                                   deltagare_ny.fraga1 LIKE '%,2,%' OR
                                                   deltagare_ny.fraga1 LIKE '%,3,%' OR
                                                   deltagare_ny.fraga1 LIKE '%,4,%' OR
                                                   deltagare_ny.fraga1 LIKE '%,5,%') AND (deltagare_ny.fraga2 LIKE '%,1,%' OR
                                                   deltagare_ny.fraga2 LIKE '%,2,%' OR
                                                   deltagare_ny.fraga2 LIKE '%,3,%' OR
                                                   deltagare_ny.fraga2 LIKE '%,4,%' OR
                                                   deltagare_ny.fraga2 LIKE '%,5,%') AND (deltagare_ny.fraga3 LIKE '%,1,%' OR
                                                   deltagare_ny.fraga3 LIKE '%,2,%' OR
                                                   deltagare_ny.fraga3 LIKE '%,3,%') AND (deltagare_ny.fraga4 LIKE '%,1,%' OR
                                                   deltagare_ny.fraga4 LIKE '%,2,%' OR
                                                   deltagare_ny.fraga4 LIKE '%,3,%' OR
                                                   deltagare_ny.fraga4 LIKE '%,4,%' OR
                                                   deltagare_ny.fraga4 LIKE '%,5,%') AND (deltagare_ny.fraga5 LIKE '%,1,%' OR
                                                   deltagare_ny.fraga5 LIKE '%,2,%' OR
                                                   deltagare_ny.fraga5 LIKE '%,3,%' OR
                                                   deltagare_ny.fraga5 LIKE '%,4,%' OR
                                                   deltagare_ny.fraga5 LIKE '%,5,%' OR
                                                   deltagare_ny.fraga5 LIKE '%,6,%' OR
                                                   deltagare_ny.fraga5 LIKE '%,7,%' OR
                                                   deltagare_ny.fraga5 LIKE '%,8,%' OR
                                                   deltagare_ny.fraga5 LIKE '%,9,%' OR
                                                   deltagare_ny.fraga5 LIKE '%,10,%' OR
                                                   deltagare_ny.fraga5 LIKE '%,11,%' OR
                                                   deltagare_ny.fraga5 LIKE '%,12,%' OR
                                                   deltagare_ny.fraga5 LIKE '%,13,%' OR
                                                   deltagare_ny.fraga5 LIKE '%,14,%' OR
                                                   deltagare_ny.fraga5 LIKE '%,15,%' OR
                                                   deltagare_ny.fraga5 LIKE '%,16,%' OR
                                                   deltagare_ny.fraga5 LIKE '%,17,%' OR
                                                   deltagare_ny.fraga5 LIKE '%,18,%') AND (deltagare_ny.fraga6 LIKE '%,1,%' OR
                                                   deltagare_ny.fraga6 LIKE '%,2,%' OR
                                                   deltagare_ny.fraga6 LIKE '%,3,%' OR
                                                   deltagare_ny.fraga6 LIKE '%,4,%' OR
                                                   deltagare_ny.fraga6 LIKE '%,5,%' OR
                                                   deltagare_ny.fraga6 LIKE '%,6,%' OR
                                                   deltagare_ny.fraga6 LIKE '%,7,%' OR
                                                   deltagare_ny.fraga6 LIKE '%,8,%' OR
                                                   deltagare_ny.fraga6 LIKE '%,9,%' OR
                                                   deltagare_ny.fraga6 LIKE '%,10,%' OR
                                                   deltagare_ny.fraga6 LIKE '%,11,%' OR
                                                   deltagare_ny.fraga6 LIKE '%,12,%' OR
                                                   deltagare_ny.fraga6 LIKE '%,13,%' OR
                                                   deltagare_ny.fraga6 LIKE '%,14,%') AND (deltagare_ny.fraga7 LIKE '%,1,%' OR
                                                   deltagare_ny.fraga7 LIKE '%,2,%' OR
                                                   deltagare_ny.fraga7 LIKE '%,3,%' OR
                                                   deltagare_ny.fraga7 LIKE '%,4,%'))
LarsGMedlem sedan dec. 200012 464 inlägg
#4

Jaha, då får det bli dynamiskt då


CREATE procedure dbo.Test
@nysql nvarchar(512),
@nysql2 nvarchar(512)

as
declare @st varchar(2000)

set @st = 'SELECT t1.typ_av_fraga,t1.antal_knappar, ' +
'(SELECT SUM(svar) FROM svar t2 INNER JOIN deltagare_ny ON ' +
' t2.deltagare_id = deltagare_ny.deltagare_id ' +
' WHERE fraga_nummer = t1.id and ' + @nysql + ') AS fldSumma, ' +
'(SELECT COUNT(DISTINCT t3.deltagare_id) ' +
' FROM svar t3 INNER JOIN deltagare_ny ' +
' ON t3.deltagare_id = deltagare_ny.deltagare_id ' +
' WHERE ' + @nysql2 + 
' GROUP BY fraga_nummer HAVING fraga_nummer = t1.id) AS fldAntal_Deltagare, ' +
' t1.id, TEXT_fragor.fraga_text, t1.fraga_nummer ' +
' FROM fragor t1 INNER JOIN TEXT_fragor ' +
' ON t1.id = TEXT_fragor.fraga_id INNER JOIN kampanj ' +
' ON t1.kampanj_id = kampanj.kampanj_id '
exec(@st)
GO

Du kan testa att du får rätt sql-sats genom att lägga till

print @st

innan exec

hakan@4u2.seMedlem sedan aug. 2000333 inlägg
#5

Fungerar Tack LarsG!

136 ms totalt · 3 externa anrop · v20260731065814-full.beb2e261
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)