用于实现计数的SQL函数

时间:2010-12-23 10:09:20

标签: sql-server

我正在使用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,而不是存储过程名,所以它不起作用。

等待帮助,提前谢谢。

伊莱恩

3 个答案:

答案 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查询返回值并将其存储在变量中。