使用CURSOR(第2部分)在存储过程中插入语句

时间:2018-03-13 04:05:49

标签: sql sql-server stored-procedures cursor

我想用INSERT语句中的游标编写这个存储过程。

当我EXEC InsertCustomers_Cursor @cust这个存储过程时,我收到此错误:

  

Msg 137,Level 15,State 2,Line 61
  必须声明标量变量“@cust”。

这意味着我需要声明@cust的标量变量,但是当我输入ID时,也无法运行查询。

EXEC InsertCustomers_Cursor @cust = 1;

执行此存储过程时,我仍然收到错误消息。

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 TYPE CustomerType AS TABLE
(
    cust_id int primary key,
    name varchar(100),
    country varchar(50)
);
GO

CREATE PROCEDURE InsertCustomers 
    @customers CustomerType READONLY
AS
BEGIN
    INSERT INTO customer
        SELECT * 
        FROM @customers
END
GO

CREATE PROCEDURE InsertCustomers_Cursor 
    @customers CustomerType READONLY
AS
BEGIN
    DECLARE @cust_id    int,
            @name       varchar(100),
            @country    varchar(50)

    --DECLARE AND SET COUNTER
    DECLARE @Counter INT
    SET @Counter = 1

    --DECLARE THE CURSOR FOR A QUERY
    DECLARE InsertCustomers CURSOR READ_ONLY
    FOR
    SELECT cust_id, name, country
    FROM @customers

    --OPEN CURSOR
    OPEN InsertCustomers

    --FETCH THE RECORD INTO THE VARIABLES
    FETCH NEXT FROM InsertCustomers
    INTO @cust_id, @name, @country

    --IF THE FETCH WAS SUCCESSFUL
    WHILE @@FETCH_STATUS = 0
    BEGIN
        INSERT INTO customer (cust_id, name, country) 
        VALUES (@cust_id, @name, @country)

        --ACCESS THE @customers ROWS ONE AT A TIME
        FETCH NEXT FROM InsertCustomers 
        INTO @cust_id, @name, @country
    END

        CLOSE InsertCustomers
        DEALLOCATE InsertCustomers
END
GO

DECLARE @cust CustomerType
INSERT INTO @cust values (7, 'Michael Labone', 'Indonesia');

--EXEC InsertCustomers_Cursor @cust
EXEC InsertCustomers_Cursor @cust

1 个答案:

答案 0 :(得分:0)

现在是时候开始阅读文档和学习tsql语言了。你不能编写随机代码并期望它能够工作。当您遇到错误时,您应该学习如何诊断和调试代码。这与任何其他语言没有什么不同。

您的过程使用单个参数声明 - 该参数未命名为@cust。标量,数字类型的参数也不是 - 这是引擎解释你试图传递的文字“1”的方式。

您将参数声明为表类型 - 因此您需要声明并填充本地表类型变量,以便将指定的ID值传递给过程。既然你没有标明对前一个问题的答案,那么也许你应该考虑一下你在SO等公共论坛中的适当角色。如果您的问题得到了解答,那么您应该将其标记为此类问题。如果没有回答,那为什么要开始另一个线程?此外,采取已经做出的评论。游标是一个需要在尝试之前掌握基本tsql的主题。如果你掌握了基本的tsql,那么游标很少是适合使用的技术。

要回答您的跟进问题,请学习搜索互联网并找到自己的答案。几乎你可能遇到的每一个问题都已经在某个地方讨论过了。首先要看的是文档 - 通常有很好的例子。你如何使用用户定义的表类型?再次 - 转到documentation,其中有一个例子。