In my stored procedure I have multiple similar variables @V1
, @V2
... @V20
(let's say 20 of them) FETCHED from a record. How would I use dynamic SQL to make 20 calls to another stored procedure using those variables as parameters?
Of course @V[i]
syntax is incorrect, but it expresses the intent
fetch next from maincursor into @status, @V1, @V2, ...
while @i<21
begin
-- ??? execute sp_executesql 'SecondSP', '@myParam int', @myParam=@V[i]
-- or
-- ??? execute SecondSP @V[i]
set @i = @i+1
end
Using the CONCAT() function, we can work with user variables in LIKE clause.
The ARRAY function returns an ARRAY with one element for each row in a subquery. If subquery produces a SQL table, the table must have exactly one column. Each element in the output ARRAY is the value of the single column of a row in the table.
An array is an ordered set of elements of a single built-in data type. An array can have an associated user-defined array type, or it can be the result of an SQL operation that returns an array value without an associated user-defined array type.
As others have said, set up a temporary table, insert the values that you need into it. Then "iterate" through it executing the necessary SQL from those values. This will allow you to have 0 to MANY values to be executed, so you don't have to set up a variable for each.
The following is a complete sample of how you may go about doing that without cursors.
SET NOCOUNT ON
DECLARE @dict TABLE (
id INT IDENTITY(1,1), -- a unique identity column for reference later
value VARCHAR(50), -- your parameter value to be passed into the procedure
executed BIT -- BIT to mark a record as being executed later
)
-- INSERT YOUR VALUES INTO @dict HERE
-- Set executed to 0 (so that the execution process will pick it up later)
-- This may be a SELECT statement into another table in your database to load the values into @dict
INSERT @dict
SELECT 'V1Value', 0 UNION ALL
SELECT 'V2Value', 0
DECLARE @currentid INT
DECLARE @currentvalue VARCHAR(50)
WHILE EXISTS(SELECT * FROM @dict WHERE executed = 0)
BEGIN
-- Get the next record to execute
SELECT
TOP 1 @currentid = id
FROM @dict
WHERE executed = 0
-- Get the parameter value
SELECT @currentvalue = value
FROM @dict
WHERE id = @currentid
-- EXECUTE THE SQL HERE
--sp_executesql 'SecondSP', '@myParam int', @myParam =
PRINT 'SecondSP ' + '@myParam int ' + '@myParam = ' + @currentvalue
-- Mark record as having been executed
UPDATE d
SET executed = 1
FROM @dict d
WHERE id = @currentid
END
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With