2015-09-30 18 views
5

Procedura FunctionX, Linia 345sztuczki jak wykonać ciąg wewnątrz funkcji w SQL Server

Nieprawidłowe użycie operatora bocznej dokonania „EXECUTE string” w funkcji.

otrzymuję powyższy błąd podczas wykonywania dynamicznych instrukcji wewnątrz funkcji w SQL Server 2012. Czy istnieje obejście tego? Jakieś sztuczki?

PS: Sproc (procedura przechowywana) jest o wiele za długa, aby jego ciało mogło zostać wstawione tak jak jest w funkcji.

DECLARE @execsql NVARCHAR(2000) 
Set @execsql = 'INSERT INTO @TABLE1 EXEC SPROC1 ' + @ID_COMPANY + ',' + @ID_COUNTRY 
exec (@execsql) 

Bardzo dziękuję z góry.

Muszę również móc usunąć wewnątrz funkcji. Wiem, że to jest sprzeczne z definicją funkcji, ale zastanawiam się, czy istnieją pewne sztuczki, które mogą być wykorzystane

+0

Najważniejsze pytanie brzmi: dlaczego uważasz, że musisz skorzystać z funkcji tutaj? Funkcja ma zwrócić pojedynczą wartość, nie jest to procedura składowana, którą właśnie opisujesz. –

Odpowiedz

6

Nie istnieją żadne sztuczki, zobacz The Curse and Blessings of Dynamic SQL

Dynamiczny SQL w funkcjach zdefiniowanych przez użytkownika

To bardzo proste: nie można używać dynamicznego SQL z użytych zdefiniowanych funkcji napisanych w T-SQL. Dzieje się tak dlatego, że nie wolno wykonywać żadnych czynności w UDF, które mogłyby zmienić stan bazy danych (ponieważ UDF może być wywołany jako część zapytania). Ponieważ możesz zrobić wszystko, od dynamicznego SQL, w tym aktualizacji, jest oczywiste, dlaczego dynamiczny kod SQL nie jest dozwolony .

Widziałem więcej niż jeden post na grupach dyskusyjnych, gdzie ludzie byli waląc głową w tym kierunku. Ale jeśli chcesz użyć dynamicznego SQL w UDF, wycofaj i ponów projekt. Udało Ci się trafić na blokadę drogową, a w SQL 2000 nie ma wyjścia.

W SQL 2005 i nowszych wersjach można zaimplementować funkcję jako CLR . Przypomnijmy, że cały dostęp do danych z CLR jest dynamicznym SQL. (Jesteś chroniony, więc jeśli wykonasz operację aktualizacji z swojej funkcji, zostaniesz złapany.) Słowo ostrzeżenia jednak: dane od skalarnych UDF często mogą powodować problemy z wydajnością. Jeśli mówisz

SELECT ... FROM tbl WHERE dbo.MyUdf (somecol) = @value

i MyUdf wykonuje dostęp do danych, masz więcej lub mniej stworzył ukrytą kursora.