2013-03-02 21 views
14

Tworzę funkcję do wykonywania dynamicznego SQL i zwracania wartości. Otrzymuję "Tylko funkcje i niektóre rozszerzone procedury przechowywane mogą być wykonywane z poziomu funkcji." jako błąd.Wystąpił błąd podczas wykonywania dynamicznego sql w funkcji (SQL Server)?

Funkcja:

Create Function fn_GetPrePopValue(@paramterValue nvarchar(100)) 
returns int as 
begin 
declare @value nvarchar(500); 

Set @SQLString = 'Select Grant_Nr From Grant_Master where grant_id=' + @paramterValue 

exec sp_executesql 
     @query = @SQLString,  
     @value = @value output 

return @value 
end 

Wykonanie:

Select dbo.fn_GetPrePopValue('10002618') from Questions Where QuestionID=114 

oraz:

Select fn_GetPrePopValue('10002618') from Questions Where QuestionID=114 

Czy funkcja miano prawidłowo lub jest funkcja błędne?

Odpowiedz

7

Nie można używać dynamicznego SQL z funkcji ani wywoływać procedur przechowywanych w postaci .

Create proc GetPrePopValue(@paramterValue nvarchar(100)) 
as 
begin 
declare @value nvarchar(500), 
     @SQLString nvarchar(4000) 

Set @SQLString = 'Select @value = Grant_Nr From Grant_Master where grant_id = @paramterValue' 

exec sp_executesql @SQLString, N'@paramterValue nvarchar(100)', 
     @paramterValue, 
     @value = @value output 

return @value 
end 
+0

Dziękuję Alexandria, bardzo wdzięczna !!!!!!! – Chaka

+0

BTW, aby zapobiec iniekcji SQL użyj sp_executesql z parametrami –

0

Nie sądzę, że można użyć dynamicznego SQL z funkcji, ani nie myślę, że trzeba w twoim przypadku. Wygląda jak chcesz coś bliżej do tego:

Create Function dbo.fn_GetPrePopValue(@paramterValue nvarchar(100)) 
returns int as 
begin 
    declare @value int 
    declare @SQLString varchar(MAX) 

    Select @value=Grant_Nr From Grant_Master where [email protected] 

    return @value 
end 

SQL Fiddle Demo

Także, proszę sprawdzić typy danych, aby upewnić się, że jesteś pola są poprawne. Wydaje się dziwne, aby przekazać varcharowi identyfikator i zwrócić int dla drugiego pola. Tak czy inaczej, powinno to pomóc ci iść w dobrym kierunku.

1

Funkcje są ograniczone w zakresie ich wykorzystania, dzięki czemu można z nich korzystać w zapytaniu, nie tworząc przypadkowo czegoś, co mogłoby spowodować straszną wydajność. Używanie dynamicznych zapytań jest jedną z tych rzeczy, ponieważ spowoduje to planowanie zapytań dla każdego wykonania, a także sprawi, że funkcja nie będzie mogła być częścią planu kwerend.

Nie trzeba kwerendy dynamicznego w ogóle w tym przypadku, po prostu zwrócić wartość:

Create Function fn_GetPrePopValue(@paramterValue nvarchar(100)) 
returns int as 
begin 

return (select Grant_Nr From Grant_Master where grant_id = @paramterValue) 

end 
Powiązane problemy