CREATE PROCEDURE p_processDataFor @accountId
BEGIN
for each item in
(select * from Accounts where accountId = @accountId and isProcessed = 0)
BEGIN
CASE current row
WHEN has x Condition THEN
exec p_x <Pass all data of current row>
WHEN has y Condition THEN
exec p_y <Pass all data of current row>
WHEN has z Condition THEN
exec p_z <Pass all data of current row>
END
END
END
相关问题
- sql execution latency when assign to a variable
- What is the best way to cache a table from a (SQL)
- php PDO::FETCH_ASSOC doesnt detect select after ba
- Bulk update SQL Server C#
- SQL to Parse a Key-Value String
相关文章
- Entity Framework 4.3.1 failing to create (/open) a
- How to truncate seconds in TSQL?
- Code for inserting data into SQL Server database u
- SQL Server 2008 Change Data Capture, who made the
- Delete Every Alternate Row in SQL
- Linux based PHP install connecting to MsSQL Server
- SQL Azure Reset autoincrement
- How do we alias a Sql Server instance name used in
You cannot normally avoid looping since you are calling EXEC, which cannot be done as a SET-based operation; it has to be done one by one.
If you just want to avoid CURSOR in general, you can implement it using a WHILE loop.
Otherwise, another option is to use a SELECT + FOR XML statement which builds the EXEC statements as a single NVARCHAR(MAX) statement into a variable, then EXEC just that dynamic SQL.
Okay, this example only does the insert for condition X, but hopefully shows you the way you could proceed:
Val is my table containing rows to be dealt with (in your example, Accounts). T1 and T2 are two tables that are currently inserted into/updated by your
p_x
procedure.Just some sample data - I've got 3 rows, 2 of which match "condition x":
For your actual work, you'd want 3 copies of the above - one for each of x, y and z. If it's inside the same stored proc, you'd need to use a different name for the @Inter table. The merge statement is being slightly abused, because you can't use an OUTPUT clause that references other tables from an insert statement. But we're using that in order to capture the generated IDENTITY values from T1, along with the corresponding data that's going to be inserted into other tables.
So now we'll use the table variable
@Inter
for a further insert into T2, and to eventually update Val to indicate that the rows have been processed. If there's a chain of tables where you need to insert and grab identity values, you'd need to introduce more merge statements and table variables.And we get our results:
So we've performed all of our work for condition X, keeping the code set based throughout.