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_Recent并dbo.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:对存储过程进行了更改

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

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