我正在使用SQL Server 2005,并希望用户定义的函数实现以下功能:
参数:@SQL varchar(max)
execute 'select count(1) from (' + @sql + ')'
并将结果作为整数返回。
这是虚拟代码>>
ALTER FUNCTION [dbo].udf_GetCountFromSQL ( @SQL VARCHAR(MAX) )
RETURNS INT
AS
BEGIN
DECLARE @returnValue INT
SET @SQL = 'SELECT COUNT(1) FROM (' + @SQL + ')'
EXEC @returnValue= @SQL
RETURN @returnValue ;
END
@SQL
这里是动态sql,而不是存储过程名,所以它不起作用。
等待帮助,提前谢谢。
伊莱恩
答案 0 :(得分:4)
您无法在用户定义的函数中执行动态SQL。 您需要将其更改为存储过程并使用sp_executesql将计数转换为变量 - 然后您可以将计数作为OUTPUT参数(或RETURN值,如果需要)传递。
CREATE PROCEDURE dbo.ExampleSproc(@SQL NVARCHAR(MAX), @RowCount INTEGER OUTPUT)
AS
BEGIN
SET @SQL = 'SELECT @RowCount = COUNT(1) FROM (' + @SQL + ') x'
EXECUTE sp_executesql @SQL, N'@RowCount INTEGER OUT', @RowCount OUT
END
然后这样打电话:
DECLARE @RowCount INTEGER
EXECUTE dbo.ExampleSproc '...Some SQL...', @RowCount OUTPUT
但是,你需要非常小心,因为你正在打开SQL注入攻击(如果@SQL包含一些狡猾的东西怎么办?)。
答案 1 :(得分:1)
出于兴趣,你为什么不只是
select @@rowcount
执行查询后?
答案 2 :(得分:0)
要调用动态SQL,您必须在参数周围使用parantheses:
EXEC (@SQL)
但是你不能在UDF中使用带副作用的语句,因此不可能执行动态SQL。
除此之外,它无法从动态SQL查询返回值并将其存储在变量中。