Hej Om du absolut vill exekvera dynamisk SQL i proceduren ska du använda EXECUTE. Men jag hade gjort så här istället: Hej och tack för svaret! Ah, det är nu det börjar bli krångligt ser du.. Borde du inte kunna skriva: Vill du få med värden ut från din SP?Dynamisk SQL i Stored procedures
Har ett problem:
Jag skickar med ett antal parametrar in i en SP. Inne i den bygger jag upp en SQL-sats dynamiskt beroende på värdena som kommer in.
Problemet kommer när jag skall Exekverera denna SQL, jag vill komma åt värdet som returneras, men har inte lyckats ännu!!!
Typexempel:
Declare @SQL As VarChar(4000),
@Var1 As VarChar(10),
@Antal As Int
Set @SQL = 'Select Count(*) As Antal From tblTabell Where'
If @Var1 Is Null
Begin
Set @SQL = @SQL + ' fldField Is Null'
End
Else
Begin
Set @SQL = @SQL + ' fldField1 = ''' + @Var1 + ''''
End
Här kommer problemet, hur Exekverera denna SQL-sats så att jag får in antalet i @Antal??
Hoppas på hjälp!!
/JörgenSv: Dynamisk SQL i Stored procedures
If @Var1 Is Null
Begin
Select @antal = Count(*) From tblTabell Where fldField Is Null
End
Else
Begin
Select @antal = Count(*) From tblTabell Where fldField1 = @Var1
EndSv: Dynamisk SQL i Stored procedures
Nja, Exec har jag givetvis använt (skulle naturligtvis skrivit det också).
Problemet är att jag vill ha ut värdet från denna fråga i variabeln @Antal.
Hade det bara varit en variabel som skulle kontrolleras har jag hållit med dig, nu är det 10 stycken som kan vara null eller inte. Finns kanske ett mycket smidigare sätt att lösa detta, men jag har inte kommit på det ännu.
Jag vill alltså att det skall se ut så här ungefär:
Set @Antal = Exec @SQL
/JörgenSv: Dynamisk SQL i Stored procedures
För att uppnå det resultatet måste du köra med sp_executesql
Jag tar ett eget exempel här för att du lättare ska hänga med.
Låt oss säga att vi vill returnera en rowcount(*) med en dynamisk wherecluse.Det skulle kunna se ut såhär
<code>
if .. någoting
begin
@set minwhere= 'authors=nisse'
end
@set vSql = 'set @rows = select count(*) from tbl1 where' + @minwhere
EXEC sp_executesql @vSql, N'@rows int OUTPUT', @rows OUTPUT
</code>
Ser du att det är en set @rows inuti själva variabeln, det innebär att det finns en variabel att hämta från denna när vi exekverar den och det gör vi med.
- Det här ser aningen snurrigt ut men det den gör är att den talar om att vi vill hämta variabeln @rows och lagra den i en variabel som jag valt att döpa till samma namn.
Efter att du kört den så har du värdet från din dynamiska vSql-sträng i din "lokal" @rows eller vad man ska kalla det :)
/SimonSv: Dynamisk SQL i Stored procedures
<code>
Declare @Var1 As VarChar(10),
@Var2 As VarChar(10),
@Antal As Int
SET @Antal = (SELECT Count(*) As Antal FROM tblTabell Where ((fldField1 Is Null AND @Var1 Is Null) OR fldField1 = @Var1) AND ((fldField2 Is Null AND @Var2 Is Null) OR fldField2 = @Var2))
</code>
Vet inte om den kommer var bättre eller sämre en en dynamisk SQL sats.Sv: Dynamisk SQL i Stored procedures
Då måste du deklarera någon av dina inparametrar som "output",
eller ha en "return" sats som returnerar värdet.
//Håkan