webForumDet fria alternativet

syntaxfel i SP + lite frågor..

5 svar · 331 visningar · startad av CokeLight

CokeLightMedlem sedan juni 2000506 inlägg
#1

Hejsan,

felmeddelande:

Server: Msg 137, Level 15, State 2, Procedure getChefer, Line 30
Must declare the variable '@enh_avd_pl'.
Server: Msg 137, Level 15, State 1, Procedure getChefer, Line 34
Must declare the variable '@enh_avd_pl'.

Use Personal
GO
IF OBJECT_ID('dbo.getChefer') IS NOT NULL
	DROP PROC dbo.getChefer
GO
CREATE PROCEDURE dbo.getChefer 

	@enhets_id int -- incoming parameter

AS

	declare @isAvdelning int -- store result from SP isAvdelningEnhet
	declare @enh_avd_sg varchar(60) -- enhet / avdelning (singular)
	declare @enh_avd_pl varchar(60) -- enheter / avdelningar (plural)
	declare @enh_avd_chef varchar(20) -- enhetschef / avdelningschef

EXECUTE @isAvdelning = isAvdelningEnhet

IF @isAvdelning = 1 -- ex 378
BEGIN
	SELECT @enh_avd_sg = 'avdelning'
	SELECT @enh_avd_pl = 'avdelningar' 
	SELECT @enh_avd_chef = 'avdelningschef'
END

ELSE IF @isAvdelning = 2 -- ex 561
BEGIN
	SELECT @enh_avd_sg = 'enhet'
	SELECT @enh_avd_pl = 'enheter'
	SELECT @enh_avd_chef = 'enhetschef'
END

-- selecting compete info about enhetschefer or avdelningar
SELECT per.id, per.e_namn, per.f_namn, per.telefon, @enh_avd_sg, chefstitel FROM personal per
INNER JOIN @enh_avd_pl ON @enh_avd_chef = per.id
WHERE id IN 
(
	SELECT @enh_avd_chef FROM @enh_avd_pl
	WHERE @enh_avd_chef IS NOT NULL
)
AND id = @enhets_id
ORDER BY per.e_namn
GO

Om det är annat som är galet i upplägget får ni gärna påpeka för jag har ingen känsla för det här.. :) Dessutom läste jag att när man kör EXEC i SP:n så drar det ner prestandan..? Eller är det vilket som om jag kör allt i en enda SP eller kan man dela upp det i några olika SP så att varje SQL sats är en egen SP och att det blir snabbare på så sätt...?

LarsGMedlem sedan dec. 200012 465 inlägg
#2
EXECUTE @isAvdelning = isAvdelningEnhet

Ovanstående förstår jag inte.

I stället för att försöka använda variabler som om de vore tabeller så tycker jag att du skulle göra

IF @isAvdelning = 1 -- ex 378
BEGIN
	-- selecting compete info about enhetschefer 
SELECT per.id, per.e_namn, per.f_namn, per.telefon, avdelning, chefstitel FROM personal per
INNER JOIN avdelningar ON avdelningschef = per.id
WHERE Id = @enhets_id
ORDER BY per.e_namn
end
else
begin -- enheter
SELECT per.id, per.e_namn, per.f_namn, per.telefon, enhet, chefstitel FROM personal per
INNER JOIN enheter ON enhetschef = per.id
WHERE Id = @enhets_id
ORDER BY per.e_namn
end

Personligen skulle jag lägga det i olika procedurer.

CokeLightMedlem sedan juni 2000506 inlägg
#3

a just det.. hehe.. det blev bra mycket kortare.. (jag hade tre st if/else if innan o tyckte det var bra med variabler o sen snöade jag mig in i den tankebanan :)

tack så mycket för hjälpen ! (jag skickar förresten in @enhets_id till isAvdelningEnhet..)

aha.. okay.. då kör jag med separata sp:s också.. :)

CokeLightMedlem sedan juni 2000506 inlägg
#4

