! Внутри этой функции можно вызывать только функции и расширенные хранимые процедуры.

mrakk

есть запрос
SELECT dbo.func1(id)
FROM table1
func1-это скалярная функция, которая возвращает nvarchar(100)func1 получает значение из хранимой процедуры таким образом
EXEC dbo.Get_Proc_Data @id_proc_data = @id_pr_data, @res = @outt OUTPUT
в итоге при выполнении запроса выдается ошибка "Внутри этой функции можно вызывать только функции и расширенные хранимые процедуры."Как я понимаю - это связано именно с EXEC. Вопрос, как это можно обойти при условии, что EXEC убирать нельзя
6 ответов

mrakk

EXEC убирать нельзя
Почему нельзя? Можно!Переделывайте процедуру в функцию и убирайте EXEC


mrakk

Из функции нельзя вызывать обычные процедуры.


mrakk

Почему нельзя? Можно!Переделывайте процедуру в функцию и убирайте EXEC
на самом деле нельзя, т.к. в функции есть вот такая штука :http://sql.ru/forum/actualthread.aspx?tid=744463а как вот такую штуку реализовать без EXEC - не могу себе представить


mrakk

на самом деле нельзя, т.к. в функции есть вот такая штука :http://sql.ru/forum/actualthread.aspx?tid=744463
Можно:
USE tempdb
GO
CREATE FUNCTION dbo.Test (
	@Param	Int
) RETURNS Int AS BEGIN
	DECLARE	@Name	VarChar(<b>50</b>)
	IF (@Param > <b>100</b>) BEGIN
		SELECT	 @Name	= 'dbo.T' + 'est'
			,@Param = @Param - <b>42</b>
		EXEC @Param = @Name @Param
	END
	RETURN @Param
END
GO
SELECT	 dbo.Test(<b>70</b>)
	,dbo.Test(<b>130</b>)
	,dbo.Test(<b>270</b>)
GO
DROP FUNCTION dbo.Test
GO


mrakk

Можно:
USE tempdb
GO
CREATE FUNCTION dbo.Test (
	@Param	Int
) RETURNS Int AS BEGIN
	DECLARE	@Name	VarChar(<b>50</b>)
	IF (@Param > <b>100</b>) BEGIN
		SELECT	 @Name	= 'dbo.T' + 'est'
			,@Param = @Param - <b>42</b>
		EXEC @Param = @Name @Param
	END
	RETURN @Param
END
GO
SELECT	 dbo.Test(<b>70</b>)
	,dbo.Test(<b>130</b>)
	,dbo.Test(<b>270</b>)
GO
DROP FUNCTION dbo.Test
GO
не подходит ( количество параметров и имя функции заранее неизвестно


mrakk

количество параметров и имя функции заранее неизвестно
Вы совеншенно неправильно выражаетесь.Абисняю:имя функции - в моём примере тоже неизвестно, её можно подавать извне.количество параметров - заведомо известно из sys.parametersУ вас динамика и это сложно реализовывать. Но всё равно можно для вашего случая в некоторых рамках:
USE tempdb
GO
CREATE FUNCTION [dbo].[fnCalcFunc] (
	@Params	XML	-- DOCUMENT (dbo.Schema)
) RETURNS VarChar(<b>250</b>) AS BEGIN
	DECLARE	 @Func		SysName
		,@Count		*******
		,@Param1	VarChar(<b>250</b>)
		,@Param2	VarChar(<b>250</b>)
	--	,@ParamN	VarChar(250)
		,@Result	VarChar(<b>250</b>)

	SELECT	 @Func		= F.X.value('@Name'	,'SysName')
		,@Count		= F.X.value('count(@*)'	,'*******') - <b>1</b>
		,@Param1	= F.X.value('@Param1','VarChar(250)')
		,@Param2	= F.X.value('@Param2','VarChar(250)')
	--	,@ParamN	= F.X.value('@ParamN','VarChar(250)')
	FROM	@Params.nodes('/Func')F(X)
	
	 IF (@Count = <b>0</b>) EXEC @Result = @Func
	ELSE IF (@Count = <b>1</b>) EXEC @Result = @Func @Param1
	ELSE IF (@Count = <b>2</b>) EXEC @Result = @Func @Param1, @Param2
--	ELSE IF (@Count = N) EXEC @Result = @Func @Param1, @Param2, @ParamN
	ELSE SET @Result = Convert(VarChar,<b>1</b>/<b>0</b>)

	RETURN @Result
END
GO
CREATE FUNCTION [dbo].[fnTest0] (
) RETURNS VarChar(<b>256</b>) AS BEGIN RETURN (
	SELECT	'Result from fnTest0'
) END
GO
CREATE FUNCTION [dbo].[fnTest2] (
	 @Name	VarChar(<b>50</b>)
	,@Value	Int
) RETURNS VarChar(<b>256</b>) AS BEGIN RETURN (
	SELECT	@Name + ': ' + Convert(VarChar,@Value)
)END
GO
SELECT	 dbo.fnCalcFunc('<Func Name="dbo.fnTest0" />')
	,dbo.fnCalcFunc('<Func Name="dbo.fnTest2" Param1="Приборы" Param2="300"/>')
GO
DROP FUNCTION dbo.fnTest2
DROP FUNCTION dbo.fnTest0
DROP FUNCTION dbo.fnCalcFunc
GO