我想用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
答案 0 :(得分:0)
现在是时候开始阅读文档和学习tsql语言了。你不能编写随机代码并期望它能够工作。当您遇到错误时,您应该学习如何诊断和调试代码。这与任何其他语言没有什么不同。
您的过程使用单个参数声明 - 该参数未命名为@cust。标量,数字类型的参数也不是 - 这是引擎解释你试图传递的文字“1”的方式。
您将参数声明为表类型 - 因此您需要声明并填充本地表类型变量,以便将指定的ID值传递给过程。既然你没有标明对前一个问题的答案,那么也许你应该考虑一下你在SO等公共论坛中的适当角色。如果您的问题得到了解答,那么您应该将其标记为此类问题。如果没有回答,那为什么要开始另一个线程?此外,采取已经做出的评论。游标是一个需要在尝试之前掌握基本tsql的主题。如果你掌握了基本的tsql,那么游标很少是适合使用的技术。
要回答您的跟进问题,请学习搜索互联网并找到自己的答案。几乎你可能遇到的每一个问题都已经在某个地方讨论过了。首先要看的是文档 - 通常有很好的例子。你如何使用用户定义的表类型?再次 - 转到documentation,其中有一个例子。