Jag har ändrat lite i koden så att jag får en output parameter, men får då felmeddelande:

Error 141: a select statement that assigns a value to a variable must not be combined with data-retrieval operations

CREATE PROCEDURE dbo.getChefer 

	@enhets_id int, -- incoming parameter
	@chefsTitel varchar(30) OUTPUT

AS
	declare @isAvdelning int -- store result from SP isAvdelningEnhet

EXECUTE @isAvdelning = isAvdelningEnhet @enhets_id, @isAvdelning OUTPUT

IF @isAvdelning = 1 -- ex 378
	BEGIN
		SELECT per.id, per.e_namn, per.f_namn, per.telefon, avdelning, chefstitel FROM personal per
		INNER JOIN avdelningar ON avdelningschef = per.id
		WHERE id IN 
		(
			SELECT avdelningschef FROM avdelningar
			WHERE avdelningschef IS NOT NULL
		)
		AND id = @enhets_id
		ORDER BY per.e_namn
	END
ELSE 
	BEGIN
		SELECT per.id, per.e_namn, per.f_namn, per.telefon, enhet, @chefsTitel=chefsTitel FROM personal per
		INNER JOIN enheter ON enhetschef = per.id
		WHERE id IN 
		(
			SELECT enhetschef FROM enheter
			WHERE enhetschef IS NOT NULL
		)
		AND id = @enhets_id
		ORDER BY per.e_namn
	END
GO

sökte lite på Google och läste nåt om att man skulle dela upp query:n i två delar eller nåt men förstod inte hur de menade riktigt..?

LarsGMedlem sedan dec. 200012 465 inlägg
#5
SELECT per.id, per.e_namn, per.f_namn, per.telefon, enhet, @chefsTitel=chefsTitel FROM personal per

Så kan man inte göra nej. Varför vill du ha den som output parameter också?

CokeLightMedlem sedan juni 2000506 inlägg
#6

aha.. nä, okay.. hmm..

jo, jag har en konstig konstruktion eftersom jag inte fattar hur jag ska få ut värdena till separata <asp:Label> ? Det jag vill egentligen är att ha en tabell där det står t.ex:

Avdelningschef //<asp:Label>
--------------------
Efternamn Förnamn Telefon //<asp:Label>

Efternamn Förnamn Telefon //övriga anställda: <asp:Repeater>
Efternamn Förnamn Telefon // samma repeater
Efternamn Förnamn Telefon // samma repeater

Enhetschef//<asp:Label>
--------------------
Efternamn Förnamn Telefon //<asp:Label>

Efternamn Förnamn Telefon //övriga anställda: <asp:Repeater>
Efternamn Förnamn Telefon // samma repeater
Efternamn Förnamn Telefon // samma repeater

osv osv //avdelningschefs-/enhetschefs rubrikerna kommer slumpvis, annars hade jag kanske kunnat loopa igenom allt via samma repeater... jag har inte byggt databasen så jag kanske har missuppfattat hur det var tänkt att man skulle extrahera data därifrån... hade jag gjort det själv hade inte blivit så här tror jag..

När jag kör från repeater så binder jag data på ett annat sätt, och jag behöver inga output parametrar från SP:n... jag kan ju ha gjort fel, men jag kunde inte göra på samma sätt till <asp:Label> och tänkte att det skulle gå om jag körde explicit med output parametrar?

Om det hade fungerat med att få ut chefstitel hade jag sen plockat ut efternamn och förnamn etc på samma sätt från SP:n.

Databas klassen har en metod ska ge mig chefsnamn, titel, och telefonnummer, och den ser ut så här:

public string getEnhetsChef(string enhetsID, string spName, string outputParam)
{

   return param.Value.ToString();
}

Jag är inte så hemma på hur jag ska lägga upp det, så om det finns synpunkter på det får du/ni gärna kommentera.. :) fast det kanske hör hemma i asp.net forumet... tack för hjälpen jag fått hittils!

Genererad på 378 ms · cache AV · v20260730165559-full.f96bc7eb