【发布时间】:2018-08-20 19:17:26
【问题描述】:
我可以问一个关于 SQL Server 存储过程的问题吗?
基本上我创建了一个名为Customers 的表,并且我想在使用CURSOR 完成的存储过程中编写一个INSERT 语句。
当我执行我的 CREATE 存储过程应该没问题并且没有任何错误消息,并且当我使用 EXECUTE 语句执行存储过程时没有任何数据输入(7,Andy,Singapore)没有任何错误消息。
最后,当我将一些数据输入到 EXECUTE 存储过程中时,我收到了这个错误消息。
消息 8146,级别 16,状态 1,过程 InsertCustomers_Cursor,第 0 行 [批处理开始第 40 行]
过程 InsertCustomers_Cursor 没有提供参数和参数。
代码:
create table customer
(
cust_id int primary key,
name varchar(100),
country varchar(50)
);
insert into customer
values (1, 'John Hammond', 'United States'),
(2, 'Mudassar Khan', 'India'),
(3, 'Robert Tan', 'Singapore'),
(4, 'Dennis Rodman', 'Indonesia'),
(5, 'Michelle Chia', 'Indonesia'),
(6, null, null);
select *
from customer;
CREATE PROCEDURE InsertCustomers_Cursor
AS
BEGIN
DECLARE @cust_id int,
@name varchar(100),
@country varchar(50)
DECLARE @Counter INT
SET @Counter = 1
DECLARE @AllRecords TABLE
(
cust_id int,
name varchar(100),
country varchar(50)
)
DECLARE InsertCustomers CURSOR READ_ONLY
FOR
SELECT cust_id, name, country
FROM customer
OPEN InsertCustomers
FETCH NEXT FROM InsertCustomers INTO @cust_id, @name, @country
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO @AllRecords
VALUES (@cust_id, @name, @country)
FETCH NEXT FROM InsertCustomers INTO @cust_id, @name, @country
END
CLOSE InsertCustomers
DEALLOCATE InsertCustomers
END
GO
-- This EXEC statement cannot run the query
EXEC InsertCustomers_Cursor 7, 'Michael Labone', Indonesia
-- This EXEC statement can run the query and the results is to show how many are being affected
EXEC InsertCustomers
【问题讨论】:
-
语法有点奇怪。如果您有输入参数,则需要直接在
CREATE PROCEDURE之后进行本地参数在BEGIN之后进行。 -
你为什么首先在这里使用光标?使用循环是非常低效的,在这个例子中根本不需要循环。但目前还不清楚您要做什么。
标签: sql sql-server stored-procedures cursor