【问题标题】:Assigning a value from a looped column name variable in a SELECT statement在 SELECT 语句中从循环列名变量中赋值
【发布时间】:2015-05-09 09:11:36
【问题描述】:

我很难尝试分配字段名称,然后将其放入 T SQL 中的 SELECT 语句中。首先 - 我想让 SELECT 语句在不弹出转换错误的情况下工作,然后我希望将字段值分配给另一个变量。我失败的代码如下。

DECLARE @lid integer
DECLARE @lrid integer
DECLARE @pct integer
DECLARE @rds integer
SET @lid = 4
SET @lrid = 46
SET @pct = 75
SET @rds = 4

DECLARE @c integer --SIMPLE COUNTER
DECLARE @sql nvarchar(999) --RAW SCORE FIELD
DECLARE @cpct float --CALCULATED PERCENT
DECLARE @scrt integer --TOP SCORE
DECLARE @scrf nvarchar(10) --RAW SCORE FIELD
DECLARE @scrr integer --ROUND RAW SCORE
DECLARE @scrs integer --SUMMED RAW SCORE

--SET VARIABLES
SET @cpct = @pct * .01
SET @scrt = (SELECT points FROM league WHERE id = @lid)

--LOOP THROUGH SCORES FROM 1 ON UP
SET @c = 1
SET @scrs = 0
WHILE (@c <= 30)
BEGIN
  SET @scrf = 'round' + CAST(@c AS nvarchar(2))
  SELECT @scrr =(SELECT @scrf FROM league_lineup WHERE id = @lrid)
  SET @scrs = @scrs+@scrr

  IF @c > @rds
    PRINT 'ROUND ' + CAST(@c AS nvarchar(3)) + ' - SCORE: ' + CAST(@scrs AS nvarchar(5))
  SET @c = @c + 1
END

...不起作用....

【问题讨论】:

    标签: tsql variables select local


    【解决方案1】:

    您的基本问题是,在 TSQL 中,永远不会评估数据,就好像它不是数据*。这意味着正在发生的事情类似于以下内容:

    SET @c = 25.48;
    SET @scrf = 'round' + CAST(@c AS nvarchar(2));
    

    @scrf 的值现在是 'round25.48'。这意味着:

    SELECT @scrr = (SELECT @scrf FROM league_lineup WHERE id = @lrid)
    

    相当于这个:

    SELECT @scrr =(SELECT 'round25.48' FROM league_lineup WHERE id = @lrid)
    

    这意味着您正在尝试将字符串 (nvarchar) 'round25.48' 分配给 @scrr,这是一个整数变量。所以你得到一个转换错误。

    你会想做更多类似的事情:

    SELECT @scrr = (SELECT ROUND(@c) FROM league_lineup WHERE id = @lrid);
    

    最后,小心 SQL 中的循环。您可能实际上并不需要它。


    *Data 可以像使用 EXEC() 等特殊函数的 SQL 一样进行评估,但这些都是例外。无论如何,数据必须作为一个完整的语句而不是一个片段来评估。

    【讨论】:

    • 我很抱歉培根...我的例子有点误导...我的例子中的“圆形”实际上并不意味着圆形任何东西...它是我的字段名称的一部分。 ..像'round1',“round2'等......你放的东西 - “也许”这就是问题吗?它实际上是在试图“圆”一些东西?
    • @Chris 在这种情况下,不,问题在于您将非数字数据分配给仅限数字的字段。你说DECLARE @scrr integer。除了在查询中的任何位置 -2^31 和 2^31-1 之间的数字之外,您不能为它分配任何东西。 @scrr 不能是整数,如果您合法地希望它被分配值 'round25.48'(使用我的值 @c)。
    • @Chris 我想你会进一步描述你想要完成的总体。发布您的整个查询、发布示例数据并发布您想要获得的结果。事实上,我基本上只是指出语法错误。
    • 谢谢 - 好的 - 我更新了代码 - 我试图获取(round1、round2 等)列的值并将它们相加。我知道我可以在查询中对它们求和 - 但我需要在每次增量时获取值。
    【解决方案2】:

    在这种情况下,您应该使用带输出参数的动态查询:

    改变

    SELECT @scrr =(SELECT @scrf FROM league_lineup WHERE id = @lrid)
    SET @scrs = @scrs+@scrr
    

    DECLARE @sql = 'SELECT @scrr = ' + @scrf + ' FROM league_lineup WHERE id = @lrid'    
    EXEC sp_executesql @sql, N'@scrr int OUTPUT, @lrid int', @scrr OUTPUT, @lrid    
    SET @scrs = @scrs+@scrr
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-13
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      • 2011-02-15
      • 1970-01-01
      相关资源
      最近更新 更多