Sql server 如何从SQLServer2000中的用户定义函数调用存储过程
如何从SQL Server 2000中的用户定义函数调用存储过程您不能从函数调用常规存储过程-只能从其他函数或某些扩展存储过程调用。请参见此处以获取来自SQL 2005的详细信息。试图从UDF调用标准存储过程将导致以下错误 Msg 557,16级,状态2,第1行Sql server 如何从SQLServer2000中的用户定义函数调用存储过程,sql-server,Sql Server,如何从SQL Server 2000中的用户定义函数调用存储过程您不能从函数调用常规存储过程-只能从其他函数或某些扩展存储过程调用。请参见此处以获取来自SQL 2005的详细信息。试图从UDF调用标准存储过程将导致以下错误 Msg 557,16级,状态2,第1行 只有函数和一些扩展存储过程才能从函数中执行。您需要将存储过程修改为用户定义的函数,或者反过来 实现所需功能的一种简单方法是将exec语句放在批处理脚本中,并从函数中调用该批处理脚本。大概是这样的: create function <
只有函数和一些扩展存储过程才能从函数中执行。您需要将存储过程修改为用户定义的函数,或者反过来 实现所需功能的一种简单方法是将exec语句放在批处理脚本中,并从函数中调用该批处理脚本。大概是这样的:
create function <functionName>
exec master.sys.xp_cmpshell 'C:\storedProc.bat'
....
....
return @return
end
更多信息。我最近也遇到了类似的问题。事实上,错误消息的格式不正确,因为sp_executesql是一个扩展存储过程,您可以通过以下脚本进行检查: 选择objectpropertyobject_id'sp_executesql','IsExtendedProc' 返回1 因为即使是XP,我们也不能使用sp_executesql,所以我不得不通过使用sp_方法找到另一种解决方法。我的场景是如何根据场景中的一些条件null值动态查找表中的行数。使用sp_方法,我构建了以下函数:
IF object_id(N'dbo.fc_ContaRegistros_x_Criterio') is not null DROP FUNCTION [dbo].[fc_ContaRegistros_x_Criterio]
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
CREATE FUNCTION dbo.fc_ContaRegistros_x_Criterio (
@str_TBName VARCHAR(100),
@str_Criter VARCHAR(500)
)
RETURNS BIGINT
AS
BEGIN
-- Objetivo : Contar numero de registros de uma determinada tabela de acordo com o critério passado
-- Criação : Josué Monteiro Viana - 09/07/09
/*
Exemplo:
DECLARE @count INT
SET @count = dbo.fc_ContaRegistros_x_Criterio('master.dbo.sysobjects', '')
PRINT @count
SET @count = dbo.fc_ContaRegistros_x_Criterio('crk.dbo.acao', 'where cod_acao is null')
PRINT @count
*/
DECLARE
@int_objSQL INT,
@int_erros INT,
@int_objSelectCountResult INT,
@bint_SelectCount BIGINT,
@sql NVARCHAR(2000)
EXEC @int_erros = sp_OACreate 'SQLDMO.SQLServer', @int_objSQL OUTPUT
EXEC @int_erros = sp_OASetProperty @int_objSQL, 'LoginSecure', TRUE
EXEC @int_erros = sp_OAMethod @int_objSQL, 'Connect', null, '.'
--SET @sql = 'SELECT count(*) FROM ' + @str_TBName + ' WHERE ' + @str_Criter
SET @sql = 'SELECT count(*) FROM ' + @str_TBName + ' ' + @str_Criter
SET @sql = 'ExecuteWithResults("' + @sql + '")'
EXEC @int_erros = sp_OAMethod @int_objSQL, @sql, @int_objSelectCountResult OUTPUT
EXEC @int_erros = sp_OAMethod @int_objSelectCountResult, 'GetRangeString(1, 1)', @bint_SelectCount OUT
EXEC @int_erros = sp_OADestroy @int_objSQL
-- debug info: not valid inside a fc
--if @int_erros <> 0 EXEC sp_OAGetErrorInfo @int_objSQL else print 'ok'
if @int_erros <> 0 SET @bint_SelectCount = @int_erros
RETURN @bint_SelectCount
END
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
我知道你的情况有点不同,但我相信你可以用这个udf作为指导方针来帮助你
致以最良好的祝愿,
若苏埃·蒙泰罗·维亚纳