【问题标题】:Using CURSOR when creating stored procedure to insert statement在创建存储过程以插入语句时使用 CURSOR
【发布时间】: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


【解决方案1】:

问题是您的 SP 不期望任何参数,而您将其称为传递参数

EXEC InsertCustomers_Cursor 7, 'Michael Labone', Indonesia

为了让它正常工作,你需要在SP中创建这些参数:

CREATE PROCEDURE InsertCustomers_Cursor
  @cust_id    int,
  @name       varchar(100),
  @country    varchar(50)
AS
BEGIN
  ...

并删除这部分:

DECLARE @cust_id    int,
        @name       varchar(100),
        @country    varchar(50)

可能有更优雅的方式来声明这些参数,但对于这个例子我认为就足够了。

【讨论】:

    猜你喜欢
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多