如何使用 Table 值作为参数 运行 存储过程
How to Run a Stored Procedure using the Table Values as Parameters
我有一个用于将数据插入 table 的存储过程,它有 6 个参数
SP:
CREATE PROCEDURE [dbo].[sp_tb_mis_am_node]
@pid_code varchar(10),
@id_code varchar(10),
@description varchar(50),
@disp_order int, /*** This will serve as a display order sequence ***/
@username varchar(20),
@user_key int,
现在我想 运行 这个 SP 并使用我现有 table 中的值填充它的参数,并使用与列
相同的编号和名称
Table:
SELECT [pid_code]
,[id_code]
,[description]
,[disp_order]
,[username]
,[user_key]
FROM [webloan_helper].[dbo].[tbl_ledger_add]
我将如何执行它?
我正在使用 Microsoft SQL Server 2008 R2
创建过程ExecuteProc
作为
开始
声明@RowNumber INT; -- 行数 Table webloan_helper
SET @RowNumber = 1;
While (@RowNumber <= (SELECT COUNT(*) FROM webloan_helper))
Begin
Declare @pid_code varchar(10);
Declare @id_code varchar(10);
Declare @description varchar(50);
Declare @disp_order int;
Declare @username varchar(20);
Declare @user_key int;
Set @pid_code = (Select pid_code From (Select Row_Number() Over (Order By pid_code) As RowNum, * From webloan_helper) t2 Where RowNum = @RowNumber);
Set @id_code = (Select id_code From (Select Row_Number() Over (Order By pid_code) As RowNum, * From webloan_helper) t2 Where RowNum = @RowNumber);
Set @description = (Select [description] From (Select Row_Number() Over (Order By pid_code) As RowNum, * From webloan_helper) t2 Where RowNum = @RowNumber);
Set @disp_order = (Select disp_order From (Select Row_Number() Over (Order By pid_code) As RowNum, * From webloan_helper) t2 Where RowNum = @RowNumber);
Set @username = (Select username From (Select Row_Number() Over (Order By pid_code) As RowNum, * From webloan_helper) t2 Where RowNum = @RowNumber);
Set @user_key = (Select user_key From (Select Row_Number() Over (Order By pid_code) As RowNum, * From webloan_helper) t2 Where RowNum = @RowNumber);
Exec sp_tb_mis_am_node @pid_code,@id_code,@description,@disp_order,@username,@user_key;
-- Order By Should be unique column
SET @RowNumber= @RowNumber+ 1;
结束
结束
如果重写您的存储过程1,2 不在卡片上,也不会将正文合并到您当前的方法中2,那么你唯一真正的选择就是循环。
要循环,您可以使用 cursor 和 WHILE
,例如:
DECLARE @pid_code varchar(10)
DECLARE @id_code varchar(10)
DECLARE @description varchar(50)
DECLARE @disp_order int
DECLARE @username varchar(20)
DECLARE @user_key int
DECLARE boris cursor local fast_forward FOR SELECT [pid_code]
,[id_code]
,[description]
,[disp_order]
,[username]
,[user_key]
FROM [webloan_helper].[dbo].[tbl_ledger_add]
OPEN boris
FETCH NEXT FROM boris INTO @pid_code,@id_code,@description,
@disp_order,@username,@user_key
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC [sp_tb_mis_am_node] @pid_code,@id_code,@description,
@disp_order,@username,@user_key
FETCH NEXT FROM boris INTO @pid_code,@id_code,@description,
@disp_order,@username,@user_key
END
CLOSE boris
DEALLOCATE boris
1我将对当前程序进行一点重写 recommend, however:
Avoid the use of the sp_ prefix when naming procedures. This prefix is used by SQL Server to designate system procedures. Using the prefix can cause application code to break if there is a system procedure with the same name.
2在任何一种情况下,您都希望将它们重写为基于集合,而不是使用单行。对于存储过程实例的重写,这将意味着采用 table-valued parameter.
我有一个用于将数据插入 table 的存储过程,它有 6 个参数
SP:
CREATE PROCEDURE [dbo].[sp_tb_mis_am_node]
@pid_code varchar(10),
@id_code varchar(10),
@description varchar(50),
@disp_order int, /*** This will serve as a display order sequence ***/
@username varchar(20),
@user_key int,
现在我想 运行 这个 SP 并使用我现有 table 中的值填充它的参数,并使用与列
相同的编号和名称Table:
SELECT [pid_code]
,[id_code]
,[description]
,[disp_order]
,[username]
,[user_key]
FROM [webloan_helper].[dbo].[tbl_ledger_add]
我将如何执行它?
我正在使用 Microsoft SQL Server 2008 R2
创建过程ExecuteProc 作为 开始 声明@RowNumber INT; -- 行数 Table webloan_helper SET @RowNumber = 1;
While (@RowNumber <= (SELECT COUNT(*) FROM webloan_helper))
Begin
Declare @pid_code varchar(10);
Declare @id_code varchar(10);
Declare @description varchar(50);
Declare @disp_order int;
Declare @username varchar(20);
Declare @user_key int;
Set @pid_code = (Select pid_code From (Select Row_Number() Over (Order By pid_code) As RowNum, * From webloan_helper) t2 Where RowNum = @RowNumber);
Set @id_code = (Select id_code From (Select Row_Number() Over (Order By pid_code) As RowNum, * From webloan_helper) t2 Where RowNum = @RowNumber);
Set @description = (Select [description] From (Select Row_Number() Over (Order By pid_code) As RowNum, * From webloan_helper) t2 Where RowNum = @RowNumber);
Set @disp_order = (Select disp_order From (Select Row_Number() Over (Order By pid_code) As RowNum, * From webloan_helper) t2 Where RowNum = @RowNumber);
Set @username = (Select username From (Select Row_Number() Over (Order By pid_code) As RowNum, * From webloan_helper) t2 Where RowNum = @RowNumber);
Set @user_key = (Select user_key From (Select Row_Number() Over (Order By pid_code) As RowNum, * From webloan_helper) t2 Where RowNum = @RowNumber);
Exec sp_tb_mis_am_node @pid_code,@id_code,@description,@disp_order,@username,@user_key;
-- Order By Should be unique column
SET @RowNumber= @RowNumber+ 1; 结束
结束
如果重写您的存储过程1,2 不在卡片上,也不会将正文合并到您当前的方法中2,那么你唯一真正的选择就是循环。
要循环,您可以使用 cursor 和 WHILE
,例如:
DECLARE @pid_code varchar(10)
DECLARE @id_code varchar(10)
DECLARE @description varchar(50)
DECLARE @disp_order int
DECLARE @username varchar(20)
DECLARE @user_key int
DECLARE boris cursor local fast_forward FOR SELECT [pid_code]
,[id_code]
,[description]
,[disp_order]
,[username]
,[user_key]
FROM [webloan_helper].[dbo].[tbl_ledger_add]
OPEN boris
FETCH NEXT FROM boris INTO @pid_code,@id_code,@description,
@disp_order,@username,@user_key
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC [sp_tb_mis_am_node] @pid_code,@id_code,@description,
@disp_order,@username,@user_key
FETCH NEXT FROM boris INTO @pid_code,@id_code,@description,
@disp_order,@username,@user_key
END
CLOSE boris
DEALLOCATE boris
1我将对当前程序进行一点重写 recommend, however:
Avoid the use of the sp_ prefix when naming procedures. This prefix is used by SQL Server to designate system procedures. Using the prefix can cause application code to break if there is a system procedure with the same name.
2在任何一种情况下,您都希望将它们重写为基于集合,而不是使用单行。对于存储过程实例的重写,这将意味着采用 table-valued parameter.