【问题标题】:Cannot store result into variable SQL无法将结果存储到变量 SQL 中
【发布时间】:2014-06-26 10:15:41
【问题描述】:

今天有一个一般性问题。我试图将结果存储在一个变量中,但它不起作用。我不是想做任何花哨的事情,而是做一个简单的任务。见下文:

    declare @prizeid bigint;
    declare @today datetime;
    declare @dayOfMonth int;
    declare @year int;
    declare @month int;
    select @today = getdate();
    select @dayOfMonth = Day(@today);
    select @year = Year(@today);
    select @month = Month(@today);

    if @month = 1
    begin
        select @month = 12
        select @year = @year - 1
    end
    else select @month = @month - 1; 




declare @sqlQuery varchar(250);
declare @quantityForSnapShot bigint;
declare @filename varchar(25);

set @prizeid=31
set @filename = 'Prizes_' + REPLACE(STR(@month, 2, 0), ' ', '0') + '_' + ltrim(str(@year));

select @sqlQuery = 'select Quantity from ' + @filename +
' where PrizeID=' + convert(varchar,@prizeid)
EXEC @quantityForSnapShot=@sqlQuery
print @quantityForSnapShot

我真正想要的只是检索 Quantity 并将其存储在 var @quantityForSnapShot 中。

:-)

【问题讨论】:

标签: sql sql-server stored-procedures


【解决方案1】:
declare @prizeid bigint;
declare @today datetime;
declare @dayOfMonth int;
declare @year int;
declare @month int;
select @today = getdate();
select @dayOfMonth = Day(@today);
select @year = Year(@today);
select @month = Month(@today);

if (@month = 1)
    begin
        select @month = 12
        select @year = @year - 1
    end
else 
   begin
      select @month = @month - 1; 
   end

declare @sqlQuery nvarchar(MAX);  --<-- to be on safe side
declare @quantityForSnapShot bigint;
declare @filename varchar(25);

set @prizeid=31
set @filename = 'Prizes_' + REPLACE(STR(@month, 2, 0), ' ', '0') + '_' + ltrim(str(@year));

select @sqlQuery = N' select @quantityForSnapShot = Quantity ' +
                   N' from ' + QUOTENAME(@filename) +
                   N' where PrizeID = @prizeid'

EXECUTE sp_executesql @sqlQuery   
                     ,N'@prizeid bigint, @quantityForSnapShot bigint OUTPUT'  
                     ,@prizeid , @quantityForSnapShot OUTPUT

SELECT @quantityForSnapShot

您正在尝试调用此动态 sql,因为它是具有返回值的存储过程。您将需要使用 OUTPUT 参数从动态 sql 中检索 @quantityForSnapShot 变量的值。

我还使用 QUOTENAME 函数将方括号 [] 放在表名周围,以明确告诉 sql server 它是一个对象名。进入的一个好习惯,因为它可以保护您免受 Sql 注入攻击。

同样使用系统存储过程sp_executesql执行动态sql。

【讨论】:

  • 感谢您的帮助!
  • 没问题很高兴帮助:)
【解决方案2】:

试试这个..

开始转 声明@prizeid bigint; 声明@today 日期时间; 选择@today = getdate(); 声明@dayOfMonth int; 选择@dayOfMonth = 日(@today); 声明@year int; 选择@year = Year(@today); 声明@month int; 选择 @month = 月(@today); 如果@month = 1 开始 选择@month = 12 选择@year = @year - 1 结尾 否则选择@month = @month - 1; 声明@sqlQuery varchar(250); 声明@quantityForSnapShot bigint; 声明@filename varchar(25); 设置@prizeid=31 设置@filename = 'Prizes_' + REPLACE(STR(@month, 2, 0), ' ', '0') + '_' + ltrim(str(@year)); select @sqlQuery = '从'中选择数量' + @filename + ' where PrizeID=' + convert(varchar,@prizeid) 设置@quantityForSnapShot = @sqlQuery 创建表 #tmp(数量 bigint) 插入#tmp(数量) 执行(@sqlQuery) 设置@quantityForSnapShot =(从#tmp 中选择数量) 选择@quantityForSnapShot 打印@quantityForSnapShot 回滚传输

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 2021-04-24
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多