Процедура ожидает параметр «@params» типа «ntext / nchar / nvarchar» SQL Server - PullRequest
0 голосов
/ 28 сентября 2019

У меня проблема с кодом в SQL Server.Ошибка:

Процедура ожидает параметр '@params' типа 'ntext / nchar / nvarchar'.

Мой код:

CREATE FUNCTION porcentajeCadaUno  -- Se ingresa las variables del procedimiento almacenado para calcular % --
    (@cantidad INT,
     @idEvento BIGINT)
RETURNS FLOAT
AS
BEGIN
    RETURN CAST((@cantidad) * 100 AS FLOAT) / 
           (SELECT (dbo.cuentaPersonasConEvento_Leidos(@idEvento))) 
END

CREATE PROCEDURE porcentajeCadaCampoTabla
    @nombreCampoTabla NVARCHAR(100),
    @idEvento BIGINT
AS
BEGIN
    DECLARE @stmt NVARCHAR(MAX), @params BIGINT

    SET @params = @idEvento

    SET @stmt = 'select [' +@nombreCampoTabla +'],count(['+@nombreCampoTabla+']), 
dbo.porcentajeCadaUno (count(['+@nombreCampoTabla+']),@params) from Invitado as inv inner join 
(select idInvitado from Invitado intersect select idInvitado_FK from Leido) as le on  le.idInvitado=inv.idInvitado
where inv.idEvento_FK=@params group by ['+@nombreCampoTabla+']'

    EXEC sp_executesql @stmt, @params
END

EXEC porcentajeCadaCampoTabla 'generoInvitado', 1

Я ожидаю, что в результате я получу таблицу с 3 столбцами, первый, имя переменных, второй (сколько) и третий процент.

1 Ответ

3 голосов
/ 28 сентября 2019

sp_executesql здесь нужно 3 параметра: оператор SQL, объявление параметра и значение параметра.Ниже приведен пример, где я добавил функцию QUOTENAME, чтобы убедиться, что идентификаторы правильно заключены и экранированы:

SET @stmt = 'select ' + QUOTENAME(@nombreCampoTabla) +',count('+QUOTENAME(@nombreCampoTabla)+'), 
dbo.porcentajeCadaUno (count(['+@nombreCampoTabla+']),@params) from Invitado as inv inner join 
(select idInvitado from Invitado intersect select idInvitado_FK from Leido) as le on  le.idInvitado=inv.idInvitado
where inv.idEvento_FK=@params group by '+QUOTENAME(@nombreCampoTabla)+';';

EXEC sp_executesql  @stmt, N'@params bigint', @params = @idEvento;
...