SQL Server 在 SQL 函数中执行 (sp_executesql ) 命令

标签 sql sql-server stored-procedures sql-function

我在 SQL Server 中创建了一个函数来执行动态 SQL 查询并返回一个值。在 SQL 查询中调用函数时出现错误:

Only functions and some extended stored procedures can be executed from within a function

功能:(返回与@ModuleName关联的用户数量)

DECLARE @Query NVARCHAR(MAX)
DECLARE @Result int
DECLARE @UsersUsingModule AS NVARCHAR(99)

SET @Query = 'SELECT @UsersUsingModule = Count(UR.UserId) '+
        'FROM       '+@UserDBName+'.[dbo].[aspnet_UsersInRoles] AS UR '+
        'INNER JOIN '+@UserDBName+'.[dbo].[aspnet_Roles] AS R ON UR.RoleId = R.RoleId '+
        'INNER JOIN '+@UserDBName+'.[dbo].[aspnet_Users] AS U ON UR.UserId = U.UserId '+
        'WHERE      LOWER(RoleName) IN ( '+
            'SELECT LOWER([Role]) '+
            'FROM   ADMIN_ROLEACCESS '+
            'WHERE  LOWER(ModuleName) = LOWER(@ModuleName) '+
        ')'

        EXEC sp_executesql @Query, N'@ModuleName nvarchar(max), @UsersUsingModule INT OUTPUT', @ModuleName, @UsersUsingModule OUTPUT

SELECT @Result =  CAST(@UsersUsingModule as INT)
RETURN @Result

查询:

SELECT      
    M.ID as [ModuleID], M.ModuleName, CC.UserLicenses,
    dbo.fncRolesWithModule(M.ModuleName) AS [Roles],
    [dbo].[fncUsersUsingModule](M.ModuleName, 'USERS_Demo2016')
FROM        
    ADMIN_ClientsContracts as CC
INNER JOIN  
    ADMIN_Modules as M ON CC.ModuleID = M.ID
WHERE
    CC.Isactive = 1

如果有更好的方法请告诉我!

最佳答案

函数用于计算,类似于 SELECT 查询。您无法在函数内执行存储过程。在这种情况下,您尝试在函数内使用过程 sp_executesql ,这导致了此问题。

如果您想执行相同的步骤,您可以使用如下过程而不是函数。

CREATE PROCEDURE dbo.GetUserModule
@UserDBName NVARCHAR(50),
@ModuleName NVARCHAR(150)

AS

BEGIN

DECLARE @Query NVARCHAR(MAX)
DECLARE @Result int
DECLARE @UsersUsingModule AS NVARCHAR(99)

SET @Query = 'SELECT @UsersUsingModule = Count(UR.UserId) '+
        'FROM       '+@UserDBName+'.[dbo].[aspnet_UsersInRoles] AS UR '+
        'INNER JOIN '+@UserDBName+'.[dbo].[aspnet_Roles] AS R ON UR.RoleId = R.RoleId '+
        'INNER JOIN '+@UserDBName+'.[dbo].[aspnet_Users] AS U ON UR.UserId = U.UserId '+
        'WHERE      LOWER(RoleName) IN ( '+
            'SELECT LOWER([Role]) '+
            'FROM   ADMIN_ROLEACCESS '+
            'WHERE  LOWER(ModuleName) = LOWER(@ModuleName) '+
        ')'

        EXEC sp_executesql @Query, N'@ModuleName nvarchar(max), @UsersUsingModule INT OUTPUT'
                           , @ModuleName
                           , @UsersUsingModule OUTPUT

        SELECT @Result =  CAST(@UsersUsingModule as INT)
    RETURN @Result

END

关于SQL Server 在 SQL 函数中执行 (sp_executesql ) 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39262640/

相关文章:

sql - 我可以在 SQL Server Express 中进行开发以便稍后在完整的 SQL Server 中部署吗?

sql - 创建表时的条件输入

mysql - SQL 查询以获取结果集最后一行中所有列值的总和以及行总和(分组依据)

sql - 如何将行更新时间和行更新用户添加到表中?

php - 基于触发器和存储过程更新汇总表

php - 使用 PHP 如何从 mysql 检索多个日期范围并作为日期数组返回

sql - 使用c#在sql server 2012中存储日期和时间

sql - 如何通过逗号分隔将 2 行合并为一行?

sql-server-2008 - 使用另一个存储过程中的参数调用存储过程的正确语法

MySQL 过程检查记录是否在插入不工作之前存在