Reputation: 21
Declare @SKUCode1 varchar(30), @SKUCode2 varchar(30), @SKUCode3 varchar(30),
@SKUCode4 varchar(30), @SKUCode5 varchar(30), @SKUCode6 varchar(30),
@SKUCode7 varchar(30), @SKUCode7 varchar(30), @SKUCode8 varchar(30),
@SKUCode10 varchar(30), @Temp_SKU varchar(30), @SKUCodeS varchar(30),
@sp1 nvarchar(max),@Index int
Set @SKUCodeS = 'SKUCode'
Set @Index = 0
While @Index < 10
Begin
Set @Index = @Index + 1
Select @Temp_SKU = SKUCode
From dbo.UDA_Order
Where Areaname = 'LMC-TYRE BUILDING'
Set @sp1 = 'Set'+' '+ @SKUCodeS+CONVERT(varchar,@Index)+' '+'='+' '+'@Temp_SKU'
Exec sp_executesql @sp1
End
This is throwing error
Msg 137,Level 15, State 2, Line 1
Must declare the scalar variable "@Temp_SKU"
I have no clue why it is happening.
Please help.
Upvotes: 2
Views: 20454
Reputation: 15150
You're using @Temp_SKU in the dynamic query. When the dynamic query is fired you have to declare it in the scope of the dynamic query, I'd advise using a different name:
Set @sp1 = 'Set'+' '+ @SKUCodeS+CONVERT(varchar,@Index)+' '+'='+' '+'@Temp_SKUDYN'
Exec sp_executesql @sp1 N'@Temp_SKUDYN varchar(30)' @Temp_SKUDYN = @@Temp_SKU
However, what are you actually trying to do? It looks like you're trying to set a local variable dynamically. In that case you have to use something like:
DECLARE @SQLString NVARCHAR(500)
DECLARE @ParmDefinition NVARCHAR(500)
DECLARE @IntVariable INT
DECLARE @Lastlname varchar(30)
SET @SQLString = N'SELECT @LastlnameOUT = max(lname)
FROM pubs.dbo.employee WHERE job_lvl = @level'
SET @ParmDefinition = N'@level tinyint,
@LastlnameOUT varchar(30) OUTPUT'
SET @IntVariable = 35
EXECUTE sp_executesql
@SQLString,
@ParmDefinition,
@level = @IntVariable,
@LastlnameOUT=@Lastlname OUTPUT
SELECT @Lastlname
(Copied from here)
EDIT
Not at all sure now this will be a solution for you. Better you explain what exactly you are trying to accomplish.
EDIT 2
I still think it could be easier, but this is at least clearer (untested, may need some work):
Declare @SKUCode1 varchar(30), @SKUCode2 varchar(30), @SKUCode3 varchar(30),
@SKUCode4 varchar(30), @SKUCode5 varchar(30), @SKUCode6 varchar(30),
@SKUCode7 varchar(30), @SKUCode8 varchar(30), @SKUCode9 varchar(30),
@SKUCode10 varchar(30), @Temp_SKU varchar(30), @SKUCodeS varchar(30),
@sp1 nvarchar(max),@Index int
CREATE TABLE ##codes (i INT, Val VARCHAR(30))
;
Set @SKUCodeS = 'SKUCode'
Set @Index = 0
While @Index < 10
Begin
Set @Index = @Index + 1
Select @Temp_SKU = SKUCode
From dbo.UDA_Order
Where Areaname = 'LMC-TYRE BUILDING'
AND MachineNumber = @Index
Set @sp1 = 'insert into ##codes(i, Val) VALUES('+ @Index + ',' + @Temp_SKU + ' )'-- 'Set'+' '+ @SKUCodeS+CONVERT(varchar,@Index)+' '+'='+' '+'@Temp_SKU'
Exec sp_executesql @sp1
END
SELECT @SKUCode1 = 1
, @SKUCode2 = 2
, @SKUCode3 = 3
, @SKUCode4 = 4
, @SKUCode5 = 5
, @SKUCode6 = 6
, @SKUCode7 = 7
, @SKUCode8 = 8
, @SKUCode9 = 9
, @SKUCode10 = 10
FROM (
SELECT *
FROM ##codes AS C
PIVOT (
MAX(VAL)
FOR i IN ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10])
) p
) piv
DROP TABLE ##codes
Upvotes: 0
Reputation: 239794
Okay, so the first task - assign appropriate values to each variable, can be done like this:
--Sample data
declare @t table (SKUCode varchar(30) not null,MachineNo int not null)
insert into @t(SKUCode,MachineNo) values
('abc',1),
('def',2),
('ghi',3),
('jkl',4),
('mno',5),
('pqr',6),
('stu',7),
('vwx',8),
('uzA',9),
('BCD',10)
--Actual query
Declare @SKUCode1 varchar(30), @SKUCode2 varchar(30), @SKUCode3 varchar(30),
@SKUCode4 varchar(30), @SKUCode5 varchar(30), @SKUCode6 varchar(30),
@SKUCode7 varchar(30), @SKUCode8 varchar(30), @SKUCode9 varchar(30),
@SKUCode10 varchar(30)
select @SKUCode1 = [1], @SKUCode2 = [2], @SKUCode3 = [3],
@SKUCode4 = [4], @SKUCode5 = [5], @SKUCode6 = [6],
@SKUCode7 = [7], @SKUCode8 = [8], @SKUCode9 = [9],
@SKUCode10 = [10]
from (select * from @t pivot (MAX(SKUCode) for
MachineNo in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10])) u
where 1=1 --Areaname, couldn't be bothered to include it here
) t
select @SKUCode5
Which prints mno
, as it should. And we've avoided any nasty loops, dynamic SQL, etc.
Whether the next part of your problem is now easily solved, I don't know.
Upvotes: 1
Reputation: 1771
You add @Temp_SKU
to the string that gets executed dynamically. However, sp_execute is unaware of your context and doesn't have a reference to @TEMP_SKU
. Try adding the value of @Temp_SKU
in stead of a refecence to the variable by removing the quotes:
Set @sp1 = 'Set'+' '+ @SKUCodeS+CONVERT(varchar,@Index)+' '+'='+' '+ @Temp_SKU
Try print
ing @sp1
before the call to sp_execute
to see what actually gets executed.
Upvotes: 0