Я создал функцию в SQL Server для выполнения динамического SQL-запроса и возврата значения. Я получаю сообщение об ошибке при вызове функции в SQL запросе:Команда SQL Server execute (sp_executesql) в функции SQL
Только функции и некоторые расширенные хранимые процедуры могут быть выполнены из функции
Функции: (возвращает количество пользователей, связанные с @ModuleName)
DECLARE @Query NVARCHAR(MAX)
DECLARE @Result int
DECLARE @UsersUsingModule AS NVARCHAR(99)
SET @Query = 'SELECT @UsersUsingModule = Count(UR.UserId) '+
'FROM '[email protected]+'.[dbo].[aspnet_UsersInRoles] AS UR '+
'INNER JOIN '[email protected]+'.[dbo].[aspnet_Roles] AS R ON UR.RoleId = R.RoleId '+
'INNER JOIN '[email protected]+'.[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
Помогите мне, если есть лучший подход!
Посмотрите (http://stackoverflow.com/questions/15180561/getting-an-error-when-executing-a-dynamic-sql-within-a-function-sql-server» это'). Может помочь :) –