2009-04-22 7 views
0

Ich übergebe Ansichtsname als Parameter in einer Tabellenwertfunktion, und ich möchte einige Daten aus dieser Ansicht abrufen, indem ich ein dynamisches SQL erstelle und es mit sp_executesql() ausführe. Wenn versuchen, die Funktion auszuführen, erhalte ich den Fehler: Nur Funktionen und erweiterte gespeicherte Prozeduren können innerhalb einer Funktion ausgeführt werden.Name der dynamischen Ansicht in Tabellenwertfunktion

DBMS: SQL Server 2005

alle Abhilfen?

set @SQLString = 
     N'select @Desc = Description from ' 
    + @TableName 
    + ' where Code = @Code;' 

execute sp_executesql @SQLString, 
    N'@Code nvarchar(500), 
     @Desc nvarchar(500) OUTPUT', 
     @Code = @Code, 
     @[email protected] OUTPUT; 

Antwort

1

Nun, Sie könnten das dynamische SQL in eine erweiterte gespeicherte Prozedur umbrechen. Das würde funktionieren, aber ich würde (stark) davon abraten, es zu tun.

SQL Server erfordert, dass benutzerdefinierte Funktionen deterministisch sind (mit Ausnahme der oben erwähnten erweiterten gespeicherten Prozeduren) - d. H. Die Ergebnisse der Funktion sollten aus den Eingabeparametern einheitlich vorhersagbar sein. Da gespeicherte Prozeduren von überall auf Daten zugreifen können, verwenden Sie Zufallszahlen usw., SQL Server lässt es nicht zu, sie in einer Funktion zu verwenden.

Es gibt andere Ansätze, die Sie verwenden können, z. B. das Vorauffüllen einer Tabellenvariablen mit Ihren Daten, das Ändern Ihres Schemas usw., die von Ihren Leistungsanforderungen und davon abhängen, wie Sie das Schema eingerichtet haben.

0

nicht, es sei denn Sie wie xp_cmdshell wie diese

etwas ein erweitertes proc eine Loopback-Abfrage tun möchten, indem Sie anrufen, ändern Sie Ihre Bedürfnisse

CREATE FUNCTION fnBla(@id int) 
RETURNS int 
AS 
BEGIN 
DECLARE @SQL varchar(500) 
SELECT @SQL='osql -S' [email protected]@servername +' -E -q "exec tempdb..prLog ''fnBla''"' 
EXEC master..xp_cmdshell @SQL 
RETURN @id 
END 

einfach zu passen, so dass Sie wissen, ich würde das nicht tun Auf diese Weise, da Sie eine Loopback-Abfrage erstellen und nicht den sichersten Code aus irgendeinem Grund ausführen, können Sie nicht ein Proc anstelle einer Funktion verwenden?

+0

Ich wollte Sie nicht ablehnen. (Erinnere dich nicht mal daran. Es muss ein Miss-Klick gewesen sein.) Es ist jetzt abgeschlossen. Das tut mir leid. – RMD

Verwandte Themen