Sql server Msg 137,必须声明标量变量

Sql server Msg 137,必须声明标量变量,sql-server,Sql Server,这是投掷错误 味精137,第15级,第2状态,第1行 必须声明标量变量@Temp\u SKU 我不知道为什么会这样 请提供帮助。您将@Temp\u SKU添加到动态执行的字符串中。但是,sp_execute不知道您的上下文,并且没有对@TEMP_SKU的引用。通过删除引号,尝试向变量添加@Temp_SKU的值,而不是引用: Declare @SKUCode1 varchar(30), @SKUCode2 varchar(30), @SKUCode3 varchar(30), @S

这是投掷错误

味精137,第15级,第2状态,第1行 必须声明标量变量@Temp\u SKU

我不知道为什么会这样

请提供帮助。

您将@Temp\u SKU添加到动态执行的字符串中。但是,sp_execute不知道您的上下文,并且没有对@TEMP_SKU的引用。通过删除引号,尝试向变量添加@Temp_SKU的值,而不是引用:

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

尝试在调用sp_execute之前打印@sp1,以查看实际执行的内容。

您在动态查询中使用的是@Temp_SKU。启动动态查询时,您必须在动态查询的范围内声明它,我建议使用不同的名称:

 Set @sp1 = 'Set'+' '+ @SKUCodeS+CONVERT(varchar,@Index)+' '+'='+' '+ @Temp_SKU  
然而,你到底想做什么?看起来您正在尝试动态设置局部变量。在这种情况下,您必须使用以下内容:

Set @sp1 = 'Set'+' '+ @SKUCodeS+CONVERT(varchar,@Index)+' '+'='+' '+'@Temp_SKUDYN'  
Exec sp_executesql @sp1  N'@Temp_SKUDYN varchar(30)' @Temp_SKUDYN = @@Temp_SKU
抄袭

编辑

现在一点也不确定这是否是你的解决方案。你最好解释一下你到底想完成什么

编辑2

我仍然认为这可能更容易,但这至少更清楚,未经测试,可能需要一些工作:

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

好的,第一个任务-为每个变量分配适当的值,可以这样做:

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
它打印mno,这是应该的。我们还避免了任何讨厌的循环、动态SQL等


我不知道问题的下一部分现在是否容易解决。

变量是特定范围内的局部变量。Exec在新范围内运行代码。使用这些变量,您无法实现您在这里尝试执行的操作。您试图解决什么问题?这里还有其他问题-可能是因为您在发布之前简化了代码-但这也会引起危险信号-例如,选择设置@Temp_SKU似乎不以任何方式依赖于循环。如果只有一行匹配WHERE子句,那么在循环中这样做是多余的。如果有多行,则无法保证每次使用哪些行值来完成赋值。一行可以全部使用十次,但这并不能保证,而且可能不是期望的行为。@Damien_the_unsiever-我想获取参数@SKUCode1到@SKUCode10的值,在每次执行循环时,@Temp_SKU中的值应在@SKUCodeX中移动,其中X是我试图获取SKUCode1到SKUCode10的值的循环,获取这些值后,这些值将传递给机器控制器。这就是我使用动态查询的原因。我没有提到的一点是,Areaname='LMC-TYRE BUILDING'和MachineNumber=@IndexIn在您提供的解决方案中,我需要@LastnameOUT作为变量,其值应从@SKUCode1更改为@SKUCode10Yeah,我认为您应该能够使用第二个代码块。不过,我认为一定有更简单的办法。还不确定是什么,尽管你可以直接从UDA_订单转向。没有必要循环、使用动态SQL、使用临时表等等。@Damien_The_unsiver,哦,是的,看起来你是对的。陷入思考模式…谢谢…这是唯一有效的解决方案,之前我尝试的解决方案是不可能的,因为我试图将局部参数传递给全局参数。我试图节省代码的长度,但这是不可能的。
--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