Функция SQL Server (2000/2005) получает имя таблицы и имя поля в качестве параметров и возвращает результаты динамического запроса внутри функции. Результаты должны быть присвоены переменной Table, которая в дальнейшем будет использоваться в хранимой процедуре. Как этого добиться?
Я получаю сообщение об ошибке: «Из функции могут выполняться только функции и расширенные хранимые процедуры».
Declare @Data as table (FieldValue varchar(100))
insert into @Data select * from MyFunction ('Person.Address','AddressID')
-- Function
Alter function MyFunction (
@TableName varchar(100), @FieldName varchar(100)
) returns @GetData table (
FieldValue varchar(100)
) as
begin
Declare @SQL varchar(250)
Set @SQL = 'Select '+@FieldName+ ' from '+ @TableName
Exec sp_executesql @SQL
return
end
+1. @David: Он спрашивает, не надо отрицать, потому что он неправ.


Я не уверен, как это работает с функциями, но если у вас есть хранимая процедура, которая возвращает набор результатов, вы можете вставить его в переменную таблицы с помощью операторов INSERT EXEC.
INSERT @TableVariable
EXEC spYourProcedure
Пока поля совпадают, это будет работать. В противном случае вы можете использовать:
INSERT @TableVariable (FieldInSp1, FieldInSp2)
EXEC spYourProcedure
Таким образом вы можете передавать данные между хранимыми процедурами. См. Эту страницу на INSERT EXEC заявления для получения дополнительной информации.
Вы не можете использовать "exec" в пользовательской функции. UDF не должны иметь побочных эффектов.
просто замкнуть петлю ...
вот синтаксис для вызова функции и помещения этих результатов в табличную переменную
небольшая сборка на основе решения @simons
это работало на sql2012 и sql2014.
[не забудьте закрыть оператор таблицы. Достаточно легко сделать, если у вас есть таблица в одной строке. ]
declare @t table(field1 nvarchar(100) )
insert @t select * from dbo.Cool_1Field_Function( 'parm1' ,'parm2')
select * from @t
Это должен быть правильный ответ. Это единственный, который использует функцию, а не процедуру.
жаль, что вы не можете сделать: declare @t table(field1 nvarchar(100) ) = dbo.Cool_1Field_Function( 'parm1' ,'parm2')
@costa, добавь это в список «то, что было бы круто, если ...». У меня есть разумный список для sql :-)
-1. Не используйте таким образом динамический Sql. Обратитесь к sommarskog: sommarskog.se/dynamic_sql.html