---
title: "syntaxfel i SP + lite frågor.."
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/122163-syntaxfel-i-sp-lite-frågor"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "CokeLight"
published: "2005-02-10T14:58:58.000Z"
updated: "2005-02-12T07:58:56.000Z"
replies: 5
views: 351
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/122163-syntaxfel-i-sp-lite-frågor"
---

# syntaxfel i SP + lite frågor..

## #1 — CokeLight, 2005-02-10T14:58Z

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...?

Permalänk: https://www.webforum.nu/p/122163

## #2 — LarsG, 2005-02-10T15:29Z

```
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.

Permalänk: https://www.webforum.nu/p/1549849

## #3 — CokeLight, 2005-02-10T15:48Z

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å.. :)

Permalänk: https://www.webforum.nu/p/1549862

## #4 — CokeLight, 2005-02-11T16:19Z

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..?

Permalänk: https://www.webforum.nu/p/1550499

## #5 — LarsG, 2005-02-11T21:32Z

```
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å?

Permalänk: https://www.webforum.nu/p/1550674

## #6 — CokeLight, 2005-02-12T07:58Z

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!

Permalänk: https://www.webforum.nu/p/1550777

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/122163-syntaxfel-i-sp-lite-frågor
