如何修复错误过程需要'ntext/nchar/nvarchar'类型的参数'@parameters'?

Tec*_*iac 9 sql sql-server stored-procedures asp-classic

我正在尝试使用存储过程来显示表的结果,以及相关的表或对数据库的最新更改.存储过程是:

set ANSI_NULLS ON
set NOCOUNT ON
set QUOTED_IDENTIFIER ON
go


ALTER PROCEDURE [dbo].[MKTG_Current]( @added smalldatetime OUTPUT, @named varchar(50) OUTPUT)
AS

DECLARE @pDate smalldatetime;
DECLARE @AIID int;
DECLARE @Table varchar(50);
DECLARE @Bork nvarchar(350);
SET @pDate = GETDATE()


SELECT @Table=[Table], @AIID=AIID, @added=date_added  FROM MKTG_Recent WHERE date_added > DATEDIFF(day, date_added, DATEADD(DD, 30, @pDate))
SET @named = @Table
SET @Bork = 'SELECT * FROM ' + QUOTENAME(@Table) + ' WHERE AIID= ' + cast(@AIID as varchar(100))

EXECUTE sp_executesql @Bork, @added OUTPUT, @named OUTPUT


SELECT @added, @named 
Run Code Online (Sandbox Code Playgroud)

除了select语句的结果之外,它应该返回项目.存储过程没有输入.存储过程在SQL Management Studio(2008)中编译正常,但页面返回错误:Microsoft OLE DB Provider for SQL Server错误'80040e14'

过程需要'ntext/nchar/nvarchar'类型的参数'@parameters'.index.asp,第61行

页面的第61行以粗体显示:

  dim Objrs, cmd
  set Objrs = Server.CreateObject("ADODB.RecordSet")
  set cmd = Server.CreateObject("ADODB.Command")
  set conn = Server.CreateObject("ADODB.Connection")
  conn.Open strConnect
  set cmd.ActiveConnection = conn
  cmd.CommandText="MKTG_Current"
  cmd.CommandType=adCmdStoredProc
  cmd.Parameters.Append cmd.CreateParameter("@added", 135, 2)
  cmd.Parameters.Append cmd.CreateParameter("@named", 200, 2, 50)
Line 61 **set Objrs = cmd.Execute**
  name_of_table = cmd.Parameters("@named")
  added = cmd.Parameters("@added")  
Run Code Online (Sandbox Code Playgroud)

我的印象是这是由SQL代码错误引起的,但我没有看到它.快速检查Objrs.state返回0,这意味着问题肯定在于SQL代码.对于我的生活,我无法确定为什么会产生这个错误.

小智 15

在这个答案中,我将尝试重新创建您在问题中提到的问题,并且还将解释我是如何解决这个问题的.

首先,让我们创建两个名为dbo.MKTG_Recentdbo.Table_1使用" 创建表脚本"部分下的脚本的.我根据我使用问题中提供的数据做出的一些假设创建了这些表.使用该脚本,该表dbo.MKTG_Recent将填充1条记录.

接下来,dbo.MKTG_Current使用" 创建存储过程脚本"部分下提供的脚本创建命名的存储过程.

如果,我们尝试使用EXEC命令执行存储过程,则会抛出EXEC MKTG_Current null, null错误消息Msg 214, Level 16, State 3, Procedure sp_executesql, Line 1 Procedure expects parameter '@parameters' of type 'ntext/nchar/nvarchar'..请参阅截图#1

在通过MSDN阅读有关sp_executesql过程的用法之后,我发现存储过程的第二个参数定义了输出参数的类型,它必须是Unicode字符串.因此,我通过前缀N来提供第二个参数作为Unicode字符串来修改存储过程.请参阅屏幕截图#2以了解存储过程更改.

屏幕截图#3显示了dbo.MKTG_Current进行更改后存储过程的输出.存储过程将产生两个输出.一个用于变量@Bork中的查询语句,它被传递给sp_executesql,另一个输出对应于显示OUTPUT变量的SELECT语句.

根据要求,我不确定您是否需要调用sp_executesql,您可以编写存储过程,如简化存储过程部分所示.我错了,因为我不完全理解这个要求.屏幕截图#4显示了简化存储过程的输出.SELECT语句不是必需的,因为值是通过OUTPUT参数传递的.我已经包含SELECT语句只显示查询输出.

希望这能指出你正确的方向.

创建表脚本:

CREATE TABLE [dbo].[MKTG_Recent](
    [Table] [varchar](40) NOT NULL,
    [AIID] [int] NOT NULL,
    [date_added] [datetime] NOT NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[Table_1](
    [AIID] [int] NOT NULL,
    [added] [smalldatetime] NOT NULL,
    [named] [varchar](50) NOT NULL
) ON [PRIMARY]
GO

INSERT INTO dbo.MKTG_Recent ([Table], AIID, date_added) 
VALUES ('Table_1', 1, '2011-08-01')
GO
Run Code Online (Sandbox Code Playgroud)

创建存储过程脚本:

SET ANSI_NULLS ON
SET NOCOUNT ON
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[MKTG_Current]
(       @added  SMALLDATETIME   OUTPUT
    ,   @named  VARCHAR(50)     OUTPUT
)
AS

DECLARE @pDate  SMALLDATETIME;
DECLARE @AIID   INT;
DECLARE @Table  VARCHAR(50);
DECLARE @Bork   NVARCHAR(350);

SET     @pDate  = GETDATE()

SELECT  @Table  = [Table]
    ,   @AIID   = AIID
    ,   @added  = date_added  
FROM    dbo.MKTG_Recent 
WHERE   date_added > DATEDIFF(day, date_added, DATEADD(DD, 30, @pDate))

SET @named  = @Table
SET @Bork   = ' SELECT  * 
                FROM    ' + QUOTENAME(@Table) + ' 
                WHERE   AIID= ' + CAST(@AIID AS VARCHAR(100))

EXECUTE sp_executesql   @Bork
                    ,   @added OUTPUT
                    ,   @named OUTPUT

SELECT  @added
    ,   @named 
GO    
Run Code Online (Sandbox Code Playgroud)

简化的存储过程:

SET ANSI_NULLS ON
SET NOCOUNT ON
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[MKTG_Current]
(       @added  SMALLDATETIME   OUTPUT
    ,   @named  VARCHAR(50)     OUTPUT
)
AS

DECLARE @Table  VARCHAR(50);

SELECT  @named  = [Table]
    ,   @added  = date_added  
FROM    dbo.MKTG_Recent 
WHERE   date_added > DATEDIFF(day, date_added, DATEADD(DD, 30, GETDATE()))

SELECT  @added AS added
    ,   @named AS named 
GO
Run Code Online (Sandbox Code Playgroud)

截图:

#1:显示错误消息的执行

错误信息

#2:对存储过程进行了更改

Modified_SP

#3:更改后的存储过程输出

Stored_procedure_output

#4:简化的存储过程输出

Simplified_stored_procedure_output