如何在 SQL 中循环用户定义的数据类型并将参数传递给过程
How to loop User Defined Data Types in SQL and pass parameters to Procedure
考虑我有以下用户定义的数据类型:
CREATE Type udt_MyType as Table(
@ID int,
@Name varchar(20),
@Address varchar(100)
)
假设我存储了如下过程:
CREATE PROCEDURE sp_MyProc (
@ID int,
@Name varchar(20),
@Address varchar(100)
)
----Some Execution----
现在我想通过在 udt_MyType 上循环来创建在 sp_MyProc 上方调用的新 Procdure
(***但没有对 sp_MyProc 做任何更改)
所以我想要如下内容:
CREATE Procedure sp_NewProc(
@udt as udt_MyType READONLY
)
AS
BEGIN
WHILE LOOP on @udt ----to get each row
BEGIN
exec sp_MyProc @udt.ID,@udt.Name,@udt.Address
NEXT
END
END
注意:我无权更改sp_MyProc
有没有可能实现sp_NewProc?我想在 UDT 上循环并将参数传递给过程?
使用游标代替 while 循环。
CREATE Procedure sp_NewProc(
@udt as udt_MyType READONLY
)
AS
BEGIN
DECLARE @ID int,
@Name varchar(20),
@Address varchar(100)
Declare cursor_A cursor
For Select * from @udt
Begin
OPEN cursor_A
FETCH NEXT FROM cursor_A INTO @ID, @Name, @Address;
WHILE @@FETCH_STATUS = 0
BEGIN
-- To DO Logic
exec sp_MyProc @ID,@Name,@Address
FETCH NEXT FROM cursor_A INTO @ID, @Name, @Address;
END;
CLOSE cursor_A;
DEALLOCATE cursor_A;
End;
End;
考虑我有以下用户定义的数据类型:
CREATE Type udt_MyType as Table(
@ID int,
@Name varchar(20),
@Address varchar(100)
)
假设我存储了如下过程:
CREATE PROCEDURE sp_MyProc (
@ID int,
@Name varchar(20),
@Address varchar(100)
)
----Some Execution----
现在我想通过在 udt_MyType 上循环来创建在 sp_MyProc 上方调用的新 Procdure (***但没有对 sp_MyProc 做任何更改) 所以我想要如下内容:
CREATE Procedure sp_NewProc(
@udt as udt_MyType READONLY
)
AS
BEGIN
WHILE LOOP on @udt ----to get each row
BEGIN
exec sp_MyProc @udt.ID,@udt.Name,@udt.Address
NEXT
END
END
注意:我无权更改sp_MyProc
有没有可能实现sp_NewProc?我想在 UDT 上循环并将参数传递给过程?
使用游标代替 while 循环。
CREATE Procedure sp_NewProc(
@udt as udt_MyType READONLY
)
AS
BEGIN
DECLARE @ID int,
@Name varchar(20),
@Address varchar(100)
Declare cursor_A cursor
For Select * from @udt
Begin
OPEN cursor_A
FETCH NEXT FROM cursor_A INTO @ID, @Name, @Address;
WHILE @@FETCH_STATUS = 0
BEGIN
-- To DO Logic
exec sp_MyProc @ID,@Name,@Address
FETCH NEXT FROM cursor_A INTO @ID, @Name, @Address;
END;
CLOSE cursor_A;
DEALLOCATE cursor_A;
End;
End